FFT算法

FFT算法

FFT算法(fast Fourier transform),即快速傅立葉變換,是指利用計算機計算離散傅立葉變換(DFT)的高效、快速計算方法的統稱,簡稱FFT。快速傅立葉變換是1965年由J.W.庫利和T.W.圖基提出的。採用這種算法能使計算機計算離散傅立葉變換所需要的乘法次數大為減少,特別是被變換的抽樣點數N越多,FFT算法計算量的節省就越顯著。

基本介紹

  • 中文名:FFT算法
  • 外文名:fast Fourier transform
  • 定    義:離散傅立葉變換的快速計算方法
  • 套用學科:計算機原理術語
概念,工作原理,時間抽取算法,頻率抽取算法,

概念

有限長序列可以通過離散傅立葉變換(DFT)將其頻域也離散化成有限長序列。但其計算量太大,很難實時地處理問題,因此引出了快速傅立葉變換(FFT). 1965年,Cooley和Tukey提出了計算離散傅立葉變換(DFT)的快速算法,將DFT的運算量減少了幾個數量級。從此,對快速傅立葉變換(FFT)算法的研究便不斷深入,數位訊號處理這門新興學科也隨FFT的出現和發展而迅速發展。根據對序列分解與選取方法的不同而產生了FFT的多種算法,基本算法是基2DIT和基2DIF。FFT在離散傅立葉反變換、線性卷積和線性相關等方面也有重要套用。
快速傅氏變換(FFT),是離散傅氏變換的快速算法,它是根據離散傅氏變換的奇、偶、虛、實等特性,對離散傅立葉變換的算法進行改進獲得的。它對傅氏變換的理論並沒有新的發現,但是對於在計算機系統或者說數字系統中套用離散傅立葉變換,可以說是進了一大步。
設x(n)為N項的複數序列,由DFT變換,任一X(m)的計算都需要N次複數乘法和N-1次複數加法,而一次複數乘法等於四次實數乘法和兩次實數加法,一次複數加法等於兩次實數加法,即使把一次複數乘法和一次複數加法定義成一次“運算”(四次實數乘法和四次實數加法),那么求出N項複數序列的X(m),即N點DFT變換大約就需要N^2次運算。當N=1024點甚至更多的時候,需要N2=1048576次運算,在FFT中,利用WN的周期性和對稱性,把一個N項序列(設N=2k,k為正整數),分為兩個N/2項的子序列,每個N/2點DFT變換需要(N/2)^2次運算,再用N次運算把兩個N/2點的DFT變換組合成一個N點的DFT變換。這樣變換以後,總的運算次數就變成N+2*(N/2)^2=N+N^2/2。繼續上面的例子,N=1024時,總的運算次數就變成了525312次,節省了大約50%的運算量。而如果我們將這種“一分為二”的思想不斷進行下去,直到分成兩兩一組的DFT運算單元,那么N點的DFT變換就只需要Nlog2N次的運算,N在1024點時,運算量僅有10240次,是先前的直接算法的1%,點數越多,運算量的節約就越大,這就是FFT的優越性。

工作原理

計算離散傅立葉變換的快速方法,有按時間抽取的FFT算法和按頻率抽取的FFT算法。前者是將時域信號序列按偶奇分排,後者是將頻域信號序列按偶奇分排。它們都藉助於的兩個特點:一是周期性;二是對稱性,這裡符號*代表其共軛。這樣,便可以把離散傅立葉變換的計算分成若干步進行,計算效率大為提高。

時間抽取算法

 令信號序列的長度為N=2,其中M是正整數,可以將時域信號序列x(n)分解成兩部分,一是偶數部分x(2n),另一是奇數部分x(2n+1),於是信號序列x(n)的離散傅立葉變換可以用兩個N/2抽樣點的離散傅立葉變換來表示和計算。考慮到和離散傅立葉變換的周期性,式⑴可以寫成
