談談FFT有何用

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只用於分析確定性的平穩信號,類似於正弦或者若干正弦的複合的無限長週期信號之類,看看譜線什麼的,它將不會有今天的地位。它還能用來幹嘛呢?

1,做快速相關
相關在數字信號處理的重要程度可以說是炙手可熱級別的。簡單的講,如果你不知道信號中的某個參數(比如頻率,或者相位,或者碼片序列,或者成型波形),那麼你就設計帶有這個參數的所有可能值的一組信號跟它做一下相關,看看結果最大的那個,所對應的參數就是最有可能的了,這個算法叫做最大似然檢測,相關往往作爲最大似然檢測的實際執行過程。而很多時候,這個需要被測量的參數是和時間延遲有關的,舉個例子,手機開機後,要和基站同步,也就是說要知道每個數據幀開始的時刻,那麼怎麼得到呢?首先基站和手機有一個協議,在幀的某個位置會有一個固定的序列,這個序列調製後會有一個固定的波形,那麼手機就可以製造有若干延遲的波形副本,與接收到的波形相關,那麼得到峯值所對應的延遲就可以換算出幀的起始時刻。有關相關的強大以後找機會再聊,那麼相關和FFT有什麼關係呢?相關和卷積都是複雜度非常大的運算,每計算一個延遲下的相關值,都需要兩個波形所有非零部分對應相乘並且加和得到,所有的延遲下相關值構成一條曲線,叫相關函數。而當把信號轉換爲頻域後,獲取相關函數的過程可以被簡化成一個信號的共軛(把虛部取反)與另外一個信號相乘的過程。即使加上正負兩個FFT的開銷,算下來仍然比原來小很多(N方和NlogN級的差別),這樣一來,相關算法的複雜度被大大降低。那麼有時候,輸入的信號太長了,怎麼辦?大家又發現相關操作可以分段進行,可以逐段相關最後拼合起來,就得到了相關後的結果。這樣一來,手機的定時的操作可以用一個快速相關的過程搞定。再舉個例子,雷達如果想定位一個目標的距離,怎麼做呢?最簡單的想法是打一個衝擊信號,看它什麼時候回來,時延乘上光速除以2就是距離,但是,類似於衝激函數的波形對於功放來講實在很難實現,因此雷達系統實際上打出去的是具有一定時間長度的帶寬很大的信號,比如chirp或者某種成型,在接收時,我們需要知道這個信號被延遲了多少,因此把它和本地的成型波形副本進行相關,成功的相關操作會得到一個帶有若干峯值點的波形,這些峯值點對應的位置就是若干目標的回波時延值,換算出來就是位置,這個將波形能量壓縮到點的過程一般是採用FFT實現的。

2,快速卷積
類似與相關,信號處理的一大操作類型是卷積,一個系統可以採用系統函數來表徵,其輸出就是輸入數據卷積上系統函數,或對於平穩的隨機信號而言,輸出爲輸入數據卷積上系統函數模值的平方。卷積操作常常用於對信號進行FIR濾波,因爲FIR濾波器是不帶反饋的,沒有記憶,可以用卷積算法直接得到輸出。那麼,如果數據是塊數據(不是按時鐘節拍的流數據),用快速卷積就可以降低運算量。其過程與快速相關雷同,區別是頻域相乘時無需共軛。想一下,如果FM收音機收到好幾個臺,相互靠的很近,怎麼辦?可以採用階數比較高的FIR帶通濾波器選出想要的那個臺,例如德生的DSP芯片解調的收音機可以做到0.01MHz的分辨率,這就是現在我們的數字FM收音機比原來的模擬FM收音機音質好的原因之一。

3,經典譜估計
在實際的生活裏,我們不可能見到的都是確定的無限長的正餘弦類的疊加的信號,最起碼這樣的信號在傳輸過程中也會疊加上噪聲,即高斯白噪聲,因此傅里葉變換頻譜分析的前提無法滿足,這樣的時頻變換也就沒有了實際意義,退一步,我們可以分析的往往是無限長的,隨機的,但在隨機意義上(自相關等二階統計特性上)平穩的信號,如果達不到這個前提,起碼可以在某個時間段內滿足。這樣的信號往往自身是隨機的,但是自相關和互相關特性往往包含信號的二階統計信息。而對於實際的系統,我們只能估計它,相關函數估計的一個基礎方法是將一個信號和帶有延遲並共軛後的另一個信號的點乘運算,得到的是基於延遲的函數。上文已述,用FFT就可以搞定它。
在這種隨機信號的分析上,有一個重要的定理,叫做winner-khintchine定理,它證明了信號的自相關和信號的功率譜之間的關係是FFT變換。這個有意思的橋樑使得我們可以做幾件事,一個是利用自相關的估計通過FFT得到功率譜,而自相關估計通過快速相關算法計算。細心的人會發現,這個流程最後一個FFT緊接IFFT,抵消後實際上只需要一個FFT,而不是三個,那麼這樣的功率譜估計叫週期圖法功率譜估計,也是我們最經常使用的經典譜估計。值得注意的是,信號的功率譜實際上對應的是自相關的理想值,而不是通過接收到的數據得到的估計值(上邊用快速相關算的是估計值),這個估計如果採用了邊界處的點,那麼相關的數值由於假象邊界外數值爲0而造成了偏差,如果我們只利用中心的若干點,那麼會相對準確一些,這個計算自相關後選取可靠的點,再進行傅里葉的做法叫做自相關法功率譜估計。最有趣的是,兩個方法可以複合使用,先對數據分段交疊進行週期圖估計,取這些結果的均值IFFT得到自相關,取自相關的加窗(類似於上文的加權的作用)得到更好的自相關估計,再FFT得到譜估計,這個方法是認爲改進的比較好的經典譜估計,叫Welch法。這些方法之所以能夠被接納,主要是由於FFT的橋樑的作用。否則,這樣的方法就無法應用到系統中了。頻譜儀這類的儀器就可以採用這些經典譜估計算法(當然也有掃頻的)。另外,由於功率譜的峯值的下標代表着信號的頻率,如果這個信號是物體的反射回波,那麼可以根據多普勒公式換算出物體的速度,一類採用這種測速機制的雷達叫脈衝多普勒雷達。

