【问题标题】:How exactly do you compute the Fast Fourier Transform?你究竟是如何计算快速傅里叶变换的?
【发布时间】:2010-07-11 22:17:34
【问题描述】:

我已经阅读了很多关于快速傅立叶变换的内容,并试图了解它的低级方面。不幸的是,Google 和 Wikipedia 根本没有多大帮助。我有 5 种不同的算法书籍打开,它们也没有多大帮助。

我试图找到像向量 [1,0,0,0] 这样简单的东西的 FFT。当然,我可以将它插入 Matlab,但这无助于我理解下面发生的事情。另外,当我说我想找到一个向量的 FFT 时,这和说我想用更有效的算法找到一个向量的 DFT 是一样的吗?

【问题讨论】:

  • 虽然它可能无法帮助理解,但这里有一个很好的实现:fftw.org。它有很好的记录。
  • 请注意,这是一个由两部分组成的问题:1.我如何直观地想象甚至预测离散傅里叶变换(如答案中所述,FFT 确实是一种执行 DFT 的算法)对我的输入呢? 2. 如何实现 FFT?
  • 那么它有什么用呢?傅里叶变换将输入信号转换为频率空间,它告诉您不同频率出现在信号中的频率。这为您提供了有关信号的大量信息,您可以使用这些信息来查找、消除或放大某些频率,甚至是信号的其他属性。这是可能的,因为傅里叶变换有一个逆变换,它允许您将更改后的频率空间转换回信号空间。

标签: algorithm math fft


【解决方案1】:

你说得对,“快速傅里叶变换”只是 任何 算法的名称,它在 O(n log n) 时间内计算离散傅里叶变换,并且有几种这样的算法。

这是我认为的 DFT 和 FFT 的最简单解释,以及小 N 的示例,这可能会有所帮助。 (请注意,还有其他解释和其他算法。)

离散傅里叶变换

给定N 数字 f0、f1、f2、...、fN-1,DFT 给出了一组不同的N 数字。

具体来说:设 ω 是 1 的原始 N 次根(在复数或某些有限域中),这意味着 ωN=1 但没有更小的幂是 1。您可以将 fk 视为多项式 P(x) = ∑fkxk 的系数支持>。 DFT 给出的 N 个新数 F0, F1, ..., FN-1评估多项式 ω 次方的结果。即对于从0到N-1的每一个n,新的数Fn为P(ωn) = ∑ 0≤k≤N-1 fkωnk.

[选择ω的原因是逆DFT的形式很好,与DFT本身非常相似。]

请注意,天真地找到这些 F 需要 O(N2) 次操作。但是我们可以利用来自我们选择的 ω 的特殊结构,这允许我们在 O(N log N) 中完成。任何这样的算法都称为快速傅里叶变换。

快速傅里叶变换

所以这是进行 FFT 的一种方法。我将用 2N 替换 N 以简化符号。我们有 f0, f1, f2, ..., f2N-1,我们想要计算 P(ω0), P(ω1), … P(ω2N-1) 在这里我们可以写出

P(x) = Q(x) + ωNR(x) 与

Q(x) = f0 + f1x + … + fN-1xN-1

R(x) = fN + fN+1x + … + f2N-1x2N- 1

现在这就是事情的美妙之处。观察到 ωk+N 处的值与 ωk 处的值非常简单相关:
P(ωk+N) = ωN(Q(ωk) + ωNR(ω k)) = R(ωk) + ωNQ(ωk)。所以 Q 和 R 在 ω0 到 ωN-1 的评估就足够了。

这意味着您的原始问题——在 2N 个点 ω0 到 ω2N-1 处评估 2N 项多项式 P——已简化为两个问题评估 N 项多项式 Q 和 R 在 N 个点 ω0 到 ωN-1。所以运行时间 T(2N) = 2T(N) + O(N) 等等,得到 T(N) = O(N log N)。

DFT 示例

请注意,其他定义将因数设为 1/N 或 1/√N。

对于N=2,ω=-1,(a,b)的傅里叶变换为(a+b, a-b)。

对于N=3,ω为1的复立方根,(a,b,c)的傅里叶变换为(a+b+c,a+bω+cω2 , a+bω2+cω)。 (因为 ω4=ω。)

对于N=4和ω=i,(a,b,c,d)的傅里叶变换为(a+b+c+d, a+bi-c-di, a-b+c-d, a-bi-c+di)。特别是,您问题中的示例:(1,0,0,0) 上的 DFT 给出 (1,1,1,1),也许不是很有启发性。

【讨论】:

  • 这个答案非常清晰+1
【解决方案2】:

FFT 只是 DFT 的一种有效实现。两者的结果应该相同,但通常 FFT 会快得多。确保您首先了解 DFT 的工作原理,因为它更简单,也更容易掌握。

当您了解 DFT 后,请继续学习 FFT。请注意,虽然一般原理是相同的,但 FFT 有许多不同的实现和变体,例如时间抽取 v 频率抽取,基数 2 v 其他基数和混合基数,复数到复数 v 实数到复数等。

E. Brigham 的 Fast Fourier Transform and Its Applications 是一本很好的实用书籍。

【讨论】:

  • +1 用于 Brigham 参考。这是我读过的最好的解释。
  • @andand:谢谢,是的,很棒的书,尽管它现在已经很老了:应用程序章节也很好,而且仍然相关。
【解决方案3】:

是的,FFT 只是一种高效的 DFT 算法。除非您已经研究过复数和连续傅里叶变换,否则了解 FFT 本身可能需要一些时间;但它基本上是从周期函数派生的基础的基础变化。

(如果您想了解有关傅立叶分析的更多信息,我推荐 Gerald B. Folland 的傅立叶分析及其应用一书)

【讨论】:

    【解决方案4】:

    我也是傅立叶变换的新手,我发现这本在线书籍非常有帮助:

    The Scientists and Engineer's Guide to Digital Signal Processing

    该链接将您带到离散傅里叶变换的章节。本章解释了所有傅里叶变换之间的区别,以及你将在哪里使用哪一个,伪代码展示了你如何计算离散傅里叶变换。

    【讨论】:

      【解决方案5】:

      如果您寻求 DFT 的简单英文解释和一点 FFT,而不是学术goggledeegoo,那么您必须阅读以下内容:http://blogs.zynaptiq.com/bernsee/dft-a-pied/

      我自己无法更好地解释它。

      【讨论】:

      • 遗憾的是没有对实际 FFT 算法的解释。还是很好的链接,谢谢!
      猜你喜欢
      • 2010-12-13
      • 2011-07-12
      • 2017-08-26
      • 2017-09-14
      • 2012-12-10
      • 2013-03-31
      • 2015-08-19
      • 2020-03-29
      • 1970-01-01
      相关资源
      最近更新 更多