我一直在到处寻找(最好是)C# 中的示例快速傅立叶变换实现/教程。
但是,我发现的每个人都无法解释正在发生的事情,和/或评论不佳;或者他们假设您已经知道 FFT 算法,或者他们是关于如何使用 FFT 的教程。
有人知道一个好的示例/教程吗?
抱歉缺少超链接,我无权添加它们:(
你在这里要求两件事
1) FFT的解释
非常简短:
如果要获得信号的频域表示,请使用傅里叶变换,这是一种数学变换,可将信号从时域变换到频域。在对数字信号进行操作时,我们有一组离散样本,因此我们必须使用离散傅里叶变换或 DFT。然而,这是一个相当慢的操作并且很容易优化,所以我们改为使用快速傅里叶变换算法或 FFT。
这是一个很大的信号处理主题,所以我建议你找一本信号处理书籍作为参考。我建议“数字信号处理:一种实用的方法”。当然还有无处不在的维基百科文章。
2) FFT 的实现
由于 FFT 平台和语言的高度优化特性通常具有特定的实现,因此您应该检查标题和文档(通常会在“音频”部分中找到)以防它包含在标准库中。
如果您想自己实现该算法,我建议您找到一份 Numerical Recipes 的副本,其中包含有关 FFT 的一整章,以及有关“傅立叶和光谱应用”的一章。有据可查的伪代码,应该很容易转录成任何语言。
对于第三方解决方案,一个流行的选择是 FFTW,一个 C 库。我在谷歌搜索“FFT 库”将为您提供一些替代方案。
请参阅 sourceforge 上的 Kissfft。它缺乏一点 FFTW 的速度,但弥补了它的小尺寸和可读性。sourceforge 上还有一个关于推导的 pdf 文件——如果你想理解它,就需要它。
http://www.cmlab.csie.ntu.edu.tw/cml/dsp/training/coding/transform/fft.html (是的,我发现这很有用,但字体和布局很糟糕。我希望它只是我的浏览器很奇怪)
数字运算的旧标准书:数字食谱,可能有足够的解释。
如果你能找到一份副本,Hal Chamberlin 于 1983 年出版的《微处理器的音乐应用》(?)可能有一部分 FFT - 可惜我的副本现在正在工作,所以我无法专门查看这本书以了解 FFT 智慧。但我确实学习了许多音频滤波、采样等基础知识,并且有很多关于傅立叶变换及其用途的材料。
这是另一个用 C 编写的。
http://www.archelon.com/fft.html
另外,你能把你的问题说得更具体一些吗?例如,您想将 DFT 与 FFT 进行比较吗?您是否对 FFT 的速度如此之快感兴趣?
如果我没记错的话,DFT 类似于 N^2 次乘法,而 FFT 大约是 N log N 次乘法,其中 N 是信号中的样本数。
问题在于将您的“好”一词解释为两种完全不同的事物。
快速的现代优化 FFT,例如 FFTW,对于解释正在发生的事情几乎没有用处。与基本的 FFT 算法相比,大部分代码通常是与编译器提示、流水线、并行性、缓存阻塞等有关的性能优化。
而 FFT 代码的一个很好的短(半页或更少的代码)递归示例可能看起来与 FFT 的(干净优雅的短)教科书推导之一的摘要完全相同,但与 FFTW 相比,它非常慢并且使用更多内存(或矢量化 pffft 等)。