STM32 DSP库中的FFT函数简介

获取DSP库,加入到工程

在这里,简单讲述一下DSP库的获取和工程配置

获取DSP库

  1. keil安装目录:如E:Keil_v5ARMPACKARMCMSIS5.3.0CMSISDSP_Lib
  2. F1:链接: https://pan.baidu.com/s/1gd1J-jMQS2ZYdpNB7QwExg 提取码: 4yy3
  3. F4: 链接: https://pan.baidu.com/s/13xhTCrQxqQYnomahRkZQ8A 提取码: k62r

加入工程

1.使用runtime environment 包管理器时引入,添加时如果出现错误,根据提示更改配置,理论上是正确的,但本人并未亲身尝试过,但确实非常值得一试。

  1. 下载库文件,自行添加相关文件,加入全局宏定义,具体操作可以在网上自行搜索,此处不解释 ST官方已经没有了以前F1的DSP库,因此只能通过其他手段获得。 如果是自行添加,F1所需要的文件、宏定义、配置和F4的会有不同,包括几个函数也会有不同,通过runtime environment 包管理器引入函数应该不会不同,本人主要使用F4在做FFT,下面的介绍在F4上并没有问题,F1上不好说,很难兼顾到F1。
  2. 编译工程,保证没有错误

FFT函数介绍

  1. arm_cfft_f32函数,主要对输入数据进行FFT处理,大家可以参考官方功能文档,需要注意的是第二个参数为输入数组,必须是复数,即用数组的连续两个元素分别作为一个复数点的实部与虚部
  2. arm_cmplx_mag_f32主要完成幅值计算,第一个参数为经过上一个函数后的输入数组,第二个函数为输出数组,第三个为FFT点数

模拟测试FFT函数

在文件、配置弄好后,必须先进行模拟测试,一来验证能否使用,二来初步认识FFT函数的相关操作

  1. 生成用正弦函数产生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
}
  1. 调用FFT函数处理数据点
arm_cfft_f32(&arm_cfft_sR_f32_len1024,fft_inputbuf,0,1);
arm_cmplx_mag_f32(fft_inputbuf, fft_outputbuf, FFT_LENGTH);
  1. 串口输出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系列)

实际应用参考方案

可按照以下步骤进行:

  1. 初始化定时器,在一秒中内完成对信号的4096点或者1024点等间隔采样
  2. 构造输入数组
  3. 调用arm_cfft_f32处理输入数组,调用arm_cmplx_mag_f32计算模值,产生输出数组。
  4. 对输出数组提取所需谐波分量数据,可能会用到arm_max_f32函数取最大值,详见功能文档
  5. 对数据进一步处理

帮助文档

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

经验分享 程序员 微信小程序 职场和发展