The Wayback Machine - https://web.archive.org/web/20221025130543/https://baike.sogou.com/kexue/d10720.htm

雷德快速傅立叶变换算法

编辑

雷德快速傅立叶变换算法(1968,下文中简写为“雷德算法”),[1] 以麻省理工学院林肯实验室的查尔斯·雷德(Charles M. Rader)命名,是一种快速傅里叶变换(FFT)算法,通过将离散傅里叶变换重新表示为循环卷积来计算素数大小的离散傅里叶变换(另一种素数大小的傅里叶变换算法,布鲁斯坦算法,也通过将离散傅里叶变换重写为卷积来工作)。

由于雷德算法只依赖于离散傅立叶变换核的周期性,所以它可以直接应用于具有相似性质的任何其他变换(素数阶),例如数论变换或离散哈特莱变换。

对于实数的DFT,可以修改该算法以获得两倍时间的节省,使用稍微修改的重新索引/置换来获得实数的两个局部循环卷积;[2] 对于实数的离散傅立叶变换,另一种适应方法是使用离散哈特莱变换。[3]

威若格拉德扩展了雷德的算法,以扩大至素数幂大小    ,[4][5] 如今雷德的算法有时被描述为威若格拉德FFT算法的特例,也称为乘法傅立叶变换算法(由Tolimieri等人于1997年提出),[6] 适用于更大的一类大小。然而,对于像素数幂这样的复合大小,库利-图基快速傅立叶变换算法要简单得多,实现起来也更实际,所以雷德算法通常只用于库利-图基递归合成离散傅立叶变换的大素数基情况。[3]

1 算法编辑

根据雷德FFT算法DFT矩阵的可视化表示,数组由彩色时钟组成,代表大小为11的快速傅立叶变换矩阵。通过使用由除第一行和第一列之外的11的原始根(即2)生成的序列置换行和列,原始DFT矩阵变成循环矩阵。将循环矩阵乘以数据序列相当于循环卷积。

  

如果 N 是素数,那么非零索引集n = 1,...,N–1在模为N的乘法下形成一个群。这种群的数论的一个结果是,存在一个群的生成器(有时称为本原根,可以通过穷举搜索或稍好的算法快速找到)[7],以及一个整数g,使得对于任何非零索引N和对于从0,...,N-2(从q到非零N形成双射)中独特的q,存在。类似地,对于任何非零索引k和对于从0,...,N-2(从q到非零N形成双射)中独特的p,存在,其中负指数表示模的乘法逆。这意味着我们可以使用这些新的指数p和q重写DFT,如下所示:

  

  

(回想一下, 和 在N中是隐式周期性的,且。因此,所有的索引和指数都按照群算法的要求取模为N。)

上面的最后一个求和精确地是长度为N–1的两个序列 和的循环卷积(q = 0,...,N–2),两序列定义为:

  

  

1.1 计算卷积

因为N-1是复合的,所以这种卷积可以通过卷积定理和更传统的快速傅立叶变换算法直接执行。然而,如果N-1本身有很大的质因数,需要递归使用雷德算法,这可能就没有效率了。取而代之的是,人们可以精确地计算长度-(N–1)循环卷积,方法是将它填充到至少2(N–1)–1的长度,比如2的幂,然后可以在不递归应用雷德算法的情况下,将计算时间缩短至O(N log N)以内。

因此,该算法需要O(N)次加法加上O(NlogN)次卷积时间。实际上,O(N)加法通常可以通过将加法并入卷积来执行:如果卷积是由一对FFT执行的,那么 的和由加的FFT的DC(0)输出给出,可以通过在逆FFT之前将其加到卷积的DC项上而被加到所有输出上。尽管如此,这种算法本质上比附近复合尺寸的FFT需要更多的运算,并且在实践中通常需要3-10倍的时间。

如果雷德算法是通过使用大小为N–1的FFT来计算卷积,而不是通过如上所述的零填充来执行的,那么效率很大程度上取决于N和雷德算法必须递归应用的次数。最坏的情况是,如果N-1是 ,且是素数,而-1=  , 是素数,依此类推。在这种情况下,假设素数链一直延伸到某个有界值,雷德算法的递归应用实际上需要O()时间。叫做索菲·热尔曼素数,这种序列叫做第一类坎宁安链。然而,坎宁安链的长度被观察到比增长得更慢,所以以这种方式应用的雷德算法,其时间复杂度可能不是,尽管在最坏的情况下它可能比更差。幸运的是,零填充可以保证操作的复杂性。

参考文献

  • [1]

    ^C. M. Rader, "Discrete Fourier transforms when the number of data samples is prime," Proc. IEEE 56, 1107–1108 (1968)..

  • [2]

    ^S. Chu and C. Burrus, "A prime factor FTT [sic] algorithm using distributed arithmetic," IEEE Transactions on Acoustics, Speech, and Signal Processing 30 (2), 217–227 (1982)..

  • [3]

    ^Matteo Frigo and Steven G. Johnson, "The Design and Implementation of FFTW3," Proceedings of the IEEE 93 (2), 216–231 (2005)..

  • [4]

    ^S. Winograd, "On Computing the Discrete Fourier Transform", Proc. National Academy of Sciences USA, 73(4), 1005–1006 (1976)..

  • [5]

    ^S. Winograd, "On Computing the Discrete Fourier Transform", Mathematics of Computation, 32(141), 175–199 (1978)..

  • [6]

    ^R. Tolimieri, M. An, and C.Lu, Algorithms for Discrete Fourier Transform and Convolution, Springer-Verlag, 2nd ed., 1997..

  • [7]

    ^Donald E. Knuth, The Art of Computer Programming, vol. 2: Seminumerical Algorithms, 3rd edition, section 4.5.4, p. 391 (Addison–Wesley, 1998)..

阅读 107
版本记录
  • 暂无