雷德演算法(英語:Rader's algorithm)是一種於1968年由麻省理工學院林肯實驗室之查爾斯·M·雷德(Charles M. Rader)提出的快速傅利葉轉換演算法[1]。當訊號的資料點數量為質數時,此演算法可藉由將離散傅利葉轉換重新表示為圓周摺積,快速計算出該訊號之離散傅利葉轉換結果。另一種稱為布魯斯坦演算法的作法也是透過類似的方式將離散傅利葉轉換改寫為摺積完成轉換,且同樣限制訊號長度需為質數。

由於雷德演算法之運作原理只依賴於具有週期性的離散傅利葉轉換核,故它也可直接套用於其它具有類似特性的轉換(惟訊號長度需為質數),例如數論轉換離散哈特利轉換

當所欲轉換的訊號資料皆為實數時,可透過重新索引或排列將原轉換拆成兩個長度為一半的實數循環摺積,如此稍微修改後的雷德演算法可進一步使運算時間減半[2];另一種快速計算實數訊號之離散傅利葉轉換的方法則是使用離散哈特利轉換[3]

薩繆爾·威諾格拉德英語Shmuel Winograd進一步延伸了雷德演算法,使其也可用於長度為質數之次方數 的訊號之離散傅利葉轉換[4][5];也因此,雷德演算法亦可被視為威諾格拉德快速傅利葉轉換演算法(亦稱為乘法性傅利葉轉換演算法[6])的特例之一,其中後者可用的訊號長度範圍較廣。然而,當訊號長度為合數(如質數之次方數)時,使用庫利-圖基快速傅利葉轉換演算法更加簡單且實作上也較容易,故雷德演算法一般只用於庫利-圖基演算法之遞迴拆解下較大質數之基本情況[3]

演算法

Thumb
將雷德演算法之離散傅里葉轉換矩陣視覺化的結果。圖中上色之時鐘圖示代表了大小為11的矩陣中各元素之相位。除了第一行與第一列外,在使用11之原根(即2)重新排列矩陣後,原始之離散傅里葉轉換矩陣即形成一循環矩陣。將訊號與一循環矩陣相乘即等同於圓周摺積

是一個質數,則之非零索引數集合即形成一整數模N乘法群。運用數論的一個結論,可知此類的中存在一個生成元(有時亦稱為原根,可由窮舉搜索或其它較有效率之演算法快速找到[7])——一個整數 使得對於任意的非零索引數 都存在唯一的 ,即形成一至非零對射;同樣地,對於任意的非零索引數 都存在唯一的 ,其中指數的負號代表的是 模反元素。這代表所求之離散傅利葉轉換可用新的索引數 改寫如下:

其中皆對隱含週期性,而。因此,所有索引數以及指數皆可依群算術之要求取模之結果。

上式中最後的加總即為長度)之兩數列圓周摺積

摺積計算

由於必為合數,上述之圓周摺積可直接由摺積定理以及其它常用之快速傅利葉轉換演算法求得。然而,若 本身具有較大之質因數,則此作法須遞迴使用雷德演算法,而較不具效率。替代方法之一乃是將原長度為 之數列補零至長度大於,甚或是2的次方數,便可透過快速演算法在的時間內求得而不須遞迴使用雷德演算法。

如此一來,此演算法則需要之加法運算以及之摺積運算。實作上,之加法常可被包含至後續的摺積運算中:若摺積是由一對快速傅利葉轉換求得,則 的加總即是 以及 離散傅利葉轉換的第0項輸出(即DC項)之和。同時,可在逆轉換前先將 加至摺積之DC項,這樣可使最後的輸出皆已包含。不過,此演算所需的運算步驟仍然比其它接近之合數長度的快速傅利葉轉換來得多,實務上耗時是其 3 至 10 倍。

若雷德演算法未使用如上的補零法,而直接透過長度之快速傅利葉轉換計算,則其效率將取決於值以及雷德演算法本身遞迴呼叫的次數。最壞情況乃是當為質數,為質數,依此類推;在此情況下,若上述的質數鍊一直延伸至某界值,則遞迴雷德演算法之複雜度將為。諸如此類的稱為索菲·熱爾曼質數,而它們所形成的質數數列則稱為第一類康寧漢鍊英語Cunningham chain。然而,康寧漢鍊之長度增長的速度一般而言遠較慢,故如此使用雷德演算法之複雜度應不為,但在最壞情況下複雜度仍應比高。不過,使用上述的補零法,便可達到 之複雜度。

參考資料

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.