02FFT|STM32使用FFT教程
STM32F407 DSP+FPU进行FFT变换
接着上一篇继续,要用FFT运算的话,F4有FPU和DSP库,可以很方便让我们去对数据进行傅氏变换。首先得配置好DSP库和FPU。
配置DPS库和FPU
cubeMX一般是默认配置开启FPU,但是DSP库需要自己去添加。这里添加方法是我和老师摸索出来的,可能不适用所有人。
FPU开启:点仙女棒,然后可以看到
然后选择Single Precision,就开启了FPU。
添加DSP库:点小绿标 再展开CMSIS勾选DSP
,添加两个头文件
1 |
最后点击仙女棒选择C/C++,在预处理符号定义栏添加宏ARM_MATH_CM4,不同系列的使用不同的宏,至此软硬件配置完毕。
查看DSP库
在使用前我们需要DSP库里面有什么东西,所以这里要用到上一篇的推荐CubeMX官方文档。
这里我们查找到需要FFT变换函数和复数点积函数,函数名为
简单说明ARM_CFFT_F32函数,需要输入4个参数,第一个参数是输入需要转换多少数据仅限于
第二个是FFT输入数组,大小为第一个参数数量的两倍,两个数据组成一个复数,前一个为实数部分,后一个为虚数部分;
第三个是选择正逆向变换,参考输入0;
第四个是否位反转输出,参靠输入1;
注:该函数只有一个输入数组,FFT运算完后会将运算后数据按设定顺序放入输入数组。
简单说明ARM_CMPLX_MAG_F32函数,需要输入三个参数。
第一个是输入数组,结构与FFT数组一样,两个数据组成一个复数,前一个为实数部分,后一个为虚数部分;
第二个参数是输出数组,将复数的模按输入顺序放入输出数组,因为复数有占个数据,而复数模只占一个数据,所以输出数据应该为输入数据1/2;
第三个参数是需要转换多少个复数数据;
使用DSP库
首先使用ADC捕获一段信号,我使用的是10Khz、1Vpp、1V偏置的正弦信号
1 | uint16_t buf[1024]={0};//ADC采样数组 |
将打印的电压值放入Excel表格曲线连接
确定ADC采集处理正常,再进行FFT运算
1 | for(int i=0;i<1024;i++) |
数据如上图;
分析FFT求模后的数据
现在我们成功得到了一组FFT数据,可是不知道怎么去看我们需要的信息,所以现在对数据进行分析
横轴分析
因为FFT变换之后是将信号时域变化,变成了信号频域变化,所以横轴的量纲是HZ,而且每两个点之间的频率是等差的,所以需要计算FFT数据的频率分辨率,
频率分辨率=ADC采样频率/采样点数,按我们之前配置是ADC采样频率为21MHZ,我采了1024个点,所以这里频率分辨率=1367.1875HZ,可以得到两个点之间差1367.1875HZ。
纵轴分析
FFT变换之后纵轴量纲不变
假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A 的N/2倍。
所以只需要把0HZ分量点除以采样点数,其他分量除以(采样点/2),就是其他真实电压值。注:输出的值均为幅值
结尾
至此我们已经会了FFT的函数使用和数据分析,但有的时候会数据对不上,可能的误差原因有:
1.ADC采样时间被其他语句延时了。
2.根据采样定理,采样频率应为被采样频率的2.56~4倍频。