1

我已经多次使用 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) 作为测试输入信号。'a' 的选择方式是,信号将是正弦周期的整数倍(无泄漏效应)。我对 x 和 y 的傅立叶系数没有对称性感到特别惊讶。

4

2 回答 2

0

的输出fftw_plan_dft_r2c_2d不是双精度数组。由于输入是实数,在傅里叶空间中,相反的频率是共轭的 $X_{Nk} = X_k^*$。(http://en.wikipedia.org/wiki/Fast_Fourier_transformSTEPSTEP

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];

再见,

于 2014-05-18T09:21:18.227 回答
0

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

于 2019-05-29T20:33:35.337 回答