⑶其中(4a)(4b)由此可見,式⑷是兩個只含有N/2個點的離散傅立葉變換G(k)僅包括原信號序列中的偶數點序列,H(k)則僅包括它的奇數點序列。雖然k=0,1,2,…,N-1,但是G(k)和H(k)的周期都是N/2,它們的數值以N/2周期重複。
因為於是由式⑶和式⑷得到(5a)(5b)
因此,一個抽樣點數為N 的信號序列x(n)的離散傅立葉變換,可以由兩個 N/2抽樣點序列的離散傅立葉變換求出。依此類推,這種按時間抽取算法是將輸入信號序列分成越來越小的子序列進行離散傅立葉變換計算,最後合成為N點的離散傅立葉變換。
通常用圖1中蝶形算法的信號流圖來表示式⑸的離散傅立葉變換運算。例如,N=8=2的抽樣點的信號序列x(n)的離散傅立葉變換,可用如圖2所示的FET算法的信號流圖來計算。
① N=2點的離散傅立葉變換的計算全由蝶形運算組成,需要M級運算,每級包括N/2個蝶形運算,總共有 個蝶形運算。所以,總的計算量為次複數乘法運算和N log2N次複數加法運算。
② FFT算法按級疊代進行,計算公式可以寫成
N抽樣點的輸入信號具有N個原始數據x0(n),經第一級運算後,得出新的N個數據x1(n),再經過第二級疊代運算,又得到另外N個數據x2(n),依此類推,直至最後的結果x(k)=xM(k)=X(k)在逐級疊代計算中,每個蝶形運算的輸出數據存放在原來存貯輸入數據的單元中,實行所謂“即位計算”,這樣可以節省大量存放中間數據的暫存器。
③ 蝶形運算加權係數隨疊代級數成倍增加。由圖2可以看出係數的變化規律。對於N=8,M=3情況,需進行三級疊代運算。在第一級疊代中,只用到一種加權係數;蝶形運算的跨度間隔等於1。在第二級疊代中,用到兩種加權係數即、;蝶形運算的跨度間隔等於2。在第三級疊代中,用到4種不同的加權係數即、、、;蝶形運算的跨度間隔等於4。可見,每級疊代的不同加權係數的數目比前一級疊代增加一倍;跨度間隔也增大一倍。
④ 輸入數據序列x(n)需重新排列為x(0)、x⑷、x⑵、x⑹、x⑴、x⑸、x⑶、x⑺,這是按照二進制數的碼位倒置所得到的反序數,例如N=8中數“1”的二進制數為“001”,將其碼位倒轉變為“100”,即為十進制數“4”。

頻率抽取算法

按頻率抽取的 FFT算法是將頻域信號序列X(k)分解為奇偶兩部分,但算法仍是由時域信號序列開始逐級運算,同樣是把N點分成N/2點計算FFT,可以把直接計算離散傅立葉變換所需的N次乘法縮減到次。
N=2的情況下,把N點輸入序列x(n)分成前後兩半
時間序列x1(n)±x2(n)的長度為N/2,於是N點的離散傅立葉變換可以寫成
(8a)
(8b)
頻率信號序列X(2l)是時間信號序列x1(n)+x2(n)的N/2點離散傅立葉變換,頻率信號序列X(2l+1)是時間信號序列【x1(n)-x2(n)】的N/2點離散傅立葉變換,因此,N點離散傅立葉變換的計算,通過兩次加(減)法和一次乘法,從原來序列獲得兩個子序列,所以,頻率抽取算法也具有蝶形運算形式。以2為基數的FFT基本蝶形運算公式為
其計算量完全和時間抽取算法一樣,即只需次乘法運算和Nlog2N次加(減)法運算。圖3 表示N=8=2點的離散傅立葉變換的信號流圖。由圖可見,它以三級疊代進行即位計算,輸入數據是按自然次序存放,使用的係數也是按自然次序,而最後結果則以二進制反序存放。
實際上,頻率抽取算法與時間抽取算法的信號流圖之間存在著轉置關係,如將流圖適當變形,可以得出多種幾何形狀。
除了基2的FFT算法之外,還有基4、基8等高基數的FFT算法以及任意數為基數的FFT算法。

相關詞條

熱門詞條

聯絡我們