STM32學(xué)習(xí)記錄20 FFT
本文將以一個(gè)實(shí)例來介紹如何使用STM32提供的DSP庫函數(shù)進(jìn)行FFT。
本文引用地址:http://www.ex-cimer.com/article/201611/316197.htm1.FFT運(yùn)算效率
使用STM32官方提供的DSP庫進(jìn)行FFT,雖然在使用上有些不靈活(因?yàn)樗腔?的FFT,所以FFT的點(diǎn)數(shù)必須是4^n),但其執(zhí)行效率確實(shí)非常高效,看圖1所示的FFT運(yùn)算效率測(cè)試數(shù)據(jù)便可見一斑。該數(shù)據(jù)來自STM32DSP庫使用文檔。
圖1FFT運(yùn)算效率測(cè)試數(shù)據(jù)
由圖1可見,在STM32F10x系列處理器上,如果使用72M的系統(tǒng)主頻,進(jìn)行64點(diǎn)的FFT運(yùn)算,僅僅需要0.078ms而已。如果是進(jìn)行1024點(diǎn)的FFT運(yùn)算,也才需要2.138ms。
2.如何使用STM32提供的DSP庫函數(shù)
2.1下載STM32的DSP庫
大家可以從網(wǎng)上搜索下載得到STM32的DSP庫,這里提供一個(gè)下載的地址:
https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/DispForm.aspx?ID=30831&RootFolder=%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fcortex%5fmx%5fstm32%2fSTM32F10x%20DSP%20library%2c%20where%20is%20it
2.2添加DSP庫到自己的工程項(xiàng)目中
下載得到STM32的DSP庫之后,就可以將其添加到自己的工程項(xiàng)目中了。
其中,inc文件夾下的stm32_dsp.h和table_fft.h兩個(gè)文件是必須添加的。stm32_dsp.h是STM32的DSP庫的頭文件。
src文件夾下的文件可以有選擇的添加(用到那個(gè)添加那個(gè)即可)。因?yàn)槲抑挥玫搅?56點(diǎn)的FFT,所以這里我只添加了cr4_fft_256_stm32.s文件。添加完成后的項(xiàng)目框架如圖2所示。
圖2項(xiàng)目框架
2.3模擬采樣數(shù)據(jù)
根據(jù)采樣定理,采樣頻率必須是被采樣信號(hào)最高頻率的2倍。這里,我要采集的是音頻信號(hào),音頻信號(hào)的頻率范圍是20Hz到20KHz,所以我使用的采用頻率是44800Hz。那么在進(jìn)行256點(diǎn)FFT時(shí),將得到44800Hz/256=175Hz的頻率分辨率。
為了驗(yàn)證FFT運(yùn)算結(jié)果的正確性,這里我模擬了一組采樣數(shù)據(jù),并將該采樣數(shù)據(jù)存放到了long類型的lBufInArray數(shù)組中,且該數(shù)組中每個(gè)元素的高16位存儲(chǔ)采樣數(shù)據(jù)的實(shí)部,低16位存儲(chǔ)采樣數(shù)據(jù)的虛部(總是為0)。
為什么要這樣做呢?是因?yàn)楹竺嬉{(diào)用STM32的DSP庫函數(shù),需要傳入的參數(shù)規(guī)定了必須是這樣的數(shù)據(jù)格式。
下面是具體的實(shí)現(xiàn)代碼:
1 /******************************************************************2 函數(shù)名稱:InitBufInArray()3 函數(shù)功能:模擬采樣數(shù)據(jù),采樣數(shù)據(jù)中包含3種頻率正弦波(350Hz,8400Hz,18725Hz)4 參數(shù)說明:5 備 注:在lBufInArray數(shù)組中,每個(gè)數(shù)據(jù)的高16位存儲(chǔ)采樣數(shù)據(jù)的實(shí)部,6 低16位存儲(chǔ)采樣數(shù)據(jù)的虛部(總是為0)7 作 者:博客園 依舊淡然(http://www.cnblogs.com/menlsh/)8 *******************************************************************/9 void InitBufInArray()10 {11 unsigned short i;12 float fx;13 for(i=0; i
其中,NPT是采樣點(diǎn)數(shù)256,PI2是2π(即6.28318530717959),F(xiàn)s是采樣頻率44800。可以看到采樣數(shù)據(jù)中包含了3種頻率的正弦波,分別為350Hz,8400Hz和18725Hz。
2.4調(diào)用DSP庫函數(shù)進(jìn)行FFT
進(jìn)行256點(diǎn)的FFT,只需要調(diào)用STM32DSP庫函數(shù)中的cr4_fft_256_stm32()函數(shù)即可。該函數(shù)的原型為:
voidcr4_fft_256_stm32(void*pssOUT,void*pssIN,uint16_tNbin);
其中,參數(shù)pssOUT表示FFT輸出數(shù)組指針,參數(shù)pssIN表示要進(jìn)行FFT運(yùn)算的輸入數(shù)組指針,參數(shù)Nbin表示了點(diǎn)數(shù)。至于該函數(shù)的具體實(shí)現(xiàn),因?yàn)槭怯脜R編語言編寫的,我也不懂,這里就不妄談了。
下面是具體的調(diào)用實(shí)例:
cr4_fft_256_stm32(lBufOutArray,lBufInArray,NPT);
其中,參數(shù)lBufOutArray同樣是一個(gè)long類型的數(shù)組,參數(shù)lBufInArray就是存放模擬采樣數(shù)據(jù)的采樣數(shù)組,NPT為采樣點(diǎn)數(shù)256。
調(diào)用該函數(shù)之后,在lBufOutArray數(shù)組中就存放了進(jìn)行FFT運(yùn)算之后的結(jié)果數(shù)據(jù)。該數(shù)組中每個(gè)元素的數(shù)據(jù)格式為;高16位存儲(chǔ)虛部,低16位存儲(chǔ)實(shí)部。
2.5計(jì)算各次諧波幅值
得到FFT運(yùn)算之后的結(jié)果數(shù)據(jù)之后,就可以計(jì)算各次諧波的幅值了。
下面是具體的實(shí)現(xiàn)代碼:
1 /******************************************************************2 函數(shù)名稱:GetPowerMag()3 函數(shù)功能:計(jì)算各次諧波幅值4 參數(shù)說明:5 備 注:先將lBufOutArray分解成實(shí)部(X)和虛部(Y),然后計(jì)算幅值(sqrt(X*X+Y*Y)6 作 者:博客園 依舊淡然(http://www.cnblogs.com/menlsh/)7 *******************************************************************/8 void GetPowerMag()9 {10 signed short lX,lY;11 float X,Y,Mag;12 unsigned short i;13 for(i=0; i> 16;16 lY = (lBufOutArray[i] >> 16);17 X = NPT * ((float)lX) / 32768;18 Y = NPT * ((float)lY) / 32768;19 Mag = sqrt(X * X + Y * Y) / NPT;20 if(i == 0)21 lBufMagArray[i] = (unsigned long)(Mag * 32768);22 else23 lBufMagArray[i] = (unsigned long)(Mag * 65536);24 }25 }
其中,數(shù)組lBufMagArray存儲(chǔ)了各次諧波的幅值。
2.6實(shí)驗(yàn)結(jié)果
通過串口,我們可以將lBufMagArray數(shù)組中各次諧波的幅值(即各個(gè)頻率分量的幅值)輸出打印出來,具體實(shí)驗(yàn)數(shù)據(jù)如下所示:
i, P, Mag, X, Y0, 0, 4, 0, -41, 175, 14, -6, -42, 350, 1492, 746, -33, 525, 11, -5, -34, 700, 8, -3, -35, 875, 8, -4, -26, 1050, 6, -3, 07, 1225, 6, -3, 08, 1400, 8, -4, -29, 1575, 8, -4, 010, 1750, 4, -2, 011, 1925, 8, -4, -112, 2100, 6, -3, 013, 2275, 5, -2, -214, 2450, 6, -3, -115, 2625, 8, -3, -316, 2800, 4, -2, 017, 2975, 6, -3, -118, 3150, 6, -3, 019, 3325, 6, -3, 020, 3500, 2, -1, 021, 3675, 4, -2, 022, 3850, 4, -2, 023, 4025, 4, -2, 024, 4200, 6, -3, 025, 4375, 6, -3, 026, 4550, 4, -2, 027, 4725, 6, -3, 028, 4900, 2, -1, 029, 5075, 4, -2, -130, 5250, 4, -2, 031, 5425, 2, -1, 032, 5600, 4, -2, -133, 5775, 6, -3, -134, 5950, 2, -1, -135, 6125, 6, -3, -136, 6300, 2, -1, 037, 6475, 6, -3, 038, 6650, 4, -2, 039, 6825, 4, -2, -140, 7000, 2, -1, 041, 7175, 6, -3, 042, 7350, 2, -1, 043, 7525, 2, -1, 044, 7700, 2, -1, 045, 7875, 2, -1, 046, 8050, 4, -2, 047, 8225, 2, -1, 048, 8400, 2696, 1348, 049, 8575, 2, -1, -150, 8750, 0, 0, 051, 8925, 4, -2, -152, 9100, 2, 0, -153, 9275, 0, 0, 054, 9450, 2, -1, -155, 9625, 2, -1, 056, 9800, 2, -1, 057, 9975, 2, -1, -158, 10150, 2, -1, -159, 10325, 2, -1, 060, 10500, 0, 0, 061, 10675, 2, -1, 062, 10850, 4, -2, -163, 11025, 2, -1, -164, 11200, 0, 0, 065, 11375, 2, -1, 066, 11550, 0, 0, 067, 11725, 2, -1, -168, 11900, 2, -1, -169, 12075, 2, -1, 170, 12250, 2, -1, 171, 12425, 4, -2, 172, 12600, 4, -2, -173, 12775, 2, -1, 174, 12950, 0, 0, 075, 13125, 4, -2, 076, 13300, 4, -2, 077, 13475, 2, -1, 078, 13650, 2, -1, 079, 13825, 4, -2, -180, 14000, 2, -1, 081, 14175, 4, -2, 082, 14350, 2, -1, 183, 14525, 4, -2, 184, 14700, 4, -2, 185, 14875, 2, -1, 186, 15050, 4, -2, 087, 15225, 2, -1, 088, 15400, 4, -2, 189, 15575, 4, -2, 190, 15750, 2, -1, 091, 15925, 2, -1, 192, 16100, 2, -1, 193, 16275, 2, -1, 194, 16450, 4, -2, 195, 16625, 2, -1, 196, 16800, 2, -1, -197, 16975, 4, -2, 098, 17150, 2, -1, 099, 17325, 4, -2, 0100, 17500, 4, -2, 1101, 17675, 4, -2, 0102, 17850, 4, -2, 1103, 18025, 4, -2, -1104, 18200, 2, -1, 1105, 18375, 4, -2, 0106, 18550, 2, -1, 1107, 18725, 3996, 1998, 1108, 18900, 2, -1, 0109, 19075, 2, -1, 1110, 19250, 4, -2, 1111, 19425, 4, -2, 1112, 19600, 2, 0, 1113, 19775, 2, -1, 0114, 19950, 0, 0, 0115, 20125, 4, -2, 1116, 20300, 2, 0, 1117, 20475, 2, 0, 1118, 20650, 2, -1, 1119, 20825, 2, -1, 1120, 21000, 2, -1, 1121, 21175, 2, -1, 0122, 21350, 2, 0, 1123, 21525, 2, -1, 0124, 21700, 0, 0, 0125, 21875, 2, -1, 1126, 22050, 2, -1, 1127, 22225, 2, 0, 1
在以上的實(shí)驗(yàn)數(shù)據(jù)中,我們分別打印出來了點(diǎn)數(shù)、頻率、幅值、實(shí)部、虛部信息。
由以上的實(shí)驗(yàn)數(shù)據(jù),我們可以看出,在頻率為350Hz,8400Hz和18725Hz時(shí),幅值出現(xiàn)峰值,分別為1492、2696和3996,這與我們所預(yù)期的結(jié)果正好相符,從而驗(yàn)證了實(shí)驗(yàn)結(jié)果的正確性。
評(píng)論