這篇文章主要回顧筆者在求學期間的一些記憶。當時曾經被「快速計算方法」這門課折磨得不輕,許多理論內容雖然當時學過,但畢業後工作一段時間,早已少有接觸。最近重新翻閱舊筆記與程式碼,趁機整理一下,也當作幫自己複習一遍
快速傅立葉轉換( Fast Fourier Transform, FFT),計算離散傅立葉轉換的一種演算法,更準確地來說這裡我們介紹的是Cooley–Tukey FFT algorithm
首先我們從離散傅立葉轉換(Discrete Fourier Transform, DFT)定義開始,因為文章篇幅有限,我這裡純粹從計算角度出發,如果想要了解從傅立葉轉換角度、或是從訊號系統角度、可以參考文章,裡面介紹得非常清楚
離散傅立葉轉換(Discrete Fourier Transform, DFT)
離散傅立葉轉換,就是在時間域與頻率域都進行離散採樣,對於一個
相對的還有另一個轉換稱為逆離散傅立葉轉換(Inverse Discrete Fourier Transform, iDFT)
逆離散傅立葉轉換,可以將向量從頻域轉換回時域
其中
上圖是一個
可以發現
- 【週期性】
- 【對陣性】
- 【週期可除性】
如果 是 的因數 - 【正交性】
PF:
【週期性】
【對陣性】
週期可除性:
【正交性】
假設
Case (1) 是 的倍數 令
,則 所以:
Case (2)
且 不是 的倍數 設
,則 ,而 為首項為 ,公比為 ,共 項的等比級數: 又因為 所以: 綜合以上Case (1)、Case (2) 討論
🔸FFT與卷積的關係
對於長度為
: :
因此,
- 當
時, - 當
時,
因此,卷積結果
繼續觀察式(1)發現
所以在離散卷積(Discrete
Convolution)中需假設,當索引值超過數列的範圍時,其值為零,也就是:
離散卷積滿足對陣性(commutativity),也就是
PF:
這裡
是遍歷 的索引。為了對調 和 的角色(證明交換性),我們做變數代換: 考慮變數替換後的求和範圍 令 原本:
是從 到 對應到
,會得到:
- 當
, - 當
, 所以新的求和範圍為:
是從 到 在數學求和的符號中,習慣寫為下界小、上界大,所以順序會寫成:
是從 到 注意:在倒數第二個等適中, 乘 法 交 換 性 改 寫 的 範 圍 與 僅 是 符 號 , 沒 差 的求和範圍可以改變的原因是:
- 若
超出 的定義範圍,則 - 若
超出 的定義範圍,則 因此,兩個總和的非零項完全一致,只要
和 都滿足「當索引直超出陣列範圍時,其值為零」的假設,也就是說: 兩邊實際參與運算的項目都只有那些索引合法的部分,其它相乘為零的部分不影響總和。 綜合以上討論,我們證明了離散卷積滿足對陣性
除了證明之外,我們也舉簡單的例子來說明對陣性
令:
, ,
方法一:
我們計算
方法二:
現在用:
🔸補零捲積(Zero Padding)
在推導,卷積定理的時候,需要將兩個數列做DFT,然後使用卷積,在使用iDFT,但是離散卷積的結果向量會讓長度變長(從
- 循環離散卷積 (Circular Discrete
Convolution):將序列視為週期性的(模
),適合處理頻域計算或週期訊號。 - 補零卷積 (Zero Padding Convolution):將兩個序列補零,使其長度足以容納完整的線性卷積結果。
這裡我們採取補零卷積 (Zero Padding Convolution)來推導
設
定義補零後的序列:
for , 否則為 0 for , 否則為 0
這樣
📘離散捲積定理
若對補零後的序列
分別取取 DFT得到 ,並進行頻域逐點相乘,再用iDFT轉換回時域,即可得到它們的線性捲積結果,也就是滿足一下等式:
🔸捲積定理的推導(Zero Padding + DFT)
考慮兩個經過 Zero Padding 補零 到相同長度
✨補充:這裡我們能合併成
是因為兩個序列都已經補零到長度 ,也就是同一週期的旋轉因子。
回到時域:對
將式 (3) 代入上式 (4):
觀察指數和這一項,回想旋轉因子【正交性】:
以上指數和只會在一種情況下為 1:當
變數變換後得到:
與 同時存在(即不為 0)時,該乘積項才有效。- 如果
超出 的範圍,那麼 ,自然對總和無影響。
因此,
下一篇文章中我們會開始介紹演算法的部分,也就是有名的Cooley–Tukey FFT演算法