使用STM32 的DSP库FFT进行信号处理的几点经验教训
使用FFT进行数据处理的几点注意事项: 1.了解自己需要处理的数据对象,以及获取方法 2.需要处理的原始信号的频段范围,从而确定数据采样的频率及采样点数 3.当获得fft后的数据后,一定要结合采集的原始数据进行对比分析,若出现问题,好排查出错的范围。
进行FFT前需要做的环境搭建: 1.往工程内移植STM32 DSP库:这个往上一搜一大把,不做过多的解释。 2.添加具体用于实现fft的函数:我们的项目是基于1024点的FFT处理,采样的原始信号在0.5hz -3hz之间,因此,将AD的采样频率设为30hz,足够使用。 3.在实现的过程中手欠将一个自以为没有什么作用的头文件去掉了,结果导致fft结果一直不多,后来检查发现,是这个原因。#include "arm_const_structs.h"就是这个。 4.贴出来几个关键函数: a.arm_cfft_f32(&arm_cfft_sR_f32_len1024, fft_input, 0,doBitReverse); arm_cfft_sR_f32_len1024这个是个结构体常量,坐落于"arm_const_structs.h"里,对我来说意义重大。 这个函数是将数组fft_input内的2048个数据(其中index为2i的位置存的为0,代指虚部为0)做fft变换,输出的结果以实部,虚部,实部,虚部…这种形式存放起来,还是存到fft_input数组里 b.arm_cmplx_mag_f32(fft_input, testOutput, 1024); 由于fft计算后的数据是对称的,因此我们只需要对前1024个数据做求模运算就可以。 c.arm_max_f32(testOutPut2, 512, &maxValue, &maxIndex); 通过此函数获得最大模值对应的下标。 d.f0 = (30.0f * maxIndex)/(1024) 通过此下标计算该位置的频率就可以了。
注:此处30/1024计算的结果为fft运算后,可以分析到的最小频率分辨率。当时学习的时候不知道为啥在这个地方饶了好久。