不知道大家有没有自己动手做过MP3,阿圆以前用STC,VS1003模块,SD及1602液晶现示屏做了一个能播放歌词的简易MP3播放器,当时有个遗憾就是播放音乐没有能显示频谱,后来也不了了之,现在突然想起来,就想,如果是STM32的话应该如何识别出声音的频谱呢?这就要说到今天的主角CMSIS DSP这个库,当然,阿圆今天也是来安利一下一个好用的软件虚拟示波器DataScope,嘿嘿嘿。
今天的代码会很简单,但是背后的数学原理却很复杂,不过只是为了拿到声音的频谱到并不是很复杂的事,阿圆也会借助这个机会向大家展示虚拟示波器的使用(非常好用)
[1]首先下载虚拟示波器
DataScope 串口虚拟示波器v1_0.zip(大家自行百度搜索下载啦或者发私信给阿圆也是可以的)
[2]使用STM32CubeMx新建一个带USART的FFTTest工程,并用Keil打开
[3]要使用虚拟示波器需要在工程中添加虚拟示波器下位机代码,这个代码可以在刚才下载的压缩包里找到,将DataScope_DP.C及DataScope_DP.h添加到工程即可
[4]要测试虚拟示波器,需要将开发板的USART接到PC,并用管理员权限打开Data_Scope.exe,这里阿圆有点不明白为什么一定需要管理员权限?
可以看到虚拟示波器右侧最多可以支持10个通道数据的显示,足够用了
[5]在Keil工程合适的位置添加下面的函数就可以将数据通过USART打到PC的虚拟示波器上了,
DataScope_Data_Generate的2就是通道数,for循环就是通过串口发送数据,很简单。
到这里虚拟示波器就可以工作了(前提当然是要配置好串口了)
现在来添加复利叶变换(FFT)函数
[1]要使用CMSIS DSP需要使用KEIL5的Pack管理安装CMSIS DSP的函数库
没有得话,自己去下载一下~
[2]将DSP库-arm_cortexM4lf_math.lib添加到我们一开始创建的USART工程当中
阿圆用的是STM32F437ZGT6,所以使用的是M4的math库,如果是其它平台,如STM32F103就要用M3的库。
正常来说库的路径为
C:\Keil_v5\ARM\PACK\Keil\STM32F4xx_DFP\2.11.0\Drivers\CMSIS\Lib\ARM
其它M4b和M4bf分别代表M4内核,大端模式不带FPU和带FPU两种模式
M4l和M4lf分别代表M4内核,小端模式不带FPU和带FPU两种模式
当然CMSIS DSP的功能并不只是用来作复利叶变得而已,它支持
基本数学函数
快速数学函数
复杂数学函数
滤波器
矩阵运算函数
变换函数
电机控制函数
统计函数
等等
[3]那现在就可以开始码代码,添加好所需要的头文件
定义好我们的需要用到一些变量
现在来生成采样频率为50Hz的正弦波
使用CMSIS DSP库进行FFT变换,并通过虚拟示波器打印出来
核心函数就是arm_rfft_fast_f32及arm_cmplx_mag_f32对时域的数据转换频域
其中arm_max_f32可以直接从生成的频谱中取出频率响应最高的一个频率。
要问阿圆为什么这么变化,阿圆的数学也不是很好,哈哈~大写的尴尬!
[4]现在让我们运行看一看效果
红线曲线是我们手动手成的正弦波,而白色曲线就是得到的频谱。那为什么刚好是在20那儿达到最大值呢,20又代表什么?
在生成正弦波时我们的采样周期是50Hz,而正弦波的周期是1KHz,所以就很好理解了,20的单位正是50HZ,即50Hz*20=1KHz。
好啦,今天呢简单熟悉了CMSIS DSP的使用,确实很强大,同时也安利了一个调试曲线的利器DataScope,觉得有帮助的同学可以点赞关注收藏啦~ 今天阿圆的分享就到这里~