FFT是一種DFT的高效算法,稱(chēng)為快速傅立葉變換(fast Fourier transform),它根據(jù)離散傅氏變換的奇、偶、虛、實(shí)等特性,對(duì)離散傅立葉變換的算法進(jìn)行改進(jìn)獲得的。
FFT運(yùn)算效率
使用STM32官方提供的DSP庫(kù)進(jìn)行FFT,雖然在使用上有些不靈活(因?yàn)樗腔?的FFT,所以FFT的點(diǎn)數(shù)必須是4^n),但其執(zhí)行效率確實(shí)非常高效,看圖1所示的FFT運(yùn)算效率測(cè)試數(shù)據(jù)便可見(jiàn)一斑。
如何使用STM32提供的DSP庫(kù)函數(shù)
1.下載STM32的DSP庫(kù)
大家可以從網(wǎng)上搜索下載得到STM32的DSP庫(kù)
2.添加DSP庫(kù)到自己的工程項(xiàng)目中
下載得到STM32的DSP庫(kù)之后,就可以將其添加到自己的工程項(xiàng)目中了。
其中,inc文件夾下的stm32_dsp.h和table_fft.h兩個(gè)文件是必須添加的。stm32_dsp.h是STM32的DSP庫(kù)的頭文件。src文件夾下的文件可以有選擇的添加(用到那個(gè)添加那個(gè)即可)。
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類(lèi)型的lBufInArray數(shù)組中,且該數(shù)組中每個(gè)元素的高16位存儲(chǔ)采樣數(shù)據(jù)的實(shí)部,低16位存儲(chǔ)采樣數(shù)據(jù)的虛部(總是為0)。
今天小編選擇了使用STM32f4提供的DSP庫(kù)這種方法來(lái)做fft的運(yùn)算,下面我們我看下具體詳情:
STM32F4 dsp庫(kù)做FFT運(yùn)算:
環(huán)境:iar 6.2
板子:STM32F4DISCOVERY
第一 首先下載官方的 STM32F4xx_DSP_StdPeriph_Lib_V1.0.0 沒(méi)有的同學(xué)請(qǐng)自己去官網(wǎng)下一個(gè)
DSP庫(kù)在 STM32F4xx_DSP_StdPeriph_Lib_V1.0.0\Libraries\CMSIS
然后我們使用IAR建立工作空間,這個(gè)教程到處都有,我就不說(shuō)了在編譯器里面加入
$PROJ_DIR$\。。\。。\。。\Libraries\CMSIS\DSP_Lib\Source
ARM_MATH_CM4
ARM_MATH_MATRIX_CHECK
ARM_MATH_ROUNDING
__FPU_PRESENT
__FPU_USED
這樣才可以使用DSP庫(kù)
注意 我的是IAR MDK貌似不是這樣的 。。。。。
然后再編譯器里面打開(kāi) FPU
然后再你的EWARM 目錄下添加官方的例子文件
我們用的就是這幾個(gè)文件 STM32F4xx_DSP_StdPeriph_Lib_V1.0.0\Libraries\CMSIS\DSP_Lib\Examples\arm_fft_bin_example
接著像我這樣加入這些組 在里面添加文件 文件在STM32F4xx_DSP_StdPeriph_Lib_V1.0.0\Libraries\CMSIS\DSP_Lib\Source添加,然后在IAR里面加入 arm_fft_bin_example_f32 這個(gè)就是官方的例子 和官方的數(shù)據(jù) arm_fft_bin_data
連接下載
使用WATCH窗口可以看見(jiàn)值
然后 我講一下這幾個(gè)函數(shù)的作用
/* Initialize the CFFT/CIFFT module */
status = arm_cfft_radix4_init_f32(&S, fftSize,
ifftFlag, doBitReverse); //這里是FFT的初始化
/* Process the data through the CFFT/CIFFT module */ //FFT計(jì)算的函數(shù) 注意 testInput_f32_10khz 這個(gè)數(shù)組 不能是const 因?yàn)橛?jì)算值是覆蓋在這里面的
arm_cfft_radix4_f32(&S, testInput_f32_10khz);
/* Process the data through the Complex Magnitude Module for // FFT出來(lái)的是復(fù)數(shù) 這里是把復(fù)數(shù)求模 得幅值
calculating the magnitude at each bin */
arm_cmplx_mag_f32(testInput_f32_10khz, testOutput,
fftSize);
/* Calculates maxValue and returns corresponding BIN value */ //這里是求FFT出來(lái)數(shù)據(jù)模的最大值
arm_max_f32(testOutput, fftSize, &maxValue, &testIndex);
最后,如果你的運(yùn)行到這一步 你就成功了
評(píng)論
查看更多