快速傅里葉變換(Fast Fourier Transform,FFT)用來計算離散傅里葉變換(Discrete Fourier Transform,DFT)及其逆變換(IDFT),本質(zhì)上多項式乘法實際上是多項式系數(shù)向量的卷積(convolution)
(以上百度)
看了很多網(wǎng)上關(guān)于FFT的講解卦停,有一些是直接忽略了公式的推導(dǎo)疼阔,另外一些有推導(dǎo),但是推導(dǎo)中的細(xì)節(jié)卻沒有講清楚待牵。本著不懂就學(xué)的心態(tài),我把FFT的思維和推導(dǎo)細(xì)節(jié)用公式講清楚,方便后人能更細(xì)致地學(xué)習(xí)FFT氯质。
在了解FFT之前譬淳,需要有一些前置的知識档址,以下為目錄。
- 歐拉函數(shù)
- 復(fù)數(shù)及單位根
- 多項式的系數(shù)邻梆、點值表達(dá)和多項式相乘
- FFT的思維過程(Cooley-Tukey 算法)
4.1 DFT
4.2 IDFT - FFT的實現(xiàn)過程以及FNT
一守伸、歐拉函數(shù)
其中i為虛數(shù)單位即
即虛數(shù)單位
二、復(fù)數(shù)及單位根
復(fù)數(shù)形式:浦妄,其中i為虛數(shù)單位
復(fù)數(shù)乘法:對于兩個復(fù)數(shù)和
顽馋,則
由于歐拉公式(見公式1)令則復(fù)數(shù)
其中為該復(fù)數(shù)所在復(fù)平面圓的半徑,
為該復(fù)數(shù)在復(fù)平面中的幅角助被。則兩個復(fù)數(shù)為
鲸阻,即
根據(jù)4式可得,兩個復(fù)數(shù)的相乘可以看作是幅角相加阅懦,模長相乘和二。
單位根:對于滿足方程的復(fù)數(shù),我們稱其為n次單位根耳胎。由于根據(jù)復(fù)數(shù)乘法惯吕,我們可知:復(fù)數(shù)相乘為幅角相加惕它,模長相乘。則對于每個單位根废登,模長為1怠缸,幅角的n倍為0。即
(易得)钳宪。
為了保證幅角的n倍始終為0揭北,由于這個性質(zhì),我們可以將單位根表示為
吏颖,其中
搔体。
我們發(fā)現(xiàn)無論k取值,的n倍始終為0半醉。
記疚俱,則n次單位根可以表示為
三、多項式的系數(shù)缩多、點值表達(dá)和多項式相乘
多項式的系數(shù)表達(dá):給定一個多項式
其中為系數(shù)向量
多項式的點值表達(dá):給定一個多項式如公式(5)呆奕,我們將其離散化,設(shè)取(這里為什么是n+1項衬吆,將在第四節(jié)中講到)互不相同的值
梁钾,將其代入可得
,則
為
在
上的點值表達(dá)逊抡。
多項式系數(shù)表達(dá)的乘法:給定兩個多項式
則多項式系數(shù)表達(dá)的乘法為
其中:
有式(9)可得姆泻,計算復(fù)雜度為
多項式點值表達(dá)的乘法:給定兩個多項式如式(6)與(7),則其在上的點值表達(dá)分別為:
則多項式點值表達(dá)的乘法為
可見冒嫡,當(dāng)我們已知即可在
的復(fù)雜度下求得結(jié)果多項式的點值表達(dá)拇勃。
四、FFT的思維過程(Cooley-Tukey 算法)
對于一個多項式的乘法孝凌,根據(jù)上述前置知識的補(bǔ)充方咆,我們可以得知:降低多項式乘法復(fù)雜度的方法是將常見的多項式系數(shù)表達(dá)轉(zhuǎn)變?yōu)槎囗検降狞c值表達(dá),做完點值表達(dá)的乘法后蟀架,最后再將點值表達(dá)轉(zhuǎn)化為系數(shù)表達(dá)瓣赂,即可完成多項式乘法。
所以問題轉(zhuǎn)變?yōu)椋?br>
1.如何將多項式系數(shù)表達(dá)轉(zhuǎn)變?yōu)槎囗検近c值表達(dá)
2.如何將多項式點值表達(dá)轉(zhuǎn)變?yōu)槎囗検较禂?shù)表達(dá)
由此引出了離散傅里葉變換 DFT(Discrete Fourier Transformation)和逆離散傅里葉變換 IDFT(Inverse Discrete Fourier Transformation)
4.1 離散傅里葉變換DFT(Discrete Fourier Transformation)
離散化多項式的一種方法是將值代入到多項式中辜窑,依次求出點值钩述。顯而易見,這種方法的復(fù)雜度是的穆碎,這與我們降低復(fù)雜度的想法是沖突的。
于是我們引入了FFT的經(jīng)典算法——Cooley-Tukey 算法职恳,來降低離散化的復(fù)雜度所禀,這是一個基于分治策略的算法方面。
給定一個多項式
我們將其根據(jù)奇偶項分成兩個項數(shù)相同的多項式(將多項式補(bǔ)充到,補(bǔ)充項數(shù)系數(shù)為0色徘。PS:為什么是
項呢恭金,后續(xù)將會提及):
顯而易見:
在進(jìn)一步之前:我們需要返回單位根的知識點。根據(jù)n次單位根的表達(dá)褂策,我們可以獲得一個等式
我們將其代入式子(14)横腿,(15)可得:
即
至此我們發(fā)現(xiàn)原本需要次代入值的等式降低到了
次,依次遞歸下去斤寂,則我們只需要遞歸
次即可在
的復(fù)雜度下求得式子耿焊,即我們求得
個點值對的復(fù)雜度為
,是可以接受的復(fù)雜度遍搞。
為了更加嚴(yán)謹(jǐn)?shù)淖C明罗侯,以下過程供還有疑問的讀者參考
由于式子(16)可得
則
其中求和中的直接被替換為
的原因是,經(jīng)過平方以后溪猿,負(fù)號被抵消钩杰。
復(fù)雜度公式則為
以上為Cooley-Tukey離散傅里葉變換DFT的思路。
我們回到為什么我們要將多項式補(bǔ)充到
項的問題上诊县,我們發(fā)現(xiàn)讲弄,根據(jù)Cooley-Tukey 分治的策略,我們需要每次分治的兩部分都有同樣的項數(shù)依痊,則總項數(shù)必須為
項垂睬。
4.2 逆離散傅里葉變換IDFT(Inverse Discrete Fourier Transformation)
經(jīng)過DFT,我們將多項式的系數(shù)表達(dá)轉(zhuǎn)換為多項式的點值表達(dá)抗悍。在完成乘法運(yùn)算以后驹饺,我們?yōu)榱双@取系數(shù)的變換,需要將多項式的點值表達(dá)轉(zhuǎn)換為多項式的系數(shù)表達(dá)缴渊。這時我們使用的方法是逆離散傅里葉變換IDFT赏壹,他是DFT的逆。
求解IDFT的過程實際上是一個求解線性方程的問題衔沼,給出個線性方程為:
矩陣形式如下:
假設(shè)上述矩陣為蝌借,則對于矩陣
中值
設(shè)兩個矩陣相乘以后的結(jié)果為
當(dāng)時,
當(dāng)時指蚁,
(其中由于為
次單位根菩佑,又因為
次單位根的
次為1,所以上式成立)
所以
則
則IDFT便是將對結(jié)果再做一次DFT凝化,即可獲得最后的系數(shù)稍坯。
回到為什么要有
取值的原因在于:為了多項式的點值表達(dá)轉(zhuǎn)換為多項式的系數(shù)表達(dá),我們需要系數(shù)矩陣可逆,為了使得系數(shù)矩陣可逆瞧哟,需要滿足矩陣滿秩混巧,為了滿足矩陣滿秩,我們需要使得矩陣的行數(shù)大于等于列數(shù)勤揩。則對于有
個系數(shù)的多項式咧党,必須要有
個以上的取值
四、FFT的實現(xiàn)過程以及FNT
在具體實現(xiàn)FFT的過程中陨亡,還需要考慮到對于每一次遞歸我們?nèi)绾芜M(jìn)行合理的劃分傍衡。于是這里引入bitreverse算法,也叫做蝴蝶變換负蠕。
如圖所示蛙埂,這是16個數(shù)進(jìn)行DFT變換劃分的過程。網(wǎng)上的步驟說的很復(fù)雜虐急,簡單來說箱残,對于DFT的第
舉例說明:
- 對于步驟一來說敬惦,第1次劃分盼理,二進(jìn)制第1位(即右邊第一位)為0的分到左邊,為1的分到右邊俄删。我們可以發(fā)現(xiàn)左邊都為偶數(shù)宏怔,右邊都為奇數(shù)。(因為奇數(shù)二進(jìn)制第1位為1)
- 對于步驟二的左半部分畴椰,第2次劃分臊诊,二進(jìn)制第2位(即右邊第二位)為0的分到左邊,為1的分到右邊斜脂。同理抓艳,右半部分,第2次劃分帚戳,也是二進(jìn)制第2位(即右邊第二位)為0的分到左邊玷或,為1的分到右邊。
- 同理片任,對每次的分組進(jìn)行劃分偏友,即可將所有的數(shù)字劃分到對應(yīng)的組中。
通過這種劃分方法对供,我們同時還能總結(jié)出另外一個規(guī)律位他,對于對于個數(shù)字中的任意一個位置的數(shù)字,假設(shè)原本位置為
,二進(jìn)制反轉(zhuǎn)的函數(shù)為
棱诱,則最后其所在的位置為
(第一個位置為0)泼橘,其中
為
位二進(jìn)制涝动。
舉例說明:
對于個數(shù)字中的
迈勋,則其
位二進(jìn)制的反轉(zhuǎn)為
,則其最后的位置為第
位(ps:圖中沒有繼續(xù)將所有的數(shù)字劃分到每組一個醋粟,讀者可自行劃分檢驗)
這里可以補(bǔ)充一個寫法:假如我們將原數(shù)組定義為靡菇,經(jīng)過反轉(zhuǎn)后的數(shù)組定義為
,則
米愿。
又因為如果是偶數(shù)厦凤,則
,則對于
育苟,但考慮到如果是
是奇數(shù)较鼓,則
,則對于
其中
為滿足
的最小值违柏。
綜合寫可以寫成
通過這個寫法博烂,我們可以直接寫出所有數(shù)字經(jīng)過DFT劃分后的結(jié)果。
參考:從多項式乘法到快速傅里葉