DFT 和 FFT 之间有啥区别使 FFT 如此之快?
Posted
技术标签:
【中文标题】DFT 和 FFT 之间有啥区别使 FFT 如此之快?【英文标题】:What are the differences between DFT and FFT that make FFT so fast?DFT 和 FFT 之间有什么区别使 FFT 如此之快? 【发布时间】:2017-06-08 18:39:53 【问题描述】:我正在尝试理解 FFT,这是我目前所掌握的:
为了找到波形中频率的幅度,必须通过将波乘以它们正在搜索的频率来探测它们,在两个不同的相位(sin 和 cos)中并取平均值。阶段是通过它与两者的关系来找到的,其代码是这样的:
//simple pseudocode
var wave = [...]; //an array of floats representing amplitude of wave
var numSamples = wave.length;
var spectrum = [1,2,3,4,5,6...] //all frequencies being tested for.
function getMagnitudesOfSpectrum()
var magnitudesOut = [];
var phasesOut = [];
for(freq in spectrum)
var magnitudeSin = 0;
var magnitudeCos = 0;
for(sample in numSamples)
magnitudeSin += amplitudeSinAt(sample, freq) * wave[sample];
magnitudeCos += amplitudeCosAt(sample, freq) * wave[sample];
magnitudesOut[freq] = (magnitudeSin + magnitudeCos)/numSamples;
phasesOut[freq] = //based off magnitudeSin and magnitudeCos
return magnitudesOut and phasesOut;
为了非常快速地对很多频率执行此操作,FFT 使用了许多技巧。
使 FFT 比 DFT 快得多的捷径是什么?
附:我曾尝试在网上查看完整的 FFT 算法,但所有技巧都倾向于浓缩成一段漂亮的代码,没有太多解释。在我理解整个事情之前,我首先需要的是对这些有效变化中的每一个作为概念进行介绍。
谢谢。
【问题讨论】:
三角函数的对称性和周期性浮现在脑海中。我认为 MIT 的 Gil Strang 给出了一个了不起的解释:ocw.mit.edu/courses/mathematics/… 这是我最容易理解的两个。还有其他一些我觉得更奇怪的,只是简单地提到,比如位反转。谢谢你的视频。光是它的长度就让我犹豫不决,不确定它是否包含我正在寻找的答案,但它确实让我离知道我在寻找什么更近了一步。 FFT 比 DFT 更快,主要是因为它涉及的计算量更少。如果样本数为 2^n,则数学中有可用的快捷方式。有一些微妙之处;一些高度优化(最少计算)的 FFT 算法不能很好地与 CPU 缓存配合使用,因此它们比其他算法慢。不用担心 - 如果您使用像 FFTW 这样的预先优化的库,您将获得一个针对速度优化的 FFT 算法,而不是针对最少的计算次数。很多速度来自预先计算 FFT 的指数(它们是常数)。 我也在 DSP 上问过这个问题,尽管答案对于转换成代码并不简单。 dsp.stackexchange.com/questions/41558/… 本质上就是DFT = O(n^2), FFT = O(n log n)。 【参考方案1】:见How to compute Discrete Fourier Transform?
这个想法是 N
-point DFT 离散和积分可以分成 2 个 N/2
-point 两半,其中两半都可以表示为 N/2
-point 的函数 DFT 和一些小的调整以将它们组合成最终结果。这导致每个整个数据集需要几乎一半的操作。如果你递归地应用这个,你会得到O(n.log2(n))
而不是O(n^2)
天真的方法。
有两种众所周知的方法可以将方程拆分为两个相似的半和,一种称为时间抽取,另一种称为频率抽取。 Booth 以代数方式拆分原始总和(利用 W
权重矩阵的对称性),所以只需 google。
调整通常涉及拆分为数据集的 even 和 odd 条目,或使用涉及 位反转的 butterfly shuffle 重新排序它们 的索引顺序,并且可以非常快速地硬连线...用于 HW DFFT 实现...有关更多信息,请参阅Wiki Butterfly diagram
【讨论】:
你现在已经改进了,谢谢,但第一段仍然是错误的(或者至少措辞不好) @PaulR 有一段时间没来了,我想我终于发现了措辞不当的部分(花了我一段时间,我的英语没有达到应有的水平,有些部分丢失了(重新)翻译,但并非所有都是由翻译引起的)谢谢你发现它...... 感谢您改进问题 - 已删除反对票。 @PaulR 最有可能的情况是我在想一件事而写另一件事。它时常发生在我身上,但通常是口语,我从与之交谈的人那里得到直接的反馈。这是我第一次以书面形式发现它。结合记忆视觉,我确实读回了我在想什么,而不是我在写什么。几天后我忘记了,终于读到了真正的交易...... :) 因为我忽略了很多错别字并在之后进行了很多编辑......以上是关于DFT 和 FFT 之间有啥区别使 FFT 如此之快?的主要内容,如果未能解决你的问题,请参考以下文章