[DSP學(xué)習(xí)筆記]基于TMS320F28335的FFT以及加窗函數(shù)的實現(xiàn)

首先我們先將C2000 wave中我們所需要的函數(shù)庫給導(dǎo)入到我們的新建工程中(可見于我實現(xiàn)FIR濾波文章中導(dǎo)入函數(shù)庫的操作)。
工程中可見有以下文件。(僅FFT可刪除濾波有關(guān)文件)

接著新建INPUT.c與window.c

借助MATLAB我們來生成所需的輸入信號與窗函數(shù)
生成輸入信號的MATLAB程序如下:


將record.txt的文件內(nèi)容復(fù)制到INPUT.c中,如下:

接下我們進(jìn)行窗函數(shù)的生成。
1.加窗之前,首先我們要明白我們?yōu)槭裁匆哟啊?/p>
在實際應(yīng)用中,我們采集到的信號通常是較長的非周期時間序列,在進(jìn)行FFT時,需要對信號進(jìn)行截斷。截斷后得到的信號通常是非周期信號,所以FFT結(jié)果就變成了連續(xù)的譜線,周期信號的頻率-幅值不再是一條垂直的直線,而是一條曲線,同時幅值下降,泄露到曲線其他頻率點,即我們常說的頻譜泄露。而窗函數(shù)一個周期函數(shù),窗函數(shù)與截斷信號相乘后,會變成比較接近周期函數(shù)的波形(實際上就是利用窗函數(shù)進(jìn)行調(diào)制)。加窗后的信號進(jìn)行FFT后,得到的頻譜曲線會更窄,趨向于垂直直線。因此對頻譜泄露有一定改善。
2.知道為什么要加窗后,我們再來根據(jù)實際情況來選擇我們所需要的窗函數(shù)。
通常情況下,我們不對輸入信號進(jìn)行處理,而直接截斷情況下相當(dāng)于給信號加了一個矩形窗。
如果我們對于FFT后的結(jié)果要求精確的幅值,平頂窗是我們的首選。
如果我們對應(yīng)FFT后的結(jié)果要求精確的頻率點,則可以選擇漢寧窗。
3.選擇完窗函數(shù),我們還要對FFT后的結(jié)果乘以他們對應(yīng)的恢復(fù)系數(shù)(窗函數(shù)對信號有衰減),如下表:

了解完以上知識,我們便可以繼續(xù)我們的實驗。
在MATLAB命令行窗口敲入window,進(jìn)入下列界面并完成下列配置。(本次測試選用漢寧窗)

點擊文件,導(dǎo)出,導(dǎo)出到工作區(qū)。
?但是,我們工程實際應(yīng)用,還需對得到的窗函數(shù)進(jìn)行處理,將其轉(zhuǎn)化為Q16型(在官方給出的例程中有提出)。故我們通過編寫MATLAB文件實現(xiàn)轉(zhuǎn)換,并保存到本地的window.txt文件中。

?將window.txt的內(nèi)容復(fù)制到window.c中,如下:

接下來我們對RFFT.c文件進(jìn)行編寫,有以下函數(shù)
初始化函數(shù):

對幅度進(jìn)行計算的函數(shù):

對幅值與頻率點計算的函數(shù)

需注意的是,F(xiàn)FT的返回值不是幅值,我們需對其進(jìn)行轉(zhuǎn)換。
首先對FFT的結(jié)果進(jìn)行取模,使用RFFT_f32_mag()函數(shù),得到幅度。
接著對幅度再進(jìn)行相應(yīng)的處理,如下表:

即,直流分量的幅值等于幅度除以采樣點數(shù),其余的的幅值等于幅值除以采樣點數(shù)的一半。
在主函數(shù)中,對RFFT_Init()和RFFT_Caculate()完成調(diào)用,即可。
準(zhǔn)備階段結(jié)束,進(jìn)入仿真。
仿真結(jié)果如下:
頻率點:

對應(yīng)幅值:

直流分量:

實驗結(jié)果與輸入信號相吻合,測試結(jié)束。
本文如有錯誤,也請多多指出。