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