我已经用过几次1dc2c转换,没有任何问题。具有N个网格点的变换的傅里叶系数的阶数为:f_0,f_1,f_2,…,f_N/2,f_N/2+1,…,f_1。
我只是不知道二维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的Fourier系数没有对称性。
最佳答案
fftw_plan_dft_r2c_2d
的输出不是double的STEP
数组。由于输入是实的,在Fourier空间中,相反的频率是共轭的
$X{N-k}=X_k^*$。(http://en.wikipedia.org/wiki/Fast_Fourier_transform)STEP
和fftw_c2r
考虑到这一点。只存储了一半的频率,减少了计算量。
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])
注意数组的大小:您也可以减少它并获得内存!
fftw_complex OUTT[STEPS][STEPS/2+1];
再见,
关于c - 2D R2C FFTW:傅立叶系数的阶数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23717086/