雷德演算法
雷德演算法(英语:Rader's algorithm)是一种于1968年由麻省理工学院林肯实验室之查尔斯·M·雷德(Charles M. Rader)提出的快速傅立叶转换演算法[1]。当讯号的资料点数量为质数时,此演算法可借由将离散傅立叶转换重新表示为圆周折积,快速计算出该讯号之离散傅立叶转换结果。另一种称为布鲁斯坦演算法的作法也是透过类似的方式将离散傅立叶转换改写为折积完成转换,且同样限制讯号长度需为质数。
由于雷德演算法之运作原理只依赖于具有周期性的离散傅立叶转换核,故它也可直接套用于其它具有类似特性的转换(惟讯号长度需为质数),例如数论转换或离散哈特利转换。
当所欲转换的讯号资料皆为实数时,可透过重新索引或排列将原转换拆成两个长度为一半的实数循环折积,如此稍微修改后的雷德演算法可进一步使运算时间减半[2];另一种快速计算实数讯号之离散傅立叶转换的方法则是使用离散哈特利转换[3]。
萨缪尔·威诺格拉德进一步延伸了雷德演算法,使其也可用于长度为质数之次方数 的讯号之离散傅立叶转换[4][5];也因此,雷德演算法亦可被视为威诺格拉德快速傅立叶转换演算法(亦称为乘法性傅立叶转换演算法[6])的特例之一,其中后者可用的讯号长度范围较广。然而,当讯号长度为合数(如质数之次方数)时,使用库利-图基快速傅立叶转换演算法更加简单且实作上也较容易,故雷德演算法一般只用于库利-图基演算法之递回拆解下较大质数之基本情况[3]。
演算法
[编辑]若是一个质数,则之非零索引数集合即形成一整数模N乘法群。运用数论的一个结论,可知此类的群中存在一个生成元(有时亦称为原根,可由穷举搜索或其它较有效率之演算法快速找到[7])——一个整数 使得对于任意的非零索引数 都存在唯一的 令 ,即形成一至非零的对射;同样地,对于任意的非零索引数 都存在唯一的 令 ,其中指数的负号代表的是 之模反元素。这代表所求之离散傅立叶转换可用新的索引数 及 改写如下:
其中和皆对隐含周期性,而。因此,所有索引数以及指数皆可依群算术之要求取模之结果。
上式中最后的加总即为长度()之两数列和的圆周折积:
折积计算
[编辑]由于必为合数,上述之圆周折积可直接由折积定理以及其它常用之快速傅立叶转换演算法求得。然而,若 本身具有较大之质因数,则此作法须递回使用雷德演算法,而较不具效率。替代方法之一乃是将原长度为 之数列补零至长度大于,甚或是2的次方数,便可透过快速演算法在的时间内求得而不须递回使用雷德演算法。
如此一来,此演算法则需要之加法运算以及之折积运算。实作上,之加法常可被包含至后续的折积运算中:若折积是由一对快速傅立叶转换求得,则 的加总即是 以及 离散傅立叶转换的第0项输出(即DC项)之和。同时,可在逆转换前先将 加至折积之DC项,这样可使最后的输出皆已包含。不过,此演算所需的运算步骤仍然比其它接近之合数长度的快速傅立叶转换来得多,实务上耗时是其 3 至 10 倍。
若雷德演算法未使用如上的补零法,而直接透过长度之快速傅立叶转换计算,则其效率将取决于值以及雷德演算法本身递回呼叫的次数。最坏情况乃是当且为质数,且为质数,依此类推;在此情况下,若上述的质数炼一直延伸至某界值,则递回雷德演算法之复杂度将为。诸如此类的称为索菲·热尔曼质数,而它们所形成的质数数列则称为第一类康宁汉炼。然而,康宁汉炼之长度增长的速度一般而言远较慢,故如此使用雷德演算法之复杂度应不为,但在最坏情况下复杂度仍应比高。不过,使用上述的补零法,便可达到 之复杂度。
参考资料
[编辑]- ^ C. M. Rader, "Discrete Fourier transforms when the number of data samples is prime," Proc. IEEE 56, 1107–1108 (1968).
- ^ 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.0 3.1 Matteo Frigo and Steven G. Johnson, "The Design and Implementation of FFTW3 (页面存档备份,存于互联网档案馆)," Proceedings of the IEEE 93 (2), 216–231 (2005).
- ^ S. Winograd, "On Computing the Discrete Fourier Transform", Proc. National Academy of Sciences USA, 73(4), 1005–1006 (1976).
- ^ S. Winograd, "On Computing the Discrete Fourier Transform", Mathematics of Computation, 32(141), 175–199 (1978).
- ^ R. Tolimieri, M. An, and C.Lu, Algorithms for Discrete Fourier Transform and Convolution, Springer-Verlag, 2nd ed., 1997.
- ^ Donald E. Knuth, The Art of Computer Programming, vol. 2: Seminumerical Algorithms, 3rd edition, section 4.5.4, p. 391 (Addison–Wesley, 1998).