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