zoukankan      html  css  js  c++  java
  • DDFT

    得知DIP文章4日

           傅立叶变换数学原理将可能完全被引入,下仅仅实现代码。观察下结果,公式在上一篇博客中已经描写叙述

            上代码:

    //
    //  main.c
    //  Fourer2D
    //
    //  Created by 谭升 on 14/11/17.
    //  Copyright (c) 2014年 谭升. All rights reserved.
    //
    
    #include <stdio.h>
    #include <math.h>
    #include <time.h>
    #include <stdlib.h>
    #define VALUE_MAX 255
    #define WIDTH 5
    #define HEIGHT 5
    
    struct Complex_{
        double real;
        double imagin;
    };
    typedef struct Complex_ Complex;
    
    
    int Initdata(double (*src)[WIDTH],int size_w,int size_h){
        srand((int)time(0));
        for(int i=0;i<size_w;i++){
            for(int j=0;j<size_h;j++){
                src[i][j]=rand()%VALUE_MAX;
                printf("%lf ",src[i][j]);
            }
            printf(";
    ");
        }
        return 0;
    }
    int DFT2D(double (*src)[WIDTH],Complex (*dst)[WIDTH],int size_w,int size_h){
        for(int u=0;u<size_w;u++){
            for(int v=0;v<size_h;v++){
                double real=0.0;
                double imagin=0.0;
                for(int i=0;i<size_w;i++){
                    for(int j=0;j<size_h;j++){
                        double I=src[i][j];
                        double x=M_PI*2*((double)i*u/(double)size_w+(double)j*v/(double)size_h);
                        real+=cos(x)*I;
                        imagin+=-sin(x)*I;
                    
                    }
                }
                dst[u][v].real=real;
                dst[u][v].imagin=imagin;
                if(imagin>=0)
                    printf("%lf+%lfj ",real,imagin);
                else
                    printf("%lf%lfj ",real,imagin);
            }
            printf(";
    ");
        }
        return 0;
    }
    int IDFT2D(Complex (*src)[WIDTH],Complex (*dst)[WIDTH],int size_w,int size_h){
        for(int i=0;i<size_w;i++){
            for(int j=0;j<size_h;j++){
                double real=0.0;
                double imagin=0.0;
                for(int u=0;u<size_w;u++){
                    for(int v=0;v<size_h;v++){
                        double R=src[u][v].real;
                        double I=src[u][v].imagin;
                        double x=M_PI*2*((double)i*u/(double)size_w+(double)j*v/(double)size_h);
                        real+=R*cos(x)-I*sin(x);
                        imagin+=I*cos(x)+R*sin(x);
                        
                    }
                }
                dst[i][j].real=(1./(size_w*size_h))*real;
                dst[i][j].imagin=(1./(size_w*size_h))*imagin;
                if(imagin>=0)
                    printf("%lf+%lfj ",dst[i][j].real,dst[i][j].imagin);
                else
                    printf("%lf%lfj ",dst[i][j].real,dst[i][j].imagin);
            }
            printf(";
    ");
        }
        return 0;
    }
    
    
    int main() {
        double src[WIDTH][HEIGHT];
        Complex dst[WIDTH][HEIGHT];
        Complex dst_[WIDTH][HEIGHT];
        Initdata(src, WIDTH, HEIGHT);
        printf("
    
    ");
        DFT2D(src,dst,WIDTH,HEIGHT);
        printf("
    
    ");
        IDFT2D(dst,dst_,WIDTH,HEIGHT);
    }
    

           因为仅仅是为了观察结果。所以使用了固定大小的二维数组,若实际工作中应该依据须要动态分配内存。例如以下结果:上面为原始数据,中间为DFT后的数据。最以下为IDFT后的结果。


    版权声明:本文博主原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    设计模式(二十三)—— 模板方法
    设计模式(二十二)—— 策略模式
    设计模式(二十一)—— 状态模式
    设计模式(二十)—— 观察者模式
    设计模式(十九)—— 备忘录模式
    设计模式(十八)—— 中介者模式
    设计模式(十七)—— 迭代器模式
    设计模式(十六)—— 解释器模式
    设计模式(十五)—— 命令模式
    设计模式(十四)—— 职责链模式
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4758215.html
Copyright © 2011-2022 走看看