首先,我们简单介绍下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设置。
在STM32F4 中将计算FFT 计算结果上传到串口中,然后和Matlab 计算结果进行对比,KEIL 工程如下:
需要注意地方是Matlab的FFT计算结果是对称的,而ARM的DSP库中arm_rfft_fast_f32()函数计算结果只有[1 NFFT/2]。对于FFT计算结果,第一点是直流分量。对于STM32的ADC采样,一般情况下都是正值,所以第一点值都比较大。由于ADC是12位的,这里产生一些ADC数据。
有直流采样FFT结果也是很精确的
|