米肖恩·马拉特,马修斯
大家怎么了?我叫米肖恩,欢迎观看这段视频,介绍如何使用Simulink将MATLAB脚本部署到Arduino。哇,这是新的!使用Simulink部署MATLAB脚本?万博1manbetx
你一定在想:这可能吗?
Simuli万博1manbetxnk允许您将MATLAB脚本插入MATLAB函数块中,然后立即从Simulink生成代码。别担心,我们将在视频后面讨论MATLAB函数块,但现在,让我给你一个音频处理应用程序的快速演示,我已经在Simulink中开发了这个应用程序。我在声音剪辑上实现了音频效果,使用Simulink生成代码,然后从Simulink将代码部署到Arduino MKR1000板上。
这是一个带有MATL万博1manbetxAB函数块的Simulink模型,其中包含了音频效果的实现。由Simulink生成的代码在这个板上实时运行,万博1manbetx我使用Simulink通过外部模式调整参数和监控信号。
那么,您刚才听到了原始声音片段,然后是三种不同的音频效果,在片段上实现;即回声效果、混响和音调偏移效果。很有趣,不是吗?
现在,让我们从MATLAB功能块开始,更详细地了解一下在Simulink中开发的音频应用程序。让我们打开一个空白的Simulink模型,万博1manbetx然后导航到Simulink库。在“用户定义函数”下,可以找到MATLAB功能块。让我们把这个添加到空白模型中。您也可以在Simulink编辑器中的任意位置键入MATLAB函数并获得此块。让我们先添加一个常量块,然后再添加一个显示块。现在,让我们双击这个块。因此,这里是实现MATLAB脚本的地方。让我们看一个简单的标量乘法示例。将输入乘以2。现在让我们运行这个Simulink模型。完美的答案是2,正如预期的那样。
我们刚刚看到了一个非常基础的MATLAB函数块在Simulink中的实现。万博1manbetx在我们的Simulink模型中实现的音频效果背后的算法是作为MATLAB脚本开发的,然后在Simulink中的这些MA万博1manbetxTLAB函数块中使用。然后从Simulink生成代码并直接部署到Arduino MKR1000板。万博1manbetx音频输出可在板的DAC引脚。为了听到这个,我只是使用了一个3.5 mm的音频分接板,然后将它连接到板上的DAC引脚和GND引脚。耳机/耳机现在可以连接到这个接线板来听到声音。如果你没有这个音频接线板也不用担心。您可以简单地将电线缠绕在耳机/耳机的音频插孔上,并将其适当地连接到电路板上的DAC和GND插脚上。
就这样!因此,对于这个音频应用程序,您只需要一个耳机、Arduino和Simulink!万博1manbetx
好吧。现在,有了这些信息,让我们回到Simulink模型。万博1manbetx除了MATLAB函数块,在这个应用程序中还使用了一些其他的i/o块。这是一个常量块,用于访问声音剪辑,以实现音频效果。这里需要注意的一件有趣的事情是,Simulink允许在闪存中存储数据,比如这里的声音万博1manbetx片段,这在目标硬件没有足够的RAM内存时非常有用。为了做到这一点,您需要将常量块的采样时间设置为无穷大,这已经为这个块做了。其次,您需要在代码生成优化设置中将默认参数行为设置为内联。让我们快速看一下这个。我们进入配置参数;在“代码生成”选项卡“优化设置”下,您可以找到默认参数行为。 It is already set to inlined.
好的,我们的下一个模块是Arduino的模拟输出模块。它在板上指定的DAC引脚上产生电压。它是Arduino Simulink支持包的一部分。万博1manbetx万博1manbetx
我们的下一个块是To Workspace块。它帮助我们将仿真输出保存到工作空间中的一个变量中,以便在MATLAB中对数据进行任何后处理或分析。
接下来,让我们看看这个旋转旋钮。它是一个交互式用户界面块,通过将所选值指定给变量或常量来帮助选择音频效果。如您所见,此应用程序中实现了三种音频效果。回声效果、混响效果和音调偏移效果。选项“原始”指没有音频效果的原始声音片段。旋转旋钮选择的算法作为常量存储在此常量块中。然后,MATLAB功能块利用此常量值实现所选音频效果。
现在,如果您有兴趣浏览原始声音片段属性,请单击此按钮。它启动一个MATLAB脚本,读取声音片段,并根据其属性定义许多常数,然后将这些常数用于此Simulink模型。此脚本在加载Simulink模型之前首先运行。万博1manbetx
我们看到了一些i/o和UI块。现在让我们关注模型的大脑,即MATLAB函数块。在中间,你可以看到一个子系统块。该模块将与在该Simulink模型中实现的音频处理应用程序相对应的所有MATLAB函数模块分组。万博1manbetx
第一个MATLAB功能块按原样播放原始声音片段。块内的脚本将每个音频样本写入板上的DAC引脚。此脚本中不进行其他计算。现在,由于模拟输出块只接受uint16数据类型,因此MATLAB Fcn块中使用的所有变量和常量都是uint16数据类型。
我们的第二个MATLAB Fcn块实现了回声音频效果。在阅读脚本之前,让我们先了解回声效果是什么。回声效应只是当前和延迟音频样本的叠加。因此,人们可以同时感知当前和过去的音频样本。这种效应称为回声效应。如该等式所示,输出是当前和过去音频样本的加权和。参数alpha控制回声的强度。TauD是与实际延迟相对应的延迟样本数(以秒为单位)。使用表达式(1+alpha)对最终输出方程进行规范化,以在播放过程中考虑声音饱和度。
好了,现在我们了解了echo的工作原理,让我们回到MATLAB Fcn块实现中,来了解echo效果。如前所述,所有MATLAB Fcn块中都使用uint16数据类型,因为这是模拟输出块所支持的。但是,我们如何在我们的MATLAB脚本中为不同的变量和常量使用浮点值呢?例如,延迟0.5秒,增益0.8?万博1manbetx
为了解决这个问题,浮点值被表示为有理数,即分子与分母的形式。正如你在这里看到的,以秒为单位的延迟和增益被表示为有理数。
然而,这并不能完全解决问题。这些有理数现在通过LCM在最终输出方程中重新排列,以便有一个公约数。这会将除法的数量减少到仅一个,从而最终减少由于无符号整数值的除法而导致的精度损失。
正如您在这里看到的,这是回波效应的最终输出方程,它已经被重新安排为具有一个公约数,因此进行了一次除法操作,这有助于实现更好的精度。
对,这就是回声效应。接下来,让我们看看混响效果。这种效果也称为混响,是声音产生后声音的持续性,由多次反射产生,最终随着声音被不同物体吸收而衰减。这意味着输出方程依赖于过去的音频输入样本以及过去的音频输出样本,分别对反射和衰减现象进行建模。
在回波输出方程中,参数alpha控制效果的强度,tauD是与实际延迟(以秒为单位)对应的延迟采样数。
为了模拟多次反射和衰减,以级联方式使用三个不同的tauD值实现了输出方程,以便模拟后续反射和衰减。
好的,现在我们可以跳转到MatlabFCN块实现中,以获得混响效果。与echo效应类似,浮点变量和常量已表示为有理数,最终输出方程已重新排列为具有公约数的单除法运算,以减少由于无符号整数值的除法而造成的精度损失。
这是与第一个延迟值对应的第一个差分方程。该方程的输出作为与第二个延迟值对应的第二个差分方程的输入,依此类推。
最后,输出与音频输入叠加,然后进行归一化以处理饱和度问题。
到目前为止,我们已经讨论了回声和混响算法。让我们来谈谈这些算法的性能。声音剪辑的采样率是8KHz。这意味着为了在声音剪辑上听到有意义的音频效果,算法需要在125uS范围内工作,这是8KHz的倒数。如果不这样做,将导致板上的算法过载和音频效果将是不可取的。echo和混响算法都经过了优化,使得Simulink中每个时间步骤的执行时间小于125uS。万博1manbetx
好的,现在让我们继续我们的最后一个算法,那就是音高偏移效应。这个效应是通过拉伸或压缩声音片段,然后以与拉伸或压缩因子相等的速率播放产生的信号来实现的,分别导致音高的增加或减少。例如,stretching是通过以声音片段的相等间隔固定小窗口长度,然后以这些间隔附加窗口来扩展声音片段来实现的。这实际上是以相等的时间间隔复制声音片段。现在生成的声音片段具有两倍的样本数。以两倍的samp播放生成的声音片段le rate或播放速率合成的声音片段在相同的持续时间内播放,但音高会增加。不需要附加音频样本,可以以相等的间隔删除音频样本,然后以较慢的速率播放信号,以降低音高。
现在,了解了这一点,让我们回到Simulink模型,回到MATLAB Fcn块,实现基音偏移效果。这里实万博1manbetx现了20毫秒的窗口长度。该算法累积等于窗口长度的音频样本,然后定期将其附加到原始声音片段。
如前所述,与其他算法相比,使用基音偏移算法,我们需要将播放速率提高一倍,或者换句话说,将MATLAB Fcn块的采样时间减少一半。这种调度可以在Simulink中轻松完成。事实上,Simulink的核心优势之一就是它的调度功能。在Simulink模型中执行不同块的调度非常方便。它与根据块参数设置采样时间一样简单。让我们右键单击一个特定的块。导航到块参数。这是采样时间。因此,对于基音偏移MATLAB Fcn块,采样时间应为其他块的一半,即算法要求的采样率的两倍。万博1manbetx
此外,我们需要速率转换块,它负责Simulink中的多速率建模。由于俯仰移动MATLAB Fcn块以两倍于采样率的速度运行,因此将在该MATLAB Fcn块之前和之后插入这些块。如果你的模型中没万博1manbetx有多费率,不像我,你就不需要它们了。
不同的线颜色表示模型中存在的不同采样时间。红色是最快的,绿色是最慢的。粉红色指的是一个常数,意味着有无限的采样时间。粉红色就像你的朋友!理想情况下,您需要一条粉红色的线,以确保参数始终可用于模拟,其行为类似于常量,因此在代码生成期间进入闪存。
事实上,Simulink中的调度特性是令人难以置信的,因为在其他id万博1manbetxe中实现相同的特性有时会太麻烦。
好,这是MATLAB Fcn块的三个实现,用于为这个应用设计的三个音频效果。现在,在将代码部署到硬件之前,让我们在Simulink中模拟这个万博1manbetx模型。选择“正常模式”模拟主机中的模型,即这台笔记本电脑。设置模拟持续时间为5s,因为音频剪辑的长度为5s。
好的,现在让我们播放模拟数据。通常,我可以从音频系统工具箱库中添加一个“音频写入”块到这个模型中,然后播放声音。但是,如果没有,则可以使用“到工作区”块在模拟结束时创建的变量从MATLAB播放声音。引擎盖下的这个按钮触发一个回调函数,该函数从工作区中提取变量,并从MATLAB中播放。
这是原始的声音剪辑。现在让我们在剪辑上实现一些音频效果。这就是回声的声音。接下来,让我们单击混响并模拟。这就是混响效应。选择我们的最终算法,基音偏移效应。让我们模拟一下这个效果。完美的因此,所有算法的模拟都进行得很顺利。
现在,我们将继续进行目标硬件部署。一旦部署到硬件上,一次只有一个算法将在硬件上运行。除非我们连接一些外部按钮开关,否则无法在算法之间动态切换,而这些按钮开关只会将越来越多的硬件添加到此应用程序。
幸运的是,我们确实有一种机制,通过该机制,我们可以在Simulink中的算法在目标上运行时动态切换。这是通过在外部模式下运行模拟来完成的。外部模式模拟是Simulink的另一个有趣功能,它可万博1manbetx以帮助您在硬件上实时运行模型,并将Simulink模型中的实时参数更改应用于电路板。因此,调整参数和监控信号只需生成一次代码。在我们的应用程序中,当代码在硬件上运行时,借助外部模式模拟,我们将在不同的算法之间切换。
在开始之前,让我们快速看一下硬件设置。这是一个简单的设置,一个Arduino MKR1000板通过微型USB电缆连接到笔记本电脑,一个3.5毫米音频插孔一端连接到笔记本电脑,另一端连接断接板,如前所述,用于记录最终的音频输出。在您的情况下,您可以只需将合适的3.5毫米耳机连接到转接板,而不是绿色音频电缆,即可直接收听Arduino的音频输出。
好的,现在我们将开始外部模式模拟,将时间段设置为无穷大,因为我们将连续运行模拟。让我们按一下跑步按钮。默认情况下,模型设置为播放原始声音片段。播放原始声音片段后,我们将通过旋转旋钮选择回声效果,然后选择混响和音调偏移效果。在外部模式模拟的帮助下,这些更改直接传送到板上运行的代码。
好吧,好吧,这就是你的外部模式模拟。
通过此模拟,我们将结束此视频。本视频中实现的音频应用程序只是一个小示例,演示了MATLAB Fcn块在Simulink中实现MATLAB脚本的能力。您可以继续使用MATLAB脚本以及Simulink中的MATLAB Fcn块构建自己的应用程序。万博1manbetx
我希望你喜欢这个视频。更多关于MATLAB和Simulink产品的视频,请访问我们的网站s manbetx 845万博1manbetxwww.tianjin-qmedu.com/videos
您还可以从以下列表中选择网站:
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家/地区网站未针对您所在地的访问进行优化。