C++ FFTW库注意事项

项目场景:

在C++中使用FFTW库对高维数组进行快速傅里叶变换。


问题描述

对矩阵做FFT和iFFT后,无法得到原矩阵


原因分析:

  1. FFTW库的逆傅里叶变换FFTW_BACKWARD得到的结果未进行归一化,因此需要对结果进行/N的操作
  2. 使用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);
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值