4,現代譜估計
爲了取得更精確的譜估計,有些學者認爲可以通過構造模型,並且設待定參數的方法,獲得更好的譜估計,只要系統模型設計得合理,待定參數被估計得有效,那麼對信號的譜估計可以轉化爲這個模型的譜,這樣就可以得到更爲精確的估計效果。這樣的基於模型的譜估計叫現代譜估計。那麼怎麼叫合理呢?大家認爲歐式距離最小化比較合理,也就是最小均方準則,在這個準則下,加上線性系統的前提條件,那個有趣的平方的期望被轉化爲系統的自相關和互相關項(Wiener-Hopf方程),而這兩個項的估計方法,無需多問,也只能是採用快速相關完成比較有效,這就是FFT在有了現代譜估計,AR模型,MA模型等理論以後,仍能派上用場的一些原因。起碼在計算上,自相關法是已知的AR參數估計方法中最簡單的一種。估計出模型後,我們還可以做別的事情,比如根據模型來估計信號未來的趨勢,叫做信號的預測,也可以對已經採集的信號通過這個模型進行平滑處理等等。再比如,如果想測量一個物體的方位怎麼做?在現代雷達中,一般會有一個天線陣列,如果接收到的物體的回波與天線陣列有個角度的話,那麼不同的天線會接收到回波不同時刻(不同相位,幅度基本不變)的值,那麼,可以利用若干天線的回波信號估計出若干目標物體的方位角度,叫做到達角(DOA)估計,有兩個經典的算法:MUSIC和ESPRIT,他們都是二階統計信號算法,依賴於自相關矩陣作爲計算的起始,因而FFT可以作爲自相關估計的快速算法。

5,構建正交系統
一個FFT得到的離散頻譜和原先的連續頻譜在離散點之間值遵循什麼規律?這些部分可以認爲是一族正交的sinc函數疊加的結果,也可以認爲是一個主瓣寬度爲頻譜間隔寬度的sinc函數與沖積函數串卷積的結果(因爲時域是矩形窗與原信號相乘的結果),此處的正交指的是一個離散點的值與另一個離散點的值沒有關係,互不影響,這樣的系統可以用來構建通信收發信機,由於採用sinc函數正交的效果是頻譜效率最好的(採用抑制帶寬的辦法雖然可以抑制每個子帶的帶外旁瓣,但是會造成時域信號的延拓,從而造成符號間干擾)。正交頻分複用(OFDM)正是利用了各個離散頻點之間的正交特性構建了一個高性能低運算複雜度的收發機。其工作原理是首先將要發射的數據放置在各個頻點上,一般採用QAM或PSK調製,之後IFFT得到時域信號發射出去,這些頻點數據形成的時域發射波形實際上是一組頻率倍數關係的正交餘弦函數,接收機收到這樣的信號後,再進行FFT,轉換到頻域(或者說是正交域),從而得到每個頻點上的傳輸的符號的估計。這個系統的巧妙之處在於克服了寬帶無線通信系統的多徑衰落,因爲,從整個頻帶上看,信道不是一個常數,有的頻點的數值增強了,有的減弱了,同時還有相位扭曲。但是當把它分成很多正交的子信道之後,這些信道內部可以看做爲平坦的,那麼通過均衡器,比如迫零均衡之後,我們就可以得到類似於衝擊響應的子信道特性,從而解調出每個子信道符號的值。由於子信道之間正交,互不干擾,因此可以實現多載波通信,並行傳輸所有的數據,大大加快了傳輸速度,這也就是4G移動通信速度可以達到百兆甚至更高的核心技術之一。

如今,FFT運算能力已經成爲處理器的性能標尺之一(http://www.fftw.org/benchfft/ffts.html)。比如一個TI C6000系列的高性能DSP處理器,可以在半個時鐘輸出一個數據點,那麼可以做到幾百兆比特每秒的處理速率。硬件的優化使得FFT已經成爲信號處理算法內部的高速公路。

FFT的意義可能遠不止這些,而且也有許多的變種,比如二維FFT,DCT等等,在圖像領域發揮着圖像模糊(清晰),輪廓化,壓縮等貢獻。本文只是一個引子,讓致力於研究和開發數字系統的同行能夠更清晰地理解系統的原理和算法的實質。所提及的內容都是信號處理的基礎書籍,一般的碩士課程多有涉及,如此整理一番也算有點新意,希望對大家有所借鑑。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章