Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ FFT与DFT有何不同?如何在C++;?_C++_Fft - Fatal编程技术网

C++ FFT与DFT有何不同?如何在C++;?

C++ FFT与DFT有何不同?如何在C++;?,c++,fft,C++,Fft,经过一些研究,我创建了一个小应用程序,可以根据一些输入计算DFT(离散傅立叶变换)。它工作得很好,但速度很慢 我读到FFT(快速傅立叶变换)允许更快的计算,但它们有什么不同?更重要的是,我将如何在C++中实现它们?< p>如果您不需要手动实现该算法,可以查看 甚至认为它是在C中开发的,它正式地在C++(来自)中工作 问题2.9。我可以打电话到FFTW吗 C++?< /P> 非常肯定。FFTW应该编译 和/或任何C++编译器下的链接。 此外,很可能是C++。 模板类是 与FFTW兼容的位 复数格式

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


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

< p>如果您不需要手动实现该算法,可以查看

甚至认为它是在C中开发的,它正式地在C++(来自)

中工作 问题2.9。我可以打电话到FFTW吗 C++?< /P> 非常肯定。FFTW应该编译 和/或任何C++编译器下的链接。 此外,很可能是C++。 模板类是 与FFTW兼容的位 复数格式(参见FFTW 手册了解更多详细信息)


我已经找到了这个很好的解释,并描述了一些算法

关于执行

  • 首先,我要确保您的实现返回正确的结果(比较matlab或octave的输出,它们内置了傅里叶变换)
  • 如有必要,请使用探查器进行优化
  • 不要对循环使用不必要的内容
与具有n^2的DFT相比,FFT具有n*log(n)的竞争性

有很多关于这方面的文献,我强烈建议你先检查一下,因为如此广泛的话题在这里无法完全解释。 (检查外部链接)

例如,如果您需要图书馆,我建议您使用现有的图书馆。 该库有效地实现了FFT,并且还用于PropriareTry软件(例如MATLAB)

Steven Smith的书,特别是,它在解释我所能解释的两种变换方面做得更好

顺便说一句,整本书是免费的(上面的链接),它是信号处理的一个很好的介绍


<关于C++代码请求,我只使用了最快的傅立叶变换在西部(已经被SuxEXL引用)或DSP库,例如来自TI或模拟设备的。

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

我找到的最好、最可读的出版物(我现在仍然提到的那本)是E Oran Brigham的。前几章对傅里叶变换的连续和离散形式进行了非常全面的概述。然后,他利用这一点开发了基于基-2(n是2的幂)和混合基情况的DFT的快速版本(尽管后者比前者稍浅一些)


基数2算法中的一种基本方法,对输入X执行线性时间运算,递归地将结果分成两半,并对两半执行类似的线性时间运算。混合基数的情况类似,但每次都需要将X分成相等的部分,因此如果n没有任何大的素数因子,这会很有帮助。

FFT只是指快速计算DFT的算法的一种方式;也就是说,FFT算法的结果应与仅根据定义计算DFT的结果相同(或非常接近)。FFT只能在长度为2的幂的样本上计算,DFT没有此类限制。我没有在任何人的回答中看到这一点,但这是你需要知道的,我认为没有必要单独回答。嗯。。。你提到的图书馆非商业用途需要收费。啊,对不起,我不知道这是商业用途。那样的话,你可以试试。这将使用BSD许可证