6

我一直在到处寻找(最好是)C# 中的示例快速傅立叶变换实现/教程。

但是,我发现的每个人都无法解释正在发生的事情,和/或评论不佳;或者他们假设您已经知道 FFT 算法,或者他们是关于如何使用 FFT 的教程。

有人知道一个好的示例/教程吗?

4

9 回答 9

6

抱歉缺少超链接,我无权添加它们:(

你在这里要求两件事

1) FFT的解释

非常简短:

如果要获得信号的频域表示,请使用傅里叶变换,这是一种数学变换,可将信号从时域变换到频域。在对数字信号进行操作时,我们有一组离散样本,因此我们必须使用离散傅里叶变换或 DFT。然而,这是一个相当慢的操作并且很容易优化,所以我们改为使用快速傅里叶变换算法或 FFT。

这是一个很大的信号处理主题,所以我建议你找一本信号处理书籍作为参考。我建议“数字信号处理:一种实用的方法”。当然还有无处不在的维基百科文章。

2) FFT 的实现

由于 FFT 平台和语言的高度优化特性通常具有特定的实现,因此您应该检查标题和文档(通常会在“音频”部分中找到)以防它包含在标准库中。

如果您想自己实现该算法,我建议您找到一份 Numerical Recipes 的副本,其中包含有关 FFT 的一整章,以及有关“傅立叶和光谱应用”的一章。有据可查的伪代码,应该很容易转录成任何语言。

对于第三方解决方案,一个流行的选择是 FFTW,一个 C 库。我在谷歌搜索“FFT 库”将为您提供一些替代方案。

于 2009-05-29T10:44:06.307 回答
3

请参阅 sourceforge 上的 Kissfft。它缺乏一点 FFTW 的速度,但弥补了它的小尺寸和可读性。sourceforge 上还有一个关于推导的 pdf 文件——如果你想理解它,就需要它。

于 2009-08-13T00:30:46.403 回答
1

维基百科对 FFT 有很好的描述:http ://en.wikipedia.org/wiki/Fft 。

就实现而言,FFTW 是我用过的最快的,但是代码非常难以理解,因为它经过了疯狂的优化。有大量指向基本 FFT 实现的链接,包括 C# 中的大量链接;谷歌是你的朋友。

于 2008-12-26T06:16:07.267 回答
1

http://www.cmlab.csie.ntu.edu.tw/cml/dsp/training/coding/transform/fft.html (是的,我发现这很有用,但字体和布局很糟糕。我希望它只是我的浏览器很奇怪)

于 2008-12-26T06:55:54.127 回答
1

数字运算的旧标准书:数字食谱,可能有足够的解释。

于 2008-12-26T06:57:51.050 回答
1

如果你能找到一份副本,Hal Chamberlin 于 1983 年出版的《微处理器的音乐应用》(?)可能有一部分 FFT - 可惜我的副本现在正在工作,所以我无法专门查看这本书以了解 FFT 智慧。但我确实学习了许多音频滤波、采样等基础知识,并且有很多关于傅立叶变换及其用途的材料。

于 2008-12-26T07:19:44.970 回答
1

谷歌出现了一些:

建议使用 FFTW 库作为快速 FFT 的解决方案。

于 2008-12-26T05:09:20.537 回答
1

这是另一个用 C 编写的。

http://www.archelon.com/fft.html

另外,你能把你的问题说得更具体一些吗?例如,您想将 DFT 与 FFT 进行比较吗?您是否对 FFT 的速度如此之快感兴趣?

如果我没记错的话,DFT 类似于 N^2 次乘法,而 FFT 大约是 N log N 次乘法,其中 N 是信号中的样本数。

于 2008-12-26T05:46:56.763 回答
1

问题在于将您的“好”一词解释为两种完全不同的事物。

快速的现代优化 FFT,例如 FFTW,对于解释正在发生的事情几乎没有用处。与基本的 FFT 算法相比,大部分代码通常是与编译器提示、流水线、并行性、缓存阻塞等有关的性能优化。

而 FFT 代码的一个很好的短(半页或更少的代码)递归示例可能看起来与 FFT 的(干净优雅的短)教科书推导之一的摘要完全相同,但与 FFTW 相比,它非常慢并且使用更多内存(或矢量化 pffft 等)。

于 2011-12-07T21:36:32.413 回答