使用FFTW3做二维DFT的示例代码

刚才重新用fftw3写了个helloword,经测试结果正确。代码如下:

fftw_test.c

#include <fftw3.h>
#include 
<stdio.h>

#define N 3
#define ELEM(r,c) (r*N+c)

int showresult(fftw_complex* in, fftw_complex* out)
{
    
int i, j;
    printf(
"In:\n");
    
for (i=0; i<N; i++) {
        
for (j=0; j<N; j++) {
            printf(
"%lf\t", in[ELEM(i, j)][0]);
        }

        printf(
"\n");
    }

    printf(
"Out:\n");
    
for (i=0; i<N; i++) {
        
for (j=0; j<N; j++) {
            printf(
"%lf\t", out[ELEM(i, j)][0]);
        }

        printf(
"\n");
    }

    
return 1;
}


int main()
{
    fftw_complex 
*in, *out;
    fftw_plan p;
    
int i, j;

    
// 分配存储空间
    in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N * N);
    
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N * N);


    
// 设置变换计划
    p = fftw_plan_dft_2d(N, N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);


    
// 设置测试数据
    for (i=0; i<N; i++) {
        
for (j=0; j<N; j++) {
            
in[ELEM(i, j)][0] = 1;
            
in[ELEM(i, j)][1] = 0;
        }

    }

    
in[ELEM(1, 2)][0] = 5;
    
in[ELEM(2, 2)][0] = 3;

    
// 执行变换
    fftw_execute(p); /* repeat as needed */

    
// 显示测试结果
    showresult(in, out);

    
// 释放内存
    fftw_destroy_plan(p);
    fftw_free(
in);
    fftw_free(
out);

    
return 1;
}

makefile文件:

all: fft_test

fft_test: fft_test.c
    gcc -o fft_test fft_test.c -lfftw3

clean:
    rm -f fft_test

输出结果:

In:
1.000000    1.000000    1.000000    
1.000000    1.000000    5.000000    
1.000000    1.000000    3.000000    
Out:
15.000000    -3.000000    -3.000000    
-
3.000000    3.000000    0.000000    
-
3.000000    0.000000    3.000000    

posted @ 2008-05-03 14:34  jimbo  阅读(2762)  评论(0)    收藏  举报