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