FFT与DFT有何不同?如何在C ++中实现它们?

时间:2010-04-03 22:29:53

标签: c++ fft

经过一番研究,我创建了一个小应用程序,可以根据某些输入计算DFT(离散傅立叶变换)。它运作良好,但速度很慢。

我读到FFT(快速傅里叶变换)允许更快的计算,但它们有何不同?更重要的是,我将如何在C ++中实现它们?

5 个答案:

答案 0 :(得分:4)

如果您不需要手动实施算法,可以查看Fastest Fourier Transform in the West

即使认为它是用C语言开发的,它也可以在C ++中正式使用(来自FAQ

  

问题2.9。我可以打电话给FFTW吗?   C ++?

     

绝对是最好的。 FFTW应该编译   和/或任何C ++编译器下的链接。   而且,很可能是C ++    模板类是   与FFTW位兼容   复数格式(参见FFTW   手册了解更多详情)。

答案 1 :(得分:3)

与具有n ^ 2的DFT相比,FFT具有n * log(n)复杂度。

关于这方面有很多文献,我强烈建议你先检查一下,因为这个广泛的话题不能在这里完整解释。 http://en.wikipedia.org/wiki/Fast_Fourier_transform(查看外部链接)

如果您需要库,我建议您使用现有的库。 http://www.fftw.org/ 该库有效地实现了FFT,也用于propariaretery软件(例如MATLAB)

答案 2 :(得分:1)

史蒂芬史密斯的书The Scientist and Engineer's Guide to Digital Signal Processing,特别是Chapter 8 on the DFTChapter 12 on the FFT,在解释我曾经做过的两次变革方面做得更好。

顺便说一句,整本书都是免费提供的(上面的链接),这是对信号处理的非常好的介绍。

关于C ++代码请求,我只使用了西方最快的傅立叶变换(已经被superexsl引用)或DSP库(如TI或ADI公司的那些)。

答案 3 :(得分:1)

正确实现的DFT的结果与正确实现的FFT的结果基本相同(它们仅通过舍入误差而不同)。正如其他人在此指出的那样,主要区别在于性能。 DFT具有O(n ^ 2)个运算,而FFT具有O(nlogn)运算。

我所见过的最好,最具可读性的出版物(我仍然提到的出版物)是E Oran Brigham的The Fast Fourier Transform and its Applications。前几章提供了傅立叶变换的连续和离散形式的非常全面的概述。然后,他使用它来开发DFT的快速版本,基于Cooley-Tukey Algorithm的基数-2(n是2的幂)和混合基数的情况(尽管后者比前者更为浅薄的论文) )。

radix-2算法中的基本方法,用于对输入X执行线性时间操作,并递归地将结果分成两半,并在两半上执行类似的线性时间操作。混合基数情况类似,但每次需要将X分成相等的部分,因此如果n没有任何大的素因子,它会有所帮助。

答案 4 :(得分:0)

我已经用一些算法找到了这个很好的解释。

FastFourierTransform

关于实施,

  • 首先我要确保你的实现返回正确的结果(比较matlab或octave的输出 - 它们内置了傅立叶变换)
  • 必要时进行优化,使用分析器
  • 不要使用不必要的循环