摘 要: 在數字信號處理中,FFT運算具有非常重要的作用。傳統FFT算法具有原位計算的特點,原位FFT算法在自然序輸入時輸出呈逆序狀態,因此為了得到自然序的結果數據,就必須對全部FFT輸出數據進行整序。使用查找表整序是從FFT的逆序輸出結果中直接讀取自然序結果數據。試驗證明,在獲取全部FFT結果數據時,查找表整序相比傳統整序在時間效率上可以提高一倍,并且在連續FFT分析的情況下,優勢會更明顯。
關鍵詞: FFT;逆序;整序;查找表
0 引言
在原位FFT運算過程中,當輸入數據為自然序時,由于FFT算法過程對輸入數據的多次“奇偶抽取”,使得輸出數據呈逆序狀態,即輸出數據的索引和自然序索引的二進制表示呈相互位逆序狀態[1]。因此必須對輸出數據進行整序,才能得到自然序的結果。即一次FFT分析包括FFT計算和對FFT逆序輸出的整序。FFT分析幾乎都在DSP處理器中完成,DSP處理器通過內部CPU逐條執行軟件指令來完成各種運算和邏輯功能[2]。因此,在DSP內執行一次FFT算法,必須順序執行FFT計算和整序操作[3-5]。研究者為提升整序效率進行了多種改進,有的是對整序過程中的逆序數計算進行了多種改進,比如逆序數生成法[6-7]和分組數據交換法[8],但這些改進只關注了整序過程中的逆序數計算這一個方面;有的將逆序數計算與整序結合在一起,比如任意基的快速整序算法[9-10],但這種方法理解起來很困難[11]。
在實際應用中,所感興趣的目標FFT數據,無論是全部FFT數據還是部分數據,都可看作全部自然序的FFT結果中的一段,那么可以設法從FFT逆序輸出中直接獲取這一段目標數據。即首先明確目標數據段在整序后的FFT結果中的位置,計算這些位置索引值的逆序數并存儲在一個查找表中,然后根據此查找表就可以在FFT的逆序輸出數據中直接提取目標數據。采用此算法將逆序數的計算從整序過程中剝離,簡化整序過程,提高整序效率。使用查找表整序的方式易于理解,操作簡單,并且在需要進行連續FFT分析的情況下會體現出很大的優勢。
1 FFT算法的原位計算的特點
圖1是8點的時域抽取基-2的原位FFT算法流程,輸入數據是自然序的,輸出數據為逆序狀態[4]。
對圖1中FFT的輸入數據和輸出數據的索引變化在表1中予以反映。
由表1可見,原位FFT的輸入數據為自然序,輸出數據為逆序,并且將自然序索引二進制表示的比特排列順序完全逆過來,就得到逆序索引的二進制表示[5]。因此為了得到自然序的FFT結果,就需要對FFT的逆序輸出結果進行整序。傳統的整序算法是在原位FFT計算完畢后依自然序遍歷每一個輸出數據,先通過“比特倒序”運算計算自然序索引的逆序數,此逆序數就是輸出數據的正確索引值,再以逆序數為索引調整這個FFT數據的位置,最后得到全部自然序的FFT結果數據。在DSP內只能使用高級語言編碼實現位逆序時,傳統做法是利用產生逆序數的十進制運算規律,采用循環迭代計算逆序數[4-5]。
一次傳統的N點原位FFT分析需要計算N個索引值的逆序數才能得到全部的自然序結果,進而才能獲取自然序結果中的某一段目標FFT數據。對于需要連續進行FFT分析的情況,無論是獲取全部FFT數據還是一段FFT數據,每一次N點FFT分析都需要重新計算一遍N個索引值的逆序數。對于重復計算,可以只計算一次,因此可以優化FFT分析中的整序過程。
2 基于查找表整序算法
無論所需要的目標數據是全部FFT結果還是部分FFT結果,都可以事先計算目標數據在整個FFT結果中位置索引的逆序數,并將這些逆序數存儲在一個查找表中,然后根據此查找表在FFT逆序輸出數據中直接提取自然序的目標數據。在需要對信號進行連續FFT分析的環境中,查找表的計算可以在FFT分析前完成,并且只需計算一次。這種整序方式可以省去FFT分析過程中計算逆序數的時間,縮短單次FFT分析時間,提高單位時間內的FFT分析次數,提高信號分析效率。
設N點原位FFT運算,對目標數據在全部自然序的FFT結果中的位置索引進行逆序操作,由于自然序和逆序索引的二進制表示之間是比特倒置關系,于是需要將每個自然序索引值二進制表示的最低位移向最高位,次低位移向次高位直到完成這個自然序索引值的位逆序過程。將一個索引值的位逆序函數設為BitReverse(intiSourceIndex,intiBitNum),其返回值為一個逆序數;所獲取的查找表設為IndexArray。位逆序的計算流程圖如圖2所示。
圖2中,iSourceIndex是待逆序的索引值,iBitNum是FFT計算點數的二進制位數,iDesIndex是BitReverse()函數返回的逆序數。構造FFT結果的數據查找表的流程圖如圖3所示。
圖3中,iStart為目標數據在整個FFT自然序結果中的起始位置,iDataLen為目標數據的長度,由BitReverse()函數的返回值iDesIndex構成一個位置查找表IndexArray。于是,通過查找表從位置索引為iDesIndex的FFT逆序輸出中獲取自然序的目標結果數據。相比于傳統的整序方式,使用查找表整序可以省去FFT分析過程中逆序數的計算過程。下面的試驗在FFT計算完畢后,統計了傳統整序和使用查找表整序所消耗的時鐘周期個數,進而比較兩種整序方式的時間效率。
3 試驗
試驗環境是TI公司提供的高效C編譯器和集成開發環境Code Composer Studio,選擇C67xx CPU Cycle Accurate Simulator處理器。在獲得相同整序結果的前提下,比較傳統整序和使用查找表整序的耗時情況。試驗中,N點自然序數據作為FFT的輸入,目標數據為全部FFT結果數據。在FFT計算完畢后,對FFT的逆序輸出數據采用不同的整序方式得到自然序結果數據,統計兩種整序方式所消耗的時鐘周期數,并通過對比時鐘周期數得到兩種整序過程在時間效率上的差別。
記錄N點FFT中傳統整序和查找表整序所消耗的時鐘周期個數,并計算后者與前者的百分比以觀察時間效率的改善情況。運行情況記錄如表2所示。
由表2可見,單獨就整序過程而言,使用查找表整序比傳統的整序在時間效率上可以提高一倍多。如果僅需要得到某一段FFT結果數據,傳統整序首先要對N點FFT的全部逆序輸出進行整序,然后再截取目標數據,而使用查找表整序則可以從FFT逆序輸出數據中直接獲取任意長度的目標數據,并且目標數據的長度越短,查找表長度越短,獲取目標數據的時間效率就越高。
對于N點原位FFT運算,傳統整序需要計算N點索引的逆序數。使用查找表進行整序,假設目標數據長度為M(M≤N),則查找表內索引個數為M,索引數據類型設為32 bit整型,那么所需分配的空間為M×32 bit。計算查找表時可以在FFT分析前進行,這部分時間不占用FFT分析時間。對于單次FFT分析,增加M(M≤N)點數據空間可以為FFT計算節省N次逆序數的計算時間;對于連續FFT分析,不妨設連續分析n次,可以節省n×N次逆序數的計算時間。
4 結論
本文在充分理解原位FFT的計算特點后,在FFT分析前,對目標數據在全部FFT結果中的位置索引計算逆序數,并將計算結果存儲為一個查找表,然后通過此查找表從FFT的逆序輸出中獲得自然序結果。試驗結果證明,相比于傳統的整序,使用查找表整序時間高效并且簡單實用,具有普遍的實用價值。比如,在軟件無線電領域,一般的無線電信號帶寬比較窄,頻率范圍比較寬,通常使用帶通采樣,因此對無線電信號進行FFT計算時,只關心某一段結果數據;并且在需要對無線電信號進行連續監測的環境中,系統希望快速獲取每一次的FFT分析結果,在這種情況下,使用查找表整序處理FFT的逆序輸出就具有很大的優勢。于是,使用查找表整序節省了FFT分析的整序時間,從而提高了FFT分析的時間效率。
參考文獻
[1] 方志紅,張長耀,俞根苗.利用逆序循環實現FFT運算中倒序算法的優化[J].信號處理,2004,20(5):533-535.
[2] 劉衛新.實現FFT整序方法的研究[D].南京:南京理工大學,2003.
[3] 高麗,劉衛新,張學智.FFT標準移序算法的優化[J].探測與控制學報,2004,26(2):62-64.
[4] 丁玉美,高西全.數字信號處理[M].西安:西安電子科技大學出版社,1995.
[5] 姚天任.數字信號處理[M].北京:清華大學出版社,2011.
[6] 張學智,蔡暉.快速實現FFT的逆序方法[J].探測與控制學報,2001,23(2):62-64.
[7] 喬春明,朱冰蓮.快速傅里葉變換中逆序數計算的一種快速算法[J].信息技術,2011(8):164-165.
[8] 張學智,毛俊.無須逆序數的FFT整序的一個新方法[J].探測與控制學報,2002,24(2):61-63.
[9] 林水生,黃順吉.一種實現任意基的快速整序算法[J].電子科技大學學報,1998,27(4):343-346.
[10] 林水生,黃順吉.改進的任意基FFT整序算法[J].信號處理,1999,15(2):163-165.
[11] 賈淵,王俊波,姬長英.FFT快速整序算法的對比、改進及實現[J].電子科技大學學報,2009,38(2):292-295.