2D R2C FFTW:傅里叶系数的阶数

时间:2014-05-17 23:24:08

标签: c 2d fftw coefficients

我已经多次使用1D c2c变换,没有任何问题。具有N个网格点的变换的傅立叶系数的阶数为:f_0,f_1,f_2,...,f_N / 2,f_-N / 2 + 1,....,f_-1。

我无法弄清楚2D R2C FFTW系数的顺序。 我使用以下代码。使用2D_r2c,规范化然后使用2D_c2r产生原始输入,因此不应该有错误。

void mFFTW2D(double INPUT[][STEPS], fftw_complex OUTPUT[][STEPS]){
    fftw_plan my_PLAN = fftw_plan_dft_r2c_2d(STEPS, 
                        STEPS,
                        *INPUT,
                        *OUTPUT,
                        FFTW_ESTIMATE);
    fftw_execute(my_PLAN);
    fftw_destroy_plan(my_PLAN);
}

void mIFFTW2D(fftw_complex INPUT[][STEPS], double OUTPUT[][STEPS]){
    fftw_plan my_PLAN = fftw_plan_dft_c2r_2d(STEPS,
                        STEPS,
                        *INPUT,
                        *OUTPUT,
                        FFTW_ESTIMATE);
    fftw_execute(my_PLAN);
    fftw_destroy_plan(my_PLAN);
    D2Norm(OUTPUT); //properly normalized: STEPS^-2
}

double INN[STEPS][STEPS];
fftw_complex OUTT[STEPS][STEPS];

// read in signal in INN
mFFTW2D(INN, OUTT);
// what is the order of the fourier coefficients in OUTT?
mIFFTW2D(OUTT, INN);

我使用f(x,y)= sin(ax)* sin(ay)作为测试输入信号。 '一个'选择的方式是信号是正弦的一个周期的整数倍(没有泄漏效应)。我特别惊讶的是x和y的傅立叶系数没有对称性。

2 个答案:

答案 0 :(得分:0)

fftw_plan_dft_r2c_2d的输出不是STEPSTEP数组的double。由于输入是真实的,在傅立叶空间中,相反的频率是共轭的    $ X_ {N-k} = X_k ^ * $。 (http://en.wikipedia.org/wiki/Fast_Fourier_transform

fftw_c2rfftw_r2c考虑到了这一点。只存储了一半的频率并减少了计算。

http://www.fftw.org/fftw3_doc/Real_002ddata-DFT-Array-Format.html#Real_002ddata-DFT-Array-Format

因此,您可能更喜欢使用类似的东西(如果有效):

  mFFTW2D(double INPUT[][STEPS], fftw_complex OUTPUT[][STEPS/2+1])

观察数组OUTT的大小:您也可以减少它并获得内存!

 fftw_complex OUTT[STEPS][STEPS/2+1];

再见,

答案 1 :(得分:0)

在逆变换例程中使用OUT数组时会对其进行修改,因此您必须先进行检查。波数则作为文档。