FFT在低功率微程序控制器中的應(yīng)用
利用開環(huán)來獲得位倒置(其中N=256):
3.4 基為2的FFT算法
在對(duì)樣本執(zhí)行位倒置后,即可以計(jì)算FFT了。利用蝶形方法(見圖1)計(jì)算基為2的FFT的固件包括3個(gè)主要的循環(huán)。在循環(huán)之外包括log2N的FFT計(jì)算階段。在每一階段循環(huán)內(nèi)部執(zhí)行單獨(dú)的蝶形運(yùn)算。FFT算法的核心是執(zhí)行每一蝶形運(yùn)算的塊碼。不幸的是,這一塊碼的計(jì)算是不輕便的。MUL_1與MUL_2利用微處理器的硬件乘法來執(zhí)行乘法。
3.5 復(fù)數(shù)轉(zhuǎn)化為極坐標(biāo)表示
為了計(jì)算輸入信號(hào)的幅值,必須將復(fù)數(shù)X(k)轉(zhuǎn)換為極坐標(biāo)來表示。幅值將代替在固件中不再需要的FFT中的原來的值。
式(4)中決定了二維的LUT其幅值而不是其計(jì)算。第1個(gè)值是頻譜實(shí)部4個(gè)最重要的位,而第2個(gè)值是頻譜虛部4個(gè)最重要的位。為了獲得這些最重要的位,16位有符號(hào)數(shù)右移11次。頻譜的實(shí)部與虛部都可以被用作下標(biāo)時(shí),它們被其絕對(duì)值代替了(因此符號(hào)位將是零)。
從式(6)中,可以知道頻譜是以X(N/2)對(duì)稱的,只有前N/2+1個(gè)幅值被轉(zhuǎn)化為極坐標(biāo)表示。同樣,對(duì)于輸入樣本為實(shí)數(shù)的頻譜虛部中的X(0)與X(N/2)通常為零。因此這兩個(gè)幅值通常分別是單獨(dú)計(jì)算的。固件中用來自動(dòng)計(jì)算X(k)的包括原碼。
3.6 海明窗或漢寧窗
為了實(shí)現(xiàn)此任務(wù)的固件包括LUTs(Q8.7形式)將海明窗或漢寧窗應(yīng)用到輸入樣本中。加窗對(duì)于防止泄漏是有用的。加窗可以在時(shí)域上對(duì)輸入樣本截短。海明窗的方程如方式(8)所示,而漢寧窗則如式(9)所示。
同樣,這些實(shí)際固件的注釋包括自動(dòng)為這些窗函數(shù)產(chǎn)生LUTs的原碼。
4 測(cè)試結(jié)果
為了對(duì)FFT結(jié)果測(cè)試,利用微處理器中的通用異步收發(fā)報(bào)機(jī)端口。固件將幅值X(k)上傳到PC上。這個(gè)程序包括FFT圖表,即利用一個(gè)窗口應(yīng)用程序從PC中的串行端口中讀取這些幅值,實(shí)時(shí)地將計(jì)算得到的幅值利用圖表畫出來。利用微處理器對(duì)4個(gè)不同輸入電壓信號(hào)進(jìn)行200Kb/s采樣,并在圖2中輸出其FFT圖像。本文引用地址:http://butianyuan.cn/article/162918.htm
5 結(jié)語
當(dāng)然你可以利用無限的時(shí)間來優(yōu)化及計(jì)算FFT。但是本文采取了基為2的FFT,這種方法可以很大限度地減少計(jì)算FFT所需要的加法與乘法。由于篇幅問題,有很多提高執(zhí)行FFT速度的優(yōu)化方法并沒有在本文中給出。例如,對(duì)于實(shí)數(shù)的輸入樣本信號(hào),輸入樣本的虛部通常為零,而且只有開始的一半頻譜是重要的。利用這個(gè)信息,第一和最后一個(gè)FFT階段就可以更快速的執(zhí)行(但可能將需要編寫更多的代碼)。對(duì)于低功率的微處理器,在本文中所提到的關(guān)于FFT的算法是一個(gè)好的開始。
評(píng)論