使用FFTW的fftw_plan_dft_c2r_1d()由于未归一化结果错误的解决方案

1 致谢

感谢congwulong网友的博文
链接如下:http://blog.csdn.net/congwulong/article/details/7576012
congwulong网友的这篇文章写得很好 虽然很大一部分是转载的
但是加入了自己的修改和补充 尤其对于我关于fftw_plan_dft_c2r_1d()问题的解决起到了很大的帮助
在此表示感谢

2 问题描述

今天又在继续FFTW的编程 今天编程时遇到了一个很奇怪的问题
让我思考了很久 我使用了FFTW中的fftw_plan_dft_r2c_1d()和fftw_plan_dft_c2r_1d()分别进行正反变换来进行计算
初步整体测试的时候结果一直不正确 后来我就进行了一下单元测试
单元测试的时候我是这样进行的 令输入实数组f = [1 2 … i+1 …]
然后直接使用上面的这两个函数 进行正反变换
以验证这两个函数的正确性 后来发现结果如下


其中result111是对比数据 这里不作叙述
其中result222才是测试的结果
按照设想来说 f经过正反变换之后应当会还原为原来的序列
但是这里并没有显示出与f相同的数值 让人感到十分奇怪
根据观察之后 发现这里的数值是有规律的分别是[1*8192 2*8192 … (i+1)*8192 …]
这让我想到了以前学习连续时间变换FFT时说到的归一化十分相似 因为这里我们的帧长就是8192*2 = 16384
所以我猜测可能跟fftw_plan_dft_c2r_1d()函数的性质有关
于是我就百度了一下 找到上面的博文

3 解决方案

直接用Ctrl+F搜索了一下“归一化”的关键字之后 看到这样的内容


看到这里我就明白了 果然是因为没有归一化的原因
所以最后得到的序列还需要进行归一化的处理 
这里通过以上的测试可以看出 
单序列正反变换的归一化处理时:除以N/2

4 测试

测试成功

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: fftw_plan_dft_r2c_1d是一个函数,用于创建一个实向复的一维傅里叶变换计划。它的函数原型为: ``` fftw_plan fftw_plan_dft_r2c_1d(int n, double *in, fftw_complex *out, unsigned flags); ``` 其中,n表示输入数组的长度,in表示指向输入实数组的指针,out表示指向输出复数数组的指针,flags表示变换的选项。该函数返回一个fftw_plan对象,用于执行实向复的一维傅里叶变换。 需要注意的是,该函数要求输入数组in的长度必须是偶数,且输出数组out的长度为n/2+1。此外,该函数还支持多线程计算,可以通过设置FFTW_MEASURE或FFTW_ESTIMATE标志来选择计算方式。 ### 回答2: fftw_plan_dft_r2c_1d是一个作者为计算一维实向量到一维复数向量的离散傅里叶变换(DFT)的快速算法(FFT)所提供的函数。该函数通过使用混洗计算序列的方法,能够对实数数据进行快速的离散傅里叶变换。 在fftw_plan_dft_r2c_1d函数中,输入数据是一个一维实向量,输出则是一个长度为N/2+1的一维复数向量。这里的N表示输入实向量的长度。函数首先根据输入实向量的长度申请所需的空间,然后进行相关计算,并将结果存储在输出复数向量中。 fftw_plan_dft_r2c_1d函数的使用需要预先安装FFTW库,并在代码中包含相应的头文件。使用该函数时,需要先创建一个FFTW计划(plan),即通过fftw_plan_dft_r2c_1d函数创建一个用于DFT计算的实例。计划创建后,便可以通过调用fftw_execute函数来执行计算,将实向量转换为复数向量。计算完成后,再通过访问输出向量中的元素来获取结果。 fftw_plan_dft_r2c_1d函数在数值计算领域得到广泛的应用。它的设计充分考虑了效率和实用性,通过使用优化算法和避免重复计算等手段,能够显著提高计算速度和准确性。同时,由于函数所需的输入和输出都是标准的一维实向量和复数向量,因此用户可以方便地在自己的代码中使用该函数进行离散傅里叶变换的计算,以满足不同应用领域的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值