标题：快速傅立叶变换
快速傅氏变换
快速傅氏变换 英文名是fast Fourier transform
以下是各种快速算法：
对于复数序列，离散傅里叶变换公式为：
直接变换的计算复杂度是O(n^2)（参见大O符号）。快速傅里叶变换可以计算出与直接计算相同的结果，但只需要的计算复杂度。通常，快速算法要求n能被因数分解，但不是所有的快速傅里叶变换都要求n是合数，对于所有的整数n，都存在复杂度为的快速算法。
除了指数的符号相反、并多了一个1/n的因子，离散傅里叶变换的正变换与逆变换具有相同的形式。因此所有的离散傅里叶变换的快速算法同时适用于正逆变换。
一般的简化理论
假设一个M*N Sub-rectangular matrix S可分解成column vector 以及 row vector 相乘：
若有M0个相异的non-trivial values( where )
有N0个相异的non-trivial values
则S共需要M0 + N0个乘法。
Step 1：
Step 2：
简化理论的变型：
S1也是一个M*N的矩阵。
若S1有P1个值不等于0，则的乘法量上限为M0 + N0 + P1。
FFT乘法量的计算
假设彼此互质
点DFT的乘法量为，则点DFT的乘法量为：
假设，P是一个质数。
若点的DFT需要的乘法量为
且 当中 ()
有D1个值不为及的倍数，
有D2个值为及的倍数，但不为的倍数，
则N点DFT的乘法量为：
Cooley-Tukey算法
简介Cooley-Tukey算法是最常见的FFT算法。这一方法以分治法为策略递归地将长度为N = N1N2的DFT分解为长度分别为N1和N2的两个较短序列的DFT，以及与个旋转因子的复数乘法。详细这种方法以及FFT的基本思路在1965年J. W. Cooley和J. W. Tukey合作发表An algorithm for the machine calculation of complex Fourier series之后开始为人所知。但后来发现，实际上这两位作者只是重新发明了高斯在1805年就已经提出的算法(此算法在历史上数次以各种形式被再次提出)。
Cooley-Tukey算法最有名的应用，是将序列长为N 的DFT分割为两个长为N/2 的子序列的DFT，因此这一应用只适用于序列长度为2的幂的DFT计算，即基2-FFT。实际上，如同高斯和Cooley与Tukey都指出的那样，Cooley-Tukey算法也可以用于序列长度N 为任意因数分解形式的DFT，即混合基FFT，而且还可以应用于其他诸如分裂基FFT等变种。尽管Cooley-Tukey算法的基本思路是采用递归的方法进行计算，大多数传统的算法实现都将显示的递归算法改写为非递归的形式。另外，因为Cooley-Tukey算法是将DFT分解为较小长度的多个DFT，因此它可以同任一种其他的DFT算法联合使用。
其它算法
在Cooley-Tukey算法之外还有其他DFT的快速算法。对于长度N = N1N2且N_1与N_2互质的序列，可以采用基于中国剩余定理的互质因子算法将N 长序列的DFT分解为两个子序列的DFT。与 Cooley-Tukey 算法不同的是，互质因子算法不需要旋转因子。
Rader-Brenner 算法是类似于 Cooley-Tukey 算法，但是采用的旋转因子都是纯虚数，以增加加法运算和降低了数值稳定性为代价减少了乘法运算。这方法之后被split-radix variant of Cooley-Tukey所取代，与Rader-Brenner算法相比，有一样多的乘法量，却有较少的加法量，且不牺牲数值的准确性。
Bruun以及QFT算法是不断的把DFT分成许多较小的DFT运算。(Rader-Brenner以及QFT算法是为了2的指数所设计的算法，但依然可以适用在可分解的整数上。Bruun算法则可以运用在可被分成偶数个运算的数字)。尤其是Bruun算法，把FFT看成是z − 1，并把它分解成z 与z + az + 1 的形式。
另一个从多项式观点的快速傅里叶变换法是Winograd 算法。此算法把z − 1分解成cyclotomic多项式，而这些多项式的系数通常为1，0，-1。这样只需要很少的乘法量(如果有需要的话)，所以winograd是可以得到最少乘法量的快速傅里叶算法，对于较小的数字，可以找出有效率的算方式。更精确地说，winograd算法让DFT可以用2点的DFT来简化，但减少乘法量的同时，也增加了非常多的加法量。Winograd也可以利用剩余值定理来简化DFT。
Rader算法提出了利用点数为N(N为质数)的DFT进行长度为N-1的回旋卷积来表示原本的DFT，如此就可利用卷积用一对基本的FFT来计算DFT。另一个prime-size的FFT算法为chirp-Z算法。此法也是将DFT用卷积来表示，此法与Rader算法相比，能运用在更一般的变换上，其变换的基础为Z变换。
实数或对称资料专用的算法
在许多的运用当中，要进行DFT的资料是纯实数，如此一来经过DFT的结果会满足对称性：
=而有一些算法是专门位这种情形设计的(e.g. Sorensen, 1987)。另一些则是利用旧有的算法(e.g. Cooley-Tukey)，删去一些不必要的演算步骤，如此省下了内存的使用，也省下了时间。另一方面，也可以把一个偶数长度且纯实数的DFT，用长度为原本一半的复数型态DFT来表示(实数项为原本纯实数资料的偶数项，虚数项则为奇数项)。
一度人们认为，用离散哈特列变换(Discrete Hartley Transform)来处理纯实数的DFT会更有效率，但接着人们发现，对于同样点数的纯实数DFT，经过设计的FFT，可以比DHT省下更多的运算。Bruun算法是第一个试着从减少实数输入的DFT运算量的算法，但此法并没有成为人们普遍使用的方法。
对于实数输入，且输入为偶对称或奇对称的情形，可以更进一步的省下时间以及内存，此时DFT可以用离散余旋变换或离散正旋变换来代替(Discrete cosine/sine transforms)。由于DCT/DST也可以设计出FFT的算法，故在此种情形下，此方法取代了对DFT设计的FFT算法。
DFT可以应用在频谱分析以及做卷积的运算，而在此处，不同应用可以用不同的算法来取代，列表如下：
用来做频谱分析的情况下，DFT可用下列的算法代替：
(1) DCT. (2) DST. (3) DHT.
(4) 正交基底的扩展(orthogonal basis expantion)包括正交多项式(orthogonal polynomials)以及CDMA.
(5) Walsh(Hadamard)变换.
(6) Haar变换
(7) 小波(wavelet)变换.
(8) 时频分布(time-frequency distribution)
用来做卷积的情况下，DFT可用下列的算法代替：
(1) DCT.
(2) DST. 
(3) DHT.
(4) 直接做卷积(direct computing)
(5) 分段式DFT卷积(sectioned DFT convolution)
(6) Winograd 算法
(7) Walsh(Hadamard)变换.
(8) number-theoretic变换
复杂度以及运算量的极限
长久以来，人们对于求出快速傅里叶变换的复杂度下限以及需要多少的运算量感到很有兴趣，而实际上也还有许多问题需要解决。即使是用较简单的情形，即2点的DFT，也还没能够严谨的证明出FFT至少需要Ω(NlogN)(比NlogN大)的运算量，目前也没有发现复杂度更低的算法。通常数学运算量的多寡会是运算效率好坏最主要的因素，但在现实中，有许多因素也会有很大的影响，如快取内存以及CPU均有很大的影响。
在1978年，Winograd率先导出一个较严谨的FFT所需乘法量的下限：Θ(N)。当N = 2时，DFT只需要 次无理实数的乘法即可以计算出来。更详尽，且也能趋近此下限的算法也一一被提出(Heideman & Burrus, 1986; Duhamel, 1990)。很可惜的是，这些算法，都需要很大量的加法计算，目前的硬件无法克服这个问题。
对于所需加法量的数目，虽然我们可以在某些受限制的假设下，推得其下限，但目前并没有一个精确的下限被推导出来。1973年，Morgenstern在乘法常数趋近巨大的情形下(对大部分的FFT算法为真，但不是全部)推导出加法量的下限：Ω(NlogN)。Pan(1986)在假设FFT算法的不同步的情形有其极限下证明出加法量的下限Ω(NlogN)，但一般来说，此假设相当的不明确。长度为N = 2的情形下，在某些假设下，Papadimitriou(1979)提出使用Cooley-Tukey算法所需的复数加法量Nlog2N是最少的。到目前为止，在长度为N = 2情况，还没有任何FFT的算法可以让复数的加法量比Nlog2N还少。
还有一个问题是如何把乘法量与加法量的总和最小化，有时候称作"演算复杂度"(在这里考虑的是实际的运算量，而不是渐近复杂度)。同样的，没有一个严谨下限被证明出来。从1968年开始，N = 2点DFT而言，split-radix FFT算法需要最少的运算量，在N > 1的情形下，其需要4Nlog2N − 6N + 8 个乘法运算以及加法运算。最近有人导出更低的运算量：。
大多数尝试要降低或者证明FFT复杂度下限的人都把焦点放在复数资料输入的情况，因其为最简单的情形。但是，复数资料输入的FFT算法，与实数资料输入的FFT算法，离散余旋变换(DCT)，离散哈特列变换(DHT)，以及其他的算法，均有很大的关连性。故任何一个算法，在复杂度上有任何的改善的话，其他的算法复杂度也会马上获得改善。