STM32F407 DSP教程第3章:Matlab基础操作入门指南
玩STM32F4的DSP开发,绕不开Matlab。很多朋友刚接触的时候,总觉得这工具太复杂,光是打开界面就不知道该干嘛。其实我们做DSP开发,不需要把Matlab所有功能都摸透,只要把基础操作掌握好,能满足我们生成算法、验证参数、导出代码的需求就够了。这一章我们就从最实用的操作讲起,跟着走一遍,你就能上手做基础的DSP处理了。
首先得说一下环境准备,我们做STM32F4的DSP开发,Matlab版本不用追最新的,只要不是五六年前的老版本就行。我自己用的是R2020b,跑DSP相关的工具包完全没问题,安装的时候记得勾选信号处理工具箱和定点设计工具包,这两个是我们必须用到的,后面生成代码也要靠它们。如果安装的时候忘了选,后续再添加上也不难,不用重新装整个软件。
安装完打开软件,最先看到的就是主界面,很多新手看着一堆窗口就慌了。其实我们常用的就几个区域,左边的当前文件夹窗口,用来放我们的工程文件,中间是命令行窗口,输入命令就能直接出结果,右边是工作区,会显示你现在用到的所有变量。如果你的界面被调乱了,直接在主页选项卡那里点「重置布局」,就能回到默认状态,不用瞎折腾找半天。
我们做DSP第一步,往往是要生成一个测试信号,比如正弦波、方波,或者模拟实际采集到的带噪声信号。我举个最简单的例子,生成一个1kHz的正弦波,采样率设为10kHz,时长1秒。你直接在命令行输入几行代码就行。先定义采样时间间隔,fs = 10000; dt = 1/fs; t = 0:dt:1-dt; 这一步就是把时间轴做出来,从0到1秒,每个点间隔0.0001秒。然后再加一句f = 1000; s = sin(2*pi*f*t); 这样正弦信号就生成好了。
生成完信号,总得看看波形对不对吧?Matlab画个图超级简单,直接输plot(t, s); 回车之后就能弹出一个波形窗口,你就能看到清晰的正弦曲线了。如果想要加标注改样式,也不用非得写复杂代码,直接在弹出的图窗里用工具改就行,想改横坐标纵坐标名称,改线条颜色,直接点界面上的按钮操作,比手写命令省事多了。我们平时做调试,生成完信号画个图看看对不对,是每天都要用到的操作,练个两次就能记住。
很多人刚用Matlab,分不清脚本和函数,这里也简单说一下。我们做简单的测试,直接写脚本就行,就是新建一个.m文件,把所有命令按顺序写进去,点运行就能从头到尾执行一遍,结果直接出在工作区里。什么时候用函数呢?比如你写了一段处理信号的代码,要反复调用,换不同的参数运行,那就写成函数,把参数传进去就能得到结果,不用每次都复制粘贴改代码。
举个实际的例子,我们要给刚才生成的正弦波加高斯噪声,模拟实际传感器采集到的信号,就可以写个简单的函数。新建函数m文件,第一行写function [out] = add_noise(in, snr),然后里面写噪声生成的代码,最后输出加完噪声的信号就行。之后在脚本里调用,直接写s_noise = add_noise(s, 20); 就得到信噪比20dB的带噪信号了,是不是很方便?
接下来要说一个我们DSP开发里超级常用的功能,就是滤波器设计。我们做STM32F4的信号处理,十有八九要用到滤波,Matlab自带的滤波器设计工具比你自己手算系数方便一万倍。打开方式也简单,直接在命令行输入fdatool,回车就能弹出滤波器设计界面。你只要选好滤波器类型,比如FIR低通,然后输入采样率、截止频率,阶数,点一下设计滤波器,直接就能给你算出系数。
算出来的系数怎么用?你可以直接导出到工作区,然后把系数复制出来,放到STM32的工程代码里用。要是你想更方便,还可以直接用Matlab生成C代码,直接就能导入到STM32的开发环境里用,省去了手敲系数容易出错的问题。这个功能我们后面讲具体DSP实现的时候会详细说,现在先记住这个工具的位置就行。
很多新手会问,我做开发为什么非要用Matlab,直接在STM32上写代码调不行吗?其实真不行,DSP算法的参数调试,比如滤波器系数、FFT的窗口选择,你直接在单片机上改来改去,编译下载一次就要好几分钟,效率太低了。在Matlab里你改完参数一秒就能出结果,马上就能看到波形和频谱对不对,等参数都调好了,再搬到单片机上,能省大把的时间。
还有一个常用操作是频谱分析,我们看信号的频率成分,就要做FFT变换。Matlab自带fft函数,用起来也很简单。还是拿刚才的1kHz正弦波来说,你做完fft之后再画个幅频特性图,就能在1kHz的位置看到一个明显的尖峰,要是加了噪声,也能看到噪声在整个频段上的分布,一眼就能看出你的滤波算法有没有把噪声滤掉。这里给大家一个小技巧,做FFT之前记得加窗,不加窗的话会有频谱泄露,结果不准,直接用汉宁窗或者汉明窗就行,Matlab都自带,调用一下就好。
还有就是数据导入导出,比如你把STM32采集到的原始数据存成txt文件,想放到Matlab里分析,直接用导入数据工具,点几下就能把数据读到工作区里,不用写复杂的读取代码。分析完结果,也能把数据导出成txt或者csv,方便你放到其他地方用,这个功能日常调试真的用得很多。
最后说一下新手容易踩的几个坑。第一个就是变量名不要和Matlab自带的函数重名,比如你给一个变量起名叫sin,那之后你再用sin函数就会报错,遇到这种情况只要clear sin就能恢复,平时起名的时候注意一点就好。第二个是矩阵索引,Matlab的索引是从1开始的,不是从0开始的,很多从C语言转过来的朋友容易在这里搞错,写代码的时候要多注意。第三个就是不要动不动就去啃几千页的Matlab官方手册,我们做STM32的DSP开发,只要把上面说的这些基础操作练熟,足够用了,遇到不懂的操作再去查资料,比从头看手册效率高多了。
总的来说,Matlab就是我们做DSP开发的一个调试工具,不用把它想的太复杂,把我们开发中用到的功能摸熟,就足够支撑我们完成整个项目了。下一章我们就开始讲怎么用Matlab设计STM32F4能用的FIR滤波器,把今天学的基础操作用起来。
STM32F407, DSP教程, Matlab基础操作, Matlab入门, STM32F4 DSP, Matlab信号处理, 滤波器设计, Matlab操作指南, DSP开发, Matlab入门指南
[Q]:学习STM32F4 DSP开发必须安装Matlab吗?
[A]:其实不强制要求,但Matlab能大幅提升调试效率,DSP算法参数、滤波器系数在Matlab中调试比直接在STM32上改方便很多,因此推荐新手使用Matlab做前期验证。
[Q]:做STM32F4 DSP开发对Matlab版本有要求吗?
[A]:不需要追求最新版本,只要不是太老旧(5年以上)的版本都能使用,安装时记得勾选信号处理工具箱和定点设计工具包即可满足需求。
[Q]:Matlab中怎么快速生成测试用的正弦信号?
[A]:只需要几行简单代码就能实现:先定义采样率和时间轴,再根据目标频率计算正弦值,就能得到需要的正弦信号,最后用plot函数就能直接查看波形。
[Q]:Matlab中怎么设计STM32能用的DSP滤波器?
[A]:直接在命令行输入fdatool打开滤波器设计工具,选择滤波器类型,输入采样率、截止频率、阶数等参数,点击设计就能得到滤波器系数,导出后就可以用到STM32工程中。
[Q]:Matlab中的脚本和函数有什么区别?
[A]:简单调试测试直接用脚本即可,按顺序执行命令就可以得到结果;如果需要反复调用同一段处理代码、更换参数运行,就把这段代码写成函数,方便重复调用。
[Q]:Matlab查看信号频率成分用什么功能?
[A]:可以用Matlab自带的fft函数做快速傅里叶变换,变换后绘制幅频特性图就能清晰看到信号的频率组成,做FFT前记得加窗减少频谱泄露。
[Q]:新手用Matlab最容易踩哪些坑?
[A]:常见坑有三个:一是变量名和Matlab自带函数重名导致报错,二是忘记Matlab索引从1开始,不符合C语言的0索引习惯,三是盲目啃完整手册浪费时间,只需要学开发用到的基础操作即可。
[Q]:STM32采集的数据可以导入Matlab分析吗?
[A]:可以,把STM32输出的原始数据保存为txt或者csv格式,直接用Matlab的导入数据工具,点击几次就能把数据导入工作区,直接进行分析处理。
首先得说一下环境准备,我们做STM32F4的DSP开发,Matlab版本不用追最新的,只要不是五六年前的老版本就行。我自己用的是R2020b,跑DSP相关的工具包完全没问题,安装的时候记得勾选信号处理工具箱和定点设计工具包,这两个是我们必须用到的,后面生成代码也要靠它们。如果安装的时候忘了选,后续再添加上也不难,不用重新装整个软件。
安装完打开软件,最先看到的就是主界面,很多新手看着一堆窗口就慌了。其实我们常用的就几个区域,左边的当前文件夹窗口,用来放我们的工程文件,中间是命令行窗口,输入命令就能直接出结果,右边是工作区,会显示你现在用到的所有变量。如果你的界面被调乱了,直接在主页选项卡那里点「重置布局」,就能回到默认状态,不用瞎折腾找半天。
我们做DSP第一步,往往是要生成一个测试信号,比如正弦波、方波,或者模拟实际采集到的带噪声信号。我举个最简单的例子,生成一个1kHz的正弦波,采样率设为10kHz,时长1秒。你直接在命令行输入几行代码就行。先定义采样时间间隔,fs = 10000; dt = 1/fs; t = 0:dt:1-dt; 这一步就是把时间轴做出来,从0到1秒,每个点间隔0.0001秒。然后再加一句f = 1000; s = sin(2*pi*f*t); 这样正弦信号就生成好了。
生成完信号,总得看看波形对不对吧?Matlab画个图超级简单,直接输plot(t, s); 回车之后就能弹出一个波形窗口,你就能看到清晰的正弦曲线了。如果想要加标注改样式,也不用非得写复杂代码,直接在弹出的图窗里用工具改就行,想改横坐标纵坐标名称,改线条颜色,直接点界面上的按钮操作,比手写命令省事多了。我们平时做调试,生成完信号画个图看看对不对,是每天都要用到的操作,练个两次就能记住。
很多人刚用Matlab,分不清脚本和函数,这里也简单说一下。我们做简单的测试,直接写脚本就行,就是新建一个.m文件,把所有命令按顺序写进去,点运行就能从头到尾执行一遍,结果直接出在工作区里。什么时候用函数呢?比如你写了一段处理信号的代码,要反复调用,换不同的参数运行,那就写成函数,把参数传进去就能得到结果,不用每次都复制粘贴改代码。
举个实际的例子,我们要给刚才生成的正弦波加高斯噪声,模拟实际传感器采集到的信号,就可以写个简单的函数。新建函数m文件,第一行写function [out] = add_noise(in, snr),然后里面写噪声生成的代码,最后输出加完噪声的信号就行。之后在脚本里调用,直接写s_noise = add_noise(s, 20); 就得到信噪比20dB的带噪信号了,是不是很方便?
接下来要说一个我们DSP开发里超级常用的功能,就是滤波器设计。我们做STM32F4的信号处理,十有八九要用到滤波,Matlab自带的滤波器设计工具比你自己手算系数方便一万倍。打开方式也简单,直接在命令行输入fdatool,回车就能弹出滤波器设计界面。你只要选好滤波器类型,比如FIR低通,然后输入采样率、截止频率,阶数,点一下设计滤波器,直接就能给你算出系数。
算出来的系数怎么用?你可以直接导出到工作区,然后把系数复制出来,放到STM32的工程代码里用。要是你想更方便,还可以直接用Matlab生成C代码,直接就能导入到STM32的开发环境里用,省去了手敲系数容易出错的问题。这个功能我们后面讲具体DSP实现的时候会详细说,现在先记住这个工具的位置就行。
很多新手会问,我做开发为什么非要用Matlab,直接在STM32上写代码调不行吗?其实真不行,DSP算法的参数调试,比如滤波器系数、FFT的窗口选择,你直接在单片机上改来改去,编译下载一次就要好几分钟,效率太低了。在Matlab里你改完参数一秒就能出结果,马上就能看到波形和频谱对不对,等参数都调好了,再搬到单片机上,能省大把的时间。
还有一个常用操作是频谱分析,我们看信号的频率成分,就要做FFT变换。Matlab自带fft函数,用起来也很简单。还是拿刚才的1kHz正弦波来说,你做完fft之后再画个幅频特性图,就能在1kHz的位置看到一个明显的尖峰,要是加了噪声,也能看到噪声在整个频段上的分布,一眼就能看出你的滤波算法有没有把噪声滤掉。这里给大家一个小技巧,做FFT之前记得加窗,不加窗的话会有频谱泄露,结果不准,直接用汉宁窗或者汉明窗就行,Matlab都自带,调用一下就好。
还有就是数据导入导出,比如你把STM32采集到的原始数据存成txt文件,想放到Matlab里分析,直接用导入数据工具,点几下就能把数据读到工作区里,不用写复杂的读取代码。分析完结果,也能把数据导出成txt或者csv,方便你放到其他地方用,这个功能日常调试真的用得很多。
最后说一下新手容易踩的几个坑。第一个就是变量名不要和Matlab自带的函数重名,比如你给一个变量起名叫sin,那之后你再用sin函数就会报错,遇到这种情况只要clear sin就能恢复,平时起名的时候注意一点就好。第二个是矩阵索引,Matlab的索引是从1开始的,不是从0开始的,很多从C语言转过来的朋友容易在这里搞错,写代码的时候要多注意。第三个就是不要动不动就去啃几千页的Matlab官方手册,我们做STM32的DSP开发,只要把上面说的这些基础操作练熟,足够用了,遇到不懂的操作再去查资料,比从头看手册效率高多了。
总的来说,Matlab就是我们做DSP开发的一个调试工具,不用把它想的太复杂,把我们开发中用到的功能摸熟,就足够支撑我们完成整个项目了。下一章我们就开始讲怎么用Matlab设计STM32F4能用的FIR滤波器,把今天学的基础操作用起来。
STM32F407, DSP教程, Matlab基础操作, Matlab入门, STM32F4 DSP, Matlab信号处理, 滤波器设计, Matlab操作指南, DSP开发, Matlab入门指南
[Q]:学习STM32F4 DSP开发必须安装Matlab吗?
[A]:其实不强制要求,但Matlab能大幅提升调试效率,DSP算法参数、滤波器系数在Matlab中调试比直接在STM32上改方便很多,因此推荐新手使用Matlab做前期验证。
[Q]:做STM32F4 DSP开发对Matlab版本有要求吗?
[A]:不需要追求最新版本,只要不是太老旧(5年以上)的版本都能使用,安装时记得勾选信号处理工具箱和定点设计工具包即可满足需求。
[Q]:Matlab中怎么快速生成测试用的正弦信号?
[A]:只需要几行简单代码就能实现:先定义采样率和时间轴,再根据目标频率计算正弦值,就能得到需要的正弦信号,最后用plot函数就能直接查看波形。
[Q]:Matlab中怎么设计STM32能用的DSP滤波器?
[A]:直接在命令行输入fdatool打开滤波器设计工具,选择滤波器类型,输入采样率、截止频率、阶数等参数,点击设计就能得到滤波器系数,导出后就可以用到STM32工程中。
[Q]:Matlab中的脚本和函数有什么区别?
[A]:简单调试测试直接用脚本即可,按顺序执行命令就可以得到结果;如果需要反复调用同一段处理代码、更换参数运行,就把这段代码写成函数,方便重复调用。
[Q]:Matlab查看信号频率成分用什么功能?
[A]:可以用Matlab自带的fft函数做快速傅里叶变换,变换后绘制幅频特性图就能清晰看到信号的频率组成,做FFT前记得加窗减少频谱泄露。
[Q]:新手用Matlab最容易踩哪些坑?
[A]:常见坑有三个:一是变量名和Matlab自带函数重名导致报错,二是忘记Matlab索引从1开始,不符合C语言的0索引习惯,三是盲目啃完整手册浪费时间,只需要学开发用到的基础操作即可。
[Q]:STM32采集的数据可以导入Matlab分析吗?
[A]:可以,把STM32输出的原始数据保存为txt或者csv格式,直接用Matlab的导入数据工具,点击几次就能把数据导入工作区,直接进行分析处理。
评论 (0)
