ARM的FFT使用及误差分析
时间:10-02
整理:3721RD
点击:
首先,我们简单介绍下FFT:FFT即快速傅里叶变换,可以将一个时域信号变换到频域。因为有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了,这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。简而言之,FFT就是将一个信号从时域变换到频域方便我们分析处理。
模拟信号经过ADC采样之后,就变成了数字信号,采样得到的数字信号,就可以做FFT变换了。N个采样点数据,在经过FFT之后,就可以得到N个点的FFT结果。对于快速FFT算法,有基2FFT、基4FFT快速算法,而ARM的DSP库里面包含基2FFT算法和基4FFT算法。一般情况下,对于我们来说都是实数FFT运算,而复数FFT运算在雷达、通信等特殊情况下使用。
对于基2FFT算法,FFT点数是2^N,基4FFT算法,FFT点数是4^N。ARM的DSP库中实数FFT函数原型如下:第二个函数arm_rfft_fast_init_f32(),是用来初始化FFT点数;第一个函数arm_rfft_fast_f32(),进行快速FFT计算,包含IFFT计算,可通过ifftFlag设置。
用Matlab产生3个单频点信号,如下图:
在STM32F4中将计算FFT计算结果上传到串口中,然后和Matlab计算结果进行对比,KEIL工程如下:
需要注意地方是Matlab的FFT计算结果是对称的,而ARM的DSP库中arm_rfft_fast_f32()函数计算结果只有[1 NFFT/2]。对于FFT计算结果,第一点是直流分量。对于STM32的ADC采样,一般情况下都是正值,所以第一点值都比较大。由于ADC是12位的,这里产生一些ADC数据。
有直流采样FFT结果也是很精确的