Meeshawn Marathe, MathWorks
发生了什么事,各位?我的名字是Meeshawn,欢迎收看这个关于如何使用Simulink将MATLAB脚本部署到Arduino的视频。万博1manbetx哇,这是新的!使用Simulink部署MATLAB脚本?万博1manbetx
你一定在想:这可能吗?
好吧,Sim万博1manbetxulink使您能够将您的MATLAB脚本插入到MATLAB函数块中,然后立即从Simulink生成代码。别担心,我们会在稍后的视频中讨论MATLAB函数块,但现在,让我给你们一个快速演示一个音频处理应用程序,这是我在Simulink中开发的。万博1manbetx我在一个声音剪辑上实现了音频效果,使用Simulink生成了代码,然后从Simulink将代码部署到Arduino MKR1000板。万博1manbetx
这是一个带有MATL万博1manbetxAB函数块的Simulink模型,其中包含了音频效果的实现。由Simulink生成的代码在这个板上实时运行,万博1manbetx我使用Simulink通过外部模式调整参数和监控信号。
所以,你现在听到的是原始的声音剪辑,接下来是三种不同的音频效果,执行在剪辑上;即回声效应、混响效应和音高位移效应。很有趣,不是吗?
现在,让我们仔细看看在Simulink中开发的音频应用程序,从MATLAB函数块开始。万博1manbetx让我们打开一个空白的Simulink模万博1manbetx型,然后导航到Simulink Library。在用户定义函数下,可以找到MATLAB函数块。让我们将其添加到空白模型中。你也可以在Simulink编辑器的任何地方输入MATLAB Function并获得这个块。万博1manbetx让我们先添加一个常量块,然后添加一个显示块。现在,让我们双击这个块。这里是实现MATLAB脚本的地方。让我们看一个简单的标量乘法的例子。输入乘以2。 Now let’s just run this Simulink model. Perfect! The answer is 2, as expected.
我们刚刚看到了一个非常基础的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中对数据进行任何后处理或分析。
接下来,让我们看看这个旋转旋钮。它是一个交互式UI块,通过将选定的值赋给一个变量或常量来帮助选择音频效果。正如您在这里看到的,在这个应用程序中实现了三种音频效果。回声效应、混响效应和音高偏移效应。“原始”选项是指没有音频效果的原始声音剪辑。由旋转旋钮选择的算法作为常量存储在这个常量块中。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的倒数。如果不这样做,将导致板上的算法过载和音频效果将是不可取的。echo和混响算法都经过了优化,使得Simulink中每个时间步骤的执行时间小于125uS。万博1manbetx
好了,现在我们来看看最终的算法,也就是pitch-shift效应。这种效果是通过拉伸或压缩声音片段,然后以与拉伸或压缩因子相等的速率回放产生的信号来实现的,分别导致音调的增加或减少。例如,拉伸是通过在声音剪辑的等距上固定小窗口长度,然后在这些间隔上附加窗口来扩展声音剪辑来实现的。这实际上是以相同的时间间隔复制声音片段。现在合成的声音片段有两倍的样本数量。以两倍的采样率或回放率播放合成声音片段,合成声音片段将播放相同的时间,但音调会增加。不需要附加音频样本,而是可以以相等的间隔去除音频样本,然后以较慢的速率回放信号,以获得音调的降低。
现在有了这些理解,让我们回到Simulink模型,回到MATLAB Fcn模块,实现pitch-shif万博1manbetxt效果。这里实现了一个20毫秒的窗口长度。该算法累积等于窗口长度的音频样本,然后定期将其添加到原始音频剪辑中。
如前所述,使用pitch-shift算法,与其他算法相比,我们需要将回放速率加倍,或者换句话说,将MATLAB Fcn块的采样时间减少一半。这种调度可以很容易地在Simulink中完成。万博1manbetx事实上,Simulink的核心优势之一就是它的调度特性。万博1manbetx在Simulink模型中执行不同块的调度非常方便。万博1manbetx它与通过块参数设置样本时间一样简单。让我们右击一个特定的块。导航到块参数。这是样本时间。因此,对于pitch-shift MATLAB Fcn块,根据算法要求,采样时间应该是其他块的一半,即采样率的两倍。
此外,我们还需要速率转换块,它负责在Simulink中进行多速率建模。万博1manbetx由于pitch-shift MATLAB Fcn块以两倍的采样率运行,这些块被插入到这个MATLAB Fcn块之前和之后。如果你的模型中没有多重利率,不像我,你就不需要它们。
不同的线条颜色表示样品在模型中出现的时间不同。红色最快,绿色最慢。粉色代表一个常数,意味着有无限的采样时间。粉红色就像你的朋友!理想情况下,您希望有一条粉红色的线,以确保参数总是可以用于模拟,并像常量一样运行,因此在代码生成期间进入闪存。
事实上,Simulink中的调度特性是令人难以置信的,因为在其他id万博1manbetxe中实现相同的特性有时会太麻烦。
好,这是MATLAB Fcn块的三个实现,用于为这个应用设计的三个音频效果。现在,在将代码部署到硬件之前,让我们在Simulink中模拟这个万博1manbetx模型。选择“正常模式”模拟主机中的模型,即这台笔记本电脑。设置模拟持续时间为5s,因为音频剪辑的长度为5s。
好,现在让我们播放模拟数据。通常情况下,我可以从音频系统工具箱库中添加一个“音频写入”块到这个模型中,然后播放声音。但是,如果你没有,你可以在MATLAB中播放声音,使用在模拟结束时由To-Workspace块创建的变量。引擎盖下的这个按钮触发一个回调函数,该函数从工作区中获取变量,并在MATLAB中播放它。
这是最初的声音片段。现在让我们在剪辑上实现一些音频效果。这就是回音的声音。接下来,让我们点击混响和模拟。这就是混响效应。选择我们最终的算法,pitch-shift效果。让我们模拟一下这种效果。完美!所以所有算法的模拟都很顺利。
现在,我们将继续讨论Target硬件部署。一旦部署到硬件上,每次只有一个算法在硬件上运行。没有办法在算法之间动态切换,除非我们连接一些外部按钮开关,这只会增加越来越多的硬件到这个应用程序。
幸运的是,我们确实有一种机制,通过这种机制,我们可以在运行于目标上的Simulink中动态地切换算法。万博1manbetx这是通过在外部模式下运行模拟来实现的。外部模式模拟是Simulink另一个有趣的特性,它可以帮助您在硬件上实时运行模型,并将Simulink模型中的实时参数更改应用到板上。万博1manbetx因此,只需要生成一次代码就可以调优参数和监视信号。在我们的应用程序中,我们将在不同算法之间切换,而代码是在硬件上运行的外部模式模拟的帮助下。
在开始之前,让我们快速查看一下硬件设置。这是一个简单的设置,Arduino MKR1000板通过微型USB线连接到笔记本电脑,3.5毫米音频插孔一端连接到笔记本电脑,另一端连接到接线板,如前所述,以记录最终的音频输出。在您的情况下,您只需将一个合适的3.5毫米耳机连接到接线板,而不是这个绿色音频线,就可以直接从Arduino听音频输出。
好的,现在我们将开始外部模式模拟,将时间周期设为无穷大因为我们将连续运行模拟。让我们按下运行按钮。默认情况下,模型被设置为播放原始的声音片段。播放完原声剪辑后,我们会选择回声效果,然后是混响和音高转换效果,通过旋转旋钮。在外部模式模拟的帮助下,这些更改直接通信到在板上运行的代码。
这就是外部模态模拟。
有了这个模拟,我们就结束了这个视频。在这个视频中实现的音频应用程序只是一个小示例,演示了MATLAB Fcn Blocks在Simulink中实现MATLAB脚本的能力。万博1manbetx您可以继续使用MATLAB脚本以及Simulink中的MATLAB Fcn块来构建自己的应用程序。万博1manbetx
我希望你喜欢这个视频。更多关于MATLAB和Simulink产品的视频,请访问我们的网站s manbetx 845万博1manbetxwww.tianjin-qmedu.com/videos
你也可以从以下列表中选择一个网站:
选择中国网站(中文或英文)以获得最佳网站性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。