STM32 DSP库中的FFT函数简介
获取DSP库,加入到工程
在这里,简单讲述一下DSP库的获取和工程配置
获取DSP库
- keil安装目录:如E:Keil_v5ARMPACKARMCMSIS5.3.0CMSISDSP_Lib
- F1:链接: https://pan.baidu.com/s/1gd1J-jMQS2ZYdpNB7QwExg 提取码: 4yy3
- F4: 链接: https://pan.baidu.com/s/13xhTCrQxqQYnomahRkZQ8A 提取码: k62r
加入工程
1.使用runtime environment 包管理器时引入,添加时如果出现错误,根据提示更改配置,理论上是正确的,但本人并未亲身尝试过,但确实非常值得一试。
- 下载库文件,自行添加相关文件,加入全局宏定义,具体操作可以在网上自行搜索,此处不解释 ST官方已经没有了以前F1的DSP库,因此只能通过其他手段获得。 如果是自行添加,F1所需要的文件、宏定义、配置和F4的会有不同,包括几个函数也会有不同,通过runtime environment 包管理器引入函数应该不会不同,本人主要使用F4在做FFT,下面的介绍在F4上并没有问题,F1上不好说,很难兼顾到F1。
- 编译工程,保证没有错误
FFT函数介绍
- arm_cfft_f32函数,主要对输入数据进行FFT处理,大家可以参考官方功能文档,需要注意的是第二个参数为输入数组,必须是复数,即用数组的连续两个元素分别作为一个复数点的实部与虚部
- arm_cmplx_mag_f32主要完成幅值计算,第一个参数为经过上一个函数后的输入数组,第二个函数为输出数组,第三个为FFT点数
模拟测试FFT函数
在文件、配置弄好后,必须先进行模拟测试,一来验证能否使用,二来初步认识FFT函数的相关操作
- 生成用正弦函数产生4096或1024个测试数据点
#define PI 3.1415926
#define FFT_LENGTH 1024
float fft_inputbuf[FFT_LENGTH*2]; //FFT输入数组
float fft_outputbuf[FFT_LENGTH]; //FFT输出数组
for(i=0;i<FFT_LENGTH;i++)//生成信号序列
{
fft_inputbuf[2*i]=100+
10*arm_sin_f32(2*PI*i*10/FFT_LENGTH)+
20*arm_sin_f32(2*PI*i*50/FFT_LENGTH)+
30*arm_cos_f32(2*PI*i*300/FFT_LENGTH); //信号实部,直流分量100,1HZ信号幅值为10,50HZ信号幅值为20,300HZ信号幅值为30。
fft_inputbuf[2*i+1]=0;//信号虚部,全部为0
}
- 调用FFT函数处理数据点
arm_cfft_f32(&arm_cfft_sR_f32_len1024,fft_inputbuf,0,1); arm_cmplx_mag_f32(fft_inputbuf, fft_outputbuf, FFT_LENGTH);
- 串口输出fft_outputbuf数组所有数据,fft_outputbuf[0]应当约等于102400,fft_outputbuf[10]应当约等于5120,fft_outputbuf[50]应当约等于10240,fft_outputbuf[300]应当约等于15360。
若FFT点数为N,经过arm_cmplx_mag_f32函数后,fft_outputbuf[0] 为直流分量,其值为实际直流分量的N倍,fft_outputbuf[i] 为频率为i的谐波分量,其值为实际幅值的N/2倍
部分细节未给出,如有问题可以提出。
arm官方也有参考例程,在KEIL5安装目录中,例如:E:KEIL5ARMPACKARMCMSIS5.3.0CMSISDSP_LibExamplesARMarm_fft_bin_example
F4 DSP库的官方参考例程: STM32F4xx_DSP_StdPeriph_Lib_V1.4.0LibrariesCMSISDSP_LibExamplesarm_fft_bin_example
当然,也可以参考其他相关例程,比如正点原子的例程里也有关于FFT的基本测试(基于STM32F4系列)
实际应用参考方案
可按照以下步骤进行:
- 初始化定时器,在一秒中内完成对信号的4096点或者1024点等间隔采样
- 构造输入数组
- 调用arm_cfft_f32处理输入数组,调用arm_cmplx_mag_f32计算模值,产生输出数组。
- 对输出数组提取所需谐波分量数据,可能会用到arm_max_f32函数取最大值,详见功能文档
- 对数据进一步处理
帮助文档
KEIL5内置DSP库帮助文档位置:file:///E:/KEIL5/ARM/PACK/ARM/CMSIS/5.3.0/CMSIS/Documentation/General/html/index.html
F1 DSP库帮助文档位置: E:KEIL5STM32F10x_DSP_Lib_V2.0.0stm32f10x_DSP_lib.chm
F4 DSP库帮助文档位置: STM32F4xx_DSP_StdPeriph_Lib_V1.4.0LibrariesCMSISindex.html
