FFT、快速有限傅里叶变换

这是第二个在一系列的三个职位有限傅里叶变换。这篇文章是关于快速FFT算法本身。递归分而治之算法实现在一个高雅的MATLAB函数命名ffttx

内容

FFFT

首字母缩写FFT是模棱两可的。第一个F代表“快速”和“有限”。更准确的缩写FFFT,但没有人愿意使用它。在MATLAB中,表达式fft (x)计算有限傅里叶变换的向量x。如果整数计算是最快的n =长度(x)小质数的是权力的产物。

FFT

的直接应用程序定义

求和$ $ k = \ sum_ j = {0} ^ {n} \ω^ {jk} y_j, k = 0, \ \ ldots, n - 1 $ $

需要n次乘法美元增加美元为每个$ n的组件Y美元总共2 n ^ 2美元美元浮点操作。这并不包括代\ω美元的权力。电脑能做乘法和加法每微秒需要一百万秒,约11.5天,million-point FFT。

几个人发现快速FFT算法独立,许多人已经导致了他们的发展,但这是1965年的一篇论文中,普林斯顿大学的约翰·图基和约翰·厄尔IBM的研究通常被认为是现代使用FFT的起点。

现代快速FFT算法计算复杂度为O (n \ mbox{日志}_2 n),而不是O (n ^ 2)美元美元。如果n是2的幂,美元一维FFT长度n需要不到3美元美元美元n \ mbox{日志}_2浮点操作。$ n = 2 ^{20} $,这是近35000倍的速度比2 n ^ 2美元。即使$ n = 2 ^{10} $,因子约为70。

用MATLAB 8.3和2.7 GMHz英特尔酷睿i7笔记本电脑,所需要的时间fft (x)如果长度(x)2 ^ 23 = 8388608大约是0.5秒。内置的fft函数是基于FFTW,“最快的傅里叶变换在西方,”麻省理工学院开发Matteo冻结器和史蒂文·g·约翰逊于1998年。

快速算法

快速FFT算法的关键是这一事实的平方2 n th统一的根源是美元美元$ n根的团结。使用复杂的符号,

$ $ \ω= \ omega_n = e ^{2 \π/ n} $ $

我们有

$ $ \ omega_ {2 n} ^ 2 = \ omega_n $ $

快速算法的推导过程始于有限傅里叶变换的定义:

求和$ $ k = \ sum_ j = {0} ^ {n} \ω^ {jk} y_j, k = 0, \ \ ldots, n - 1 $ $

除以之和与甚至下标与奇怪的下标。

求和$ $ k = \ sum_ {j甚至\}\ω^ {jk} y_j \ + \ \ sum_ {j奇怪\}\ω^ {jk} y_j $ $

假设n是美元,$ k \ leq n / 2 - 1美元,重新总结下标。

求和$ $ k = \ sum_ j = {0} ^ {n / 2 - 1} \ω^ {2 jk} y_ {2 j} \ + \ \ω^ k \ sum_ j = {0} ^ {n / 2 - 1} \ω^ {2 jk} y_ {2 j + 1} $ $

两个金额是组件的fft算法部分的长度n / 2美元$ y $偶数和奇数下标。为了得到整个FFT长度n美元,我们要做两个长度为n / 2美元的FFT算法,其中一个乘以ω\ $美元的权力,并将结果。

之间的关系的FFT长度n美元和两个长度为n / 2美元的FFT算法在MATLAB可以表达简洁。

ω= exp(2 *π*我/ n);k = (0: n / 2 - 1);w =ω^ k;u = fft (y (1:2: n - 1));v = w。* fft (y (2:2: n));

然后

fft (y) = [u + v;uv];

现在,如果n不仅是美元甚至但实际上2的乘方,这个过程可以重复。FFT长度n表示美元的两个长度为n / 2美元的FFT算法,然后四个长度为n / 4美元的FFT算法,然后八长度为n / 8美元的FFT算法,等等,直到我们达到n FFT算法的长度为1美元。一个FFT长度仅仅是数字本身。如果n = 2 ^ p美元,递归的步数是$ p $。有O (n)美元每一步工作,所以工作的总量

$ $ O (np) = O (n \ mbox{日志}_2 n) $ $

如果n不2的幂,美元仍有可能表达FFT长度为n的美元的几个较短的FFT算法。FFT长度100是两个长度为50的FFT算法,或四个长度为25的FFT算法。一个FFT长度25可以表达的五个长度为5的FFT算法。如果n不是质数,美元的FFT长度n可以表示美元的FFT算法的长度除以n美元。即使n是质数,美元可以嵌入FFT在另一个的长度可以被分解。我们不进入这些算法的细节。

ffttx

教科书的功能ffttx结合了两种基本的想法。如果n是2的乘方美元,它使用美元O (n \ mbox{日志}_2 n)美元的快速算法。如果n美元有一个奇怪的因素,它使用的快速递归,直到达到一个奇怪的长度,然后建立了离散傅里叶矩阵和使用矩阵向量乘法。

ffttx是我最喜欢的MATLAB函数。这是整个代码。

函数y = ffttx (x) % ffttx教科书快速有限傅里叶变换。% FFTTX (X)计算相同的有限傅里叶变换FFT (X) %。代码使用递归划分和%征服甚至秩序和矩阵向量乘法算法奇怪的顺序。如果长度(X) m * p % m是奇怪和p是2的幂,这种方法计算%的复杂性是O (m ^ 2) * O (p值(p))。
x = x (:);n =长度(x);ω= exp(2 *π*我/ n);
如果快速眼动(n, 2)递归分而治之k = = = 0% (0: n / 2 - 1);w =ω^ k;u = ffttx (x (1:2: n - 1));v = w。* ffttx (x (2:2: n));y = [u + v;uv];其他%傅里叶矩阵j = 0: n - 1;k = j ';F =ω。^ (k * j);y = F * x; end

傅里叶矩阵

这是一个阴谋的傅里叶矩阵顺序16。这样的情节是在本系列的下一篇文章的主题。现在,仅仅注意到这是一个完整的图16节点。

情节(fft(眼睛(16)))轴平等的

引用

史蒂夫·埃丁写了大量有关FFT在他的博客。选择“类别”,然后单击“傅里叶变换”。< https://blogs.mathworks.com/steve>

詹姆斯·w·厄尔和约翰·w·图基”机的算法计算复杂的傅里叶级数”,数学。1965年第一版。19:297 - 301。< http://dx.doi.org/10.2307%2F2003354>

马特奥冻结器和史蒂文·g·约翰逊:“FFTW,快速傅里叶变换在西方”,< http://www.fftw.org>。




发表与MATLAB®R2014a

|

댓글

댓글을남기려면링크를클릭하여MathWorks계정에로그인하거나계정을새로만드십시오。