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