离线式数字信号处理(二)——使用Matlab对STM32F4 ADC采集到的数据进行分析

昨天学弟帮我写好了采集程序,是基于STM32F4的,使用其ADC直接采样,采样2048个点并实施存入数组,随后写入SD卡中。
详情请参考这篇文章 【实验室乱记】基于stm32的采集Adc与SD卡储存

虽然我们的matlab程序正常跑起来了,但是文件存储的部分仍然有点小问题,因为12bit ADC采样获得的最大数值是4096,学弟的程序在存储这些数字进SD卡TXT文档的时候出现了一点小bug,那就是如果非4位数,在该行数字最后会出现几个空格,把不满4位数的补上。如果直接使用matlab打开,会直接报错,但是我打开了文档,随便删掉一个空格随后保存,程序就可以正常运行了。。实在是非常古怪。
在这里插入图片描述
但是毕竟能用就行,我们也就没有过多追究,因为这只是一个测试平台,之后我们还会拿到FPGA平台上去运行,到时候出现bug我们可以继续解决。
存储数据的文件放在了实验室的同步文件服务器上,没有带回来,不过大家应该知道,就跟我们之前模拟出来的那个txt文件格式一致的。

下面上实验数据。

测试1
这是第一次采集获得的结果,因为一开始的程序中,ADC采集函数里写了个delay进去,所以采样率变得很低,学弟说数值变化的很奇怪,所以他就把信号源产生的频率开的很低了,调整到了10Hz,至于采样率,我也忘记了,貌似是200Hz,我们是用了一个引脚,每一次采集ADC数据就将该引脚电平翻转,随后再用示波器测量其信号频率,乘以2以后就是采样率了。

在其单边幅度谱中,可以看到主peak是位于10Hz位置的,符合预期。但是可以观察到信号边缘有毛刺,这其实是因为我们没有将ADC采样触发放到定时器中运行,而是仅仅使用delay函数来控制它的采样间隔,因此如果出现时间突然加快或者变慢,就会出现相位抖动,导致FFT时,频谱会出现轻微偏移。
在这里插入图片描述
上图是第二次采集获得的数据,我们将ADC采集函数中的延时删除了,测得的采样率大约为2 x 32.8kSps左右,将这个数值输入matlab中,可以正确的做出FFT,输入信号为1kHz,可以观察到在1kHz位置有一峰,即为我们所需信号的频谱。
在这里插入图片描述
当我们将信号源的频率开到30kHz,也就是接近于1/2 Fs的时候,可以发现虽然信号处于第一奈奎斯特区域内,但是ADC采集的值无法直接用于FFT,需要先恢复出原始信号才可进行后续处理。

以上desu。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36470569/article/details/106864517