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