我已经多次使用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的傅立叶系数没有对称性。
答案 0 :(得分:0)
fftw_plan_dft_r2c_2d
的输出不是STEP
个STEP
数组的double。由于输入是真实的,在傅立叶空间中,相反的频率是共轭的
$ 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];
再见,
答案 1 :(得分:0)
在逆变换例程中使用OUT数组时会对其进行修改,因此您必须先进行检查。波数则作为文档。