【原创】STM32F4DSP应用学习笔记11-对ADC采集数据进行FFT频谱分析(2)
上一节中我们知道了如何对ADC采集数据这个过程进行配置。
这一节的内容是我们需要处理采集回来的数据,并通过MATLAB进行分析,并且把结果显示在STM32F429-discovery的TFT屏幕上。
首先还是采集1024个数据,我们把采集回来的数据打印出来并且用MATLAB进行作图,然后。其次,我们对这1024个数据进行复数FFT运算,再把运算出来的结果打印出来,然后用MATLAB进行作图。记住我们的采样率是45k,被采样信号是10k的50%占空比的方波信号。板子上的引脚连接为PD12->PF9。
1:首先使用如下代码,打印出采样回来的数据。因为采样率大致为4倍的被采样信号频率,所以理论上在一个周期内会有两个4096和两个0。把打印出来的数据导入到MATLAB,命名为data1
for(i=0;i
printf("%drn",uhADC3Converted_buffer1);
2:打印出FFT运算后的模值。这里要提到的一点是,我把运算出来的直流量改为0.111111f;然后把打印出来的数据导入到MATLAB命名为data2
float32_t testOutput;
float32_t testInput;
for(i=0; i<1024; i++)
{
testInput = 0;
testInput = (float32_t)(ipnut_data*3.0f/0XFFF);
}
arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput, 0, 1);//复数FFT运算 arm_cmplx_mag_f32(testInput, testOutput, 1024);//复数求模值运算
testOutput=0.111111f;
for(i=0; i<1024; i++)
{
printf("%frn", testOutput);
}
3:
运行如下MATLAB程序,得到如下结果
Fs=45000;
N=1024;
n=0:1:N-1;
f=n*Fs/N;
subplot(2,1,1);
plot(n(1:300),data1(1:300));
subplot(2,1,2);
plot(f,data2);
xlabel(\'频率/Hz\');
ylabel(\'幅度\');
看了上面的结果,小伙伴们是不是有疑惑呢?
理论上10k方波的FFT变化应该是只有10k,30k,50k,70k........这些谱线的,那为什么会多出5k,15k,20k............这些谱线的,想必对奈奎斯特比较了解的同学都知道,这是产生频谱混叠了,对的,因为45k采样率只能采集22.5k以下的频率才不会造成混叠,不了解这方面的同学可以百度一下。
现在我们已经得到了正确的数据,那么我们就可以把这些数据显示在LCD屏上了。关于TFT屏,这里我就不详细介绍了,毕竟我们的主要内容是信号处理。STM32F429内部集成了LCD控制器。而且官方也给出了操作TFT屏的库函数。所以我也就直接拿过来用了。关于TFT,我们这里主要用到的就是画矩形块。
画矩形块的函数是这样的:
void LCD_DrawFullRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height);
给定坐标,宽度,长度就OK了。要注意的地方是X轴方向和Y轴方向是如下图所示方向
宽度是X轴方向的,长度是Y方向的。
下图是最后显示的频谱,只取了一半,因为另一半是对称的。显示结果和MATLAB结果是一致的。说明我们的显示函数是正确的。并且频谱是随着数据实时更新的!
频谱的显示支持多种宽度,因为我们FFT变化输出数据为1024个,我们取一半的画是512个,但是整个TFT屏长度才320个点,所以,我们需要把这512个有效点数进行处理,可以前后两个数据取平均。举个例子,如果我们要显示160个数,那么就是两格显示一个数那么要尽可能利用完这512个数据,我们就把前后三个数平均一下。这样一共用掉了480个数。
下面这个图就是显示数据比较少,每个显示条加宽了。
并且通过串口发送a字符还支持横竖屏切换显示
下面附上源码。