使用FFTW的fftw_plan_dft_c2r_1d()由于未归一化结果错误的解决方案
2016-05-28 16:14
465 查看
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 测试
测试成功相关文章推荐
- 消息通道looper
- Android权限适配方案(API 4+)
- 面试问题
- HELLO WORLD!
- Hadoop数据读写原理
- reflect(反射)
- getter-setter方法/点语法
- 文字转换为二进制/十六进制(Uncode编码 java实现)
- 查看CentOS系统版本是32位的还是64位的
- 关于C++的类的几点注意点
- Android中更安全的使用AsyncTask
- js数据类型
- Systemd 进程管理相关
- 软件研发的安全过程之一
- 对Spring的IoC和DI最生动的解释
- Activity生命周期
- Ubuntu系统的安装
- ACM ubuntu环境配置
- 评分组件
- java.lang.NoClassDefFoundError: com/opensymphony/xwork2/util/TextUtils