Algorithm 如何精确计算快速傅里叶变换?

Algorithm 如何精确计算快速傅里叶变换?,algorithm,math,fft,Algorithm,Math,Fft,我已经读了很多关于快速傅里叶变换的书,我试图理解它的低层次方面。不幸的是,谷歌和维基百科帮不了什么忙。。我有5本不同的算法书,它们也没什么帮助 我试图找到像向量[1,0,0,0]这样简单的东西的FFT。当然,我可以把它插入Matlab,但这不能帮助我理解下面发生了什么。还有,当我说我想求一个向量的FFT时,这和说我想用一个更有效的算法求一个向量的DFT是一样的吗 是的,FFT仅仅是一种有效的DFT算法。理解FFT本身可能需要一些时间,除非你已经研究过复数和连续傅里叶变换;但它基本上是由周期函数导

我已经读了很多关于快速傅里叶变换的书,我试图理解它的低层次方面。不幸的是,谷歌和维基百科帮不了什么忙。。我有5本不同的算法书,它们也没什么帮助


我试图找到像向量[1,0,0,0]这样简单的东西的FFT。当然,我可以把它插入Matlab,但这不能帮助我理解下面发生了什么。还有,当我说我想求一个向量的FFT时,这和说我想用一个更有效的算法求一个向量的DFT是一样的吗

是的,FFT仅仅是一种有效的DFT算法。理解FFT本身可能需要一些时间,除非你已经研究过复数和连续傅里叶变换;但它基本上是由周期函数导出的基的变化


(如果你想更多地了解傅里叶分析,我推荐杰拉尔德·福兰德的《傅里叶分析及其应用》一书)

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

理解DFT后,请继续进行FFT。请注意,尽管一般原理相同,但FFT有许多不同的实现和变化,例如,时间抽取v频率抽取、基数2 v其他半径和混合基数、复数到复数v实到复数等

关于这一主题的一本很好的实用书是E.Brigham写的。

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

这是我想到的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-1fkωnk

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

注意,找到这些F需要进行O(N2)运算。但是我们可以利用我们选择的ω的特殊结构,这使得我们可以在O(N logn)中进行。任何这样的算法都称为快速傅里叶变换

快速傅里叶变换 这里有一种做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)。因此,在ω0到ωN-1之间对Q和R的求值就足够了

这意味着您最初的问题——在2N点ω0到ω2N-1处计算2N项多项式p——已简化为在N点ω0到ωN-1处计算N项多项式Q和R的两个问题。所以运行时间T(2N)=2T(N)+O(N)以及所有这些,这就给出了T(N)=O(N logn)

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),可能不是很有启发性。

我对傅里叶变换也很陌生,我发现这本在线书非常有用:


该链接将带您进入离散傅里叶变换一章。本章解释了所有傅里叶变换之间的差异,以及在何处使用哪种变换以及显示如何计算离散傅里叶变换的伪代码。

如果您寻求DFT的简单英语解释和一点FFT,而不是学术性的goggledeegoo,那么您必须阅读以下内容:


我自己也解释得再好不过了

虽然这可能无助于理解,但这里有一个很好的实现:。这是一个相当完整的文档。请注意,这是一个由两部分组成的问题:1。我如何直观地想象甚至预测离散傅里叶变换(如答案中所述,FFT实际上是一种执行DFT的算法)对我的输入做了什么?二,。如何实现FFT?那么它的用途是什么?傅里叶变换将输入信号转换为频率空间,它告诉您信号中出现不同频率的频率。这为您提供了大量有关信号的信息,您可以使用这些信息查找、消除或放大信号的某些频率,甚至其他特性。这是可能的,因为傅里叶变换有一个逆变换,允许您将更改后的频率空间转换回信号空间。+1用于Brigham参考。这是我读过的最好的解释。@AND:谢谢,是的,这本书很棒,尽管它很好