FFT(快速傅立葉變換)是數位訊號處理的超級經典算法,學過DSP或者晶片設計的人大多知道這個算法。但是,大家是否想過,為什麼數位訊號處理會有那麼多FFT呢?有人會說,為了分析信號的頻譜。那麼下邊的問題就是,分析頻譜對我們的日常需求,比如手機打電話,雷達測量速度和方向等等一些與實際需求有什麼聯繫?為什麼FFT如此重要?本文舉一些簡明的例子,闡釋一下FFT到底有什麼用。
先回憶一下FFT是什麼。上世紀70年代之前,我們主要通過模擬電路來進行信號處理,比如大家熟悉的用二極體和電容進行AM調製信號的包絡檢波一樣,隨著數字系統的普及,我們可以用處理器或者數字電路更為精確的處理信號,比如我們做AM檢波,實際上可以用載波把信號混頻(與餘弦函數做乘法),再進行低通濾波,那麼這個過程可以用數字電路的乘法器和FIR濾波器來做,FIR比二極體和電容構成的低通濾波器階數高的多,性能自然更為理想,同時,由於數字電路易於做成集成電路,因此我們更多地是將原先的模擬信號(比如麥克風的音頻)通過模擬-數字轉換器,轉換為數字值後進行處理。
這樣的系統有幾個問題,一個是信號需要被採樣,其次是信號被分成若干量階。信號被採樣,也就意味著我們得到的不是原先的連續的信號了,而是一個離散的一些採集的樣點。那麼對時域信號進行採樣,必然造成頻譜的周期化,如果原先頻譜僅限於有限的帶寬,那麼周期化之後,只要周期大於原先的帶寬,那麼實際上沒有混疊失真。而數字電路限制我們只能進行乘加等二進位域的計算,獲得另一些離散的點,因此我們不得不將頻譜也進行「採樣」,頻域的抽樣導致時域上又周期化了,好在如果我們只取有限的長度,可以假定沒採集的部分進行的是周期化延拓(由於平穩系統認為信號可以分解為正餘弦函數的組合,而正餘弦函數是可以周期延拓的,所以這個假設沒有問題),那麼我們得到了時域和頻域都是離散的周期延拓的點集。
既然是周期延拓的,那麼延拓的部分和主值區間(靠近0的那個周期)是重複的數值,因此我們只保留主值區間的部分,這樣的時域點集到頻域點集的變換關係叫離散傅立葉變換(DFT)。然而它的運算過於複雜,因此庫裡和圖基(Cooley,Tukey)兩人力圖化簡它,找到了這個算法的一些內在運算規律,得到的運算量由原來的平方級降為NlogN級,這個算法就叫按時間抽取快速傅立葉變換,桑德和圖基研究按頻率抽取也可以得到類似的低複雜度算法,這類算法統稱快速傅立葉變換(FFT),FFT的計算結果和DFT是完全等價的,只是運算量降低了。又由於時頻變換能量不變(Parseval定理),所以頻域的絕對數值沒有意義了,只要獲得相對數值即可,因此數字系統中的量化階數以及數字系統溢出後的縮放調整對FFT的計算結果影響僅在於精度,而不是對錯,從而,FFT正好滿足數字系統可以處理的前提,同時運算複雜度不高,因此獲得了廣泛的應用。
那麼,模擬系統能不能做類似的FFT呢?可以,構造與頻點數量相同個數的帶通濾波器,組成一個陣列,信號進入這個帶通濾波器組,每個濾波器只保留了相應頻點為中心的類似於sinc的頻響函數,那麼就可以得到FFT的結果。當然,這個代價不是一般的系統可以負擔的。所以,在沒有數字電路普及的年代裡,FFT基本是數學算法,是不可實現的。
現在知道FFT是什麼了,它是傅立葉變換的時頻離散後的可數字計算的一個變換算法,這個算法計算的對象是時域上周期延拓的點集的主值區間部分(有限個數),計算的結果是頻譜,也是周期延拓的點集的主值區間部分,與傅立葉變換等價的前提是採樣速率大於信號最大頻率的2倍(高頻延拓不混疊),同時時域有限長度之外的部分假定按周期延拓到無窮。為了滿足第一個前提,我們往往在信號處理之前(甚至是模數轉換之前)加入一個低通濾波器,使得高頻分量被抑制,對於比如聲音或者在某個頻帶內的通信系統,高頻分量本身就是無意義的,因此這個前提可以滿足。
為了滿足第二個前提,我們需要保證採集的樣本在採集區外的數值與假想的周期延拓的數值一致,這顯然做不到,做不到導致的結果是什麼呢?頻譜出現洩漏,也就是頻譜能量會分散到帶外(比如餘弦不再是一根譜線,而是sinc),分散的過程可以看做時域加矩形窗(和門函數相乘)導致的,那麼頻譜相當於和sinc函數的卷積,時域窗越小(也就是採集的點越少),頻譜sinc的主瓣越寬,頻譜洩露越嚴重,也就是原先一個頻點的能量會被散發到更大的附近範圍裡,而自己的峰值會降低,如果相鄰點各有個峰值,那麼散發後就難以分辨了,所以系統的實際解析度與時域窗的長度成反比,採集更多的點,才有可能獲得更精細的頻譜。那麼,有沒有辦法減輕這個洩露呢?那麼,最好讓邊界處的取值點起的作用小一點,中間的部分權重大一點,那麼實際上就乘了一系列加權的數值,這些數值形成的是一個時域的窗函數,加窗之後,頻譜洩露會減輕,能量會集中一些,但是主瓣會更寬,這是一個權衡。就這樣,兩個前提條件得以近似滿足,雖然不是完全,但是也夠用了。
這些都是比較基礎的知識了,下面說說有趣的事情。如果FFT只用於分析確定性的平穩信號,類似於正弦或者若干正弦的複合的無限長周期信號之類,看看譜線什麼的,它將不會有今天的地位。它還能用來幹嘛呢?