项目场景:
在C++中使用FFTW库对高维数组进行快速傅里叶变换。
问题描述
对矩阵做FFT和iFFT后,无法得到原矩阵
原因分析:
- FFTW库的逆傅里叶变换FFTW_BACKWARD得到的结果未进行归一化,因此需要对结果进行/N的操作
- 使用FFTW库试,所有的初始化放在一起,所有的制定计划放在一起,所有的执行放在一起,不要拆开
解决方案:
将原本3D的数组以1D形式存储,初始化为fftw_complex格式。 这里以22*2的3D数组为例:
fftw_complex* in = (fftw_complex *)fftw_malloc(sizeof(fftw_complex)*2*2*2);
fftw_complex* out1 = (fftw_complex *)fftw_malloc(sizeof(fftw_complex)*2*2*2);
fftw_complex* out2 = (fftw_complex *)fftw_malloc(sizeof(fftw_complex)*2*2*2);
制定FFT计划。 注意:这一步一定要在给in赋初值之前!!
fftw_plan p1 = fftw_plan_dft_3d(2,2,2, in, out1, -1, FFTW_MEASURE);//-1为FFT
fftw_plan p2 = fftw_plan_dft_3d(2,2,2, out1, out2, 1, FFTW_MEASURE);//1为iFFT
赋初值
for (int i=0; i<2*2*2;i++)
{
in[i][0] = i;
in[i][1] = 0;
}
执行FFT和iFFT
fftw_execute(p1);
fftw_execute(p2);
对iFFT结果做归一化,并打印检查
for (int i=0; i<2*2*2;i++)
{
out2[i][0] = out2[i][0]/(2*2*2);
out2[i][1] = out2[i][1]/(2*2*2);
printf("%5.5lf %5.5lf\n",out2[i][0],out2[i][1]);
}
释放内存
fftw_free(in);
fftw_free(out1);
fftw_free(out2);
fftw_destroy_plan(p1);
fftw_destroy_plan(p2);