最近使用到DFT,自己编写DFT计算效率极低,故选择使用高效的FFTW库,同时测试自己使用编写C语言DFT,MATLAB脚本DFT与FFTW库耗时对比。(代码太乱,就不贴代码了,有疑问可以留言探讨)
1. FFTW库耗时对比:
在C++中调用FFTW库耗时在6~4ms区间波动(图2),其中统计时间使用time.h中clock()函数。
此方法是借用另外一位网友的博客https://www.cnblogs.com/zillyrex/p/11802833.html
图1 使用自己编写的DFT函数,计算10000点DFT耗时
2. 自己编写DFT耗时测试
在C++中测试手动编写查表法DFT计算10000点耗时7~8s左右(图1),此计算方法就是两个for嵌套循环计算,正余弦是查表;
图2 使用FFTW 32位库double类型,计算10000点DFT耗时
图3 使用MATLAB FFT函数计算结果与调用FFTW库计算结果对比
3. MATLAB 脚本使用自己编写矩阵计算DFT耗时测试:
在MATLAB脚本中自己编写矩阵运算1000点DFT(注意是1000点,正余弦是查表)耗时160~200ms,当计算10000点时计算时间过长,同时内存爆满,不便测试。
图3
4.MATLAB使用FFT()函数耗时测试:
调用matlab的FFT()函数计算10000点DFT耗时不足0.3ms;
图4
5.matlab FFT()函数与c++调用FFTW库结果对比
对比matlab计算结果显示两者输出相差远小于0.0001(两者计算结果均为7.917)。其中MATLAB使用的是FFT()函数,但是数据长度为10000,未指定数据长度时应该是以DFT进行计算的。具体见下图3,其中红色表示MATLAB 计算结果,蓝色表示C语言调用库计算结果。(据matlab介绍,matlab中的FFT也是使用FFTW库计算)。
图5
6.总结
从耗时来看,matlab中调用fft()函数计算最快,然后是c++中调用FFTW库;自己在C++中写DFT可以使用但运行时间较长,自己写DFT在matlab中耗时最多,甚至点数较多时(10000点)内存爆满,计算时间过长(大于1分钟);测试仅供参考,运行耗时受程序写法,保留精度,包含程序的范围,计算机的性能及当前的处理器负载等等诸多因素影响。