我已经多次使用 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 的傅里叶系数没有对称性。
fftw_plan_dft_r2c_2d
的输出不是由STEP
组成的STEP
双精度数组。由于输入是实数,在傅里叶空间中,相反的频率是共轭的
$X_{N-k} = X_k^*$。 (http://en.wikipedia.org/wiki/Fast_Fourier_transform)
fftw_c2r
和 fftw_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];
OUT 数组在逆变换例程中使用时会被修改,因此您必须在执行此操作之前对其进行检查。波数作为当时的文档。