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