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。

调整通常涉及拆分为数据集的 evenodd 条目,或使用涉及 位反转的 butterfly shuffle 重新排序它们 的索引顺序,并且可以非常快速地硬连线...用于 HW DFFT 实现...有关更多信息,请参阅Wiki Butterfly diagram

【讨论】:

你现在已经改进了,谢谢,但第一段仍然是错误的(或者至少措辞不好) @PaulR 有一段时间没来了,我想我终于发现了措辞不当的部分(花了我一段时间,我的英语没有达到应有的水平,有些部分丢失了(重新)翻译,但并非所有都是由翻译引起的)谢谢你发现它...... 感谢您改进问题 - 已删除反对票。 @PaulR 最有可能的情况是我在想一件事而写另一件事。它时常发生在我身上,但通常是口语,我从与之交谈的人那里得到直接的反馈。这是我第一次以书面形式发现它。结合记忆视觉,我确实读回了我在想什么,而不是我在写什么。几天后我忘记了,终于读到了真正的交易...... :) 因为我忽略了很多错别字并在之后进行了很多编辑......

以上是关于DFT 和 FFT 之间有啥区别使 FFT 如此之快?的主要内容,如果未能解决你的问题,请参考以下文章

live FFT和 FFT为啥不一样

fft窄带高分辨率算法

FS,FT,DFS,DTFT,DFT,FFT的联系和区别 数字信号处理

信号处理之DFTIDFT

如何用一次n点的fft计算一个2n点的dft

numpy.fft 和 scipy.fftpack 有啥区别?