Meeshawn Marathe, MathWorks
各位,发生什么事了?我是Meeshawn,欢迎来到本视频,学习如何使用Simulink将MATLAB脚本部署到Arduino上。万博1manbetx哇,这是新的!使用Simulink部署MATLAB脚本万博1manbetx
你一定在想:这可能吗?
嗯,Simu万博1manbetxlink使您可以在MATLAB功能块内插入MATLAB脚本,然后立即生成代码。别担心,我们将在视频中稍后讨论Matlab函数块,但现在让我快速地演示我在Simulink中开发的音频处理应用程序。万博1manbetx我已经在声音剪辑上实现了音频效果,使用Simulink生成的代码,然后从Simulink部署到Arduino MKR1000板的代码。万博1manbetx
这是一个带有MATL万博1manbetxAB函数块的Simulink模型,其中包含了音频效果的实现。由Simulink生成的代码在这个板上实时运行,万博1manbetx我使用Simulink通过外部模式调整参数和监控信号。
所以,你刚刚听到的是原始的声音剪辑,然后是三种不同的音频效果,在剪辑上实现;即回声效应、混响效应和位移效应。很有趣,不是吗?
现在,让我们仔细看看在Simulink中开发的音频应用程序,从Matlab功能块开始。万博1manbetx让我们打开一个空白的Simulink模万博1manbetx型,然后导航到Simulink库。在用户定义的函数下,您可以找到MATLAB功能块。让我们将其添加到空白模型中。您还可以在Simulink编辑器中的任何位置开始键入matlab函数并获取此块。万博1manbetx让我们添加一个常量块,然后添加一个显示块。现在,让我们双击此块。所以,这是您将在哪里实现MATLAB脚本。让我们看看一个简单的标量乘法示例。将输入乘以2.现在让我们刚刚运行此Simulink模型。万博1manbetx Perfect! The answer is 2, as expected.
所以,我们刚刚看到了一个非常基本的MATLAB函数块在Simulink中的实现。万博1manbetx在我们的Simulink模型中实现的音频效果背后的算法是作为MATLAB脚本开发的,然后在Simulink中的MATL万博1manbetxAB函数块中使用。然后从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工作区块。它帮助我们将仿真输出保存到工作空间中的一个变量,以便在MATLAB中执行任何后处理或数据分析。
接下来,让我们看看这个旋转旋钮。它是一个交互式UI块,通过将选择的值赋给一个变量或常量来帮助选择音频效果。正如您在这里看到的,在这个应用程序中实现了三种音频效果。回声效应,混响效应,和纵移效应。“原始”选项指的是没有音频效果的原始声音剪辑。旋转旋钮选择的算法作为一个常数存储在这个常数块中。MATLAB函数块然后利用这个常数值来实现选定的音频效果。
现在,如果你对原始的声音剪辑属性感兴趣,点击这个按钮。它启动一个MATLAB脚本,读取声音片段并从其属性中定义许多常量,然后在这个Simulink模型中使用。万博1manbetx在加载Simulink模型之前,首先运行这个脚本。万博1manbetx
我们看到了一些i/o和UI块。现在让我们关注模型的大脑,它是MATLAB函数块。在中间,你可以看到一个子系统块。该模块将该Simulink模型中实现的音频处理应用程序对应的所有MATLAB函数模块进行了分组。万博1manbetx
第一个MATLAB功能块按照原样播放原始声剪辑。块内的脚本将每个音频样本写入电路板上的DAC引脚。此脚本中没有其他计算。现在,由于模拟输出块仅接受UINT16数据类型,因此Matlab FCN块内使用的所有变量和常数都是UINT16数据类型。
我们的第二个Matlab FCN块实现了回声音频效果。在进行脚本之前,首先要明白回声效果是什么。回声效果仅仅是电流和延迟音频样本的叠加。结果,人们可以同时感知到现在以及过去的音频样本。这种效果称为回波效果。如在该等式中所见,输出是当前和过去音频样本的加权和。参数alpha控制回声的强度。Taud是与实际延迟相对应的延迟样本的数量。使用表达式(1 + alpha)归一化最终输出方程,以在播放期间处理声音饱和度。
好了,现在我们了解了echo是如何工作的,让我们回到MATLAB的Fcn块实现echo effect。如前所述,uint16数据类型被用于所有的MATLAB Fcn块,因为这是模拟输出块支持的。万博1manbetx但是,在MATLAB脚本中,我们如何对不同的变量和常量使用浮点值呢?例如,延迟0.5秒,增益0.8秒?
为了解决这一问题,将浮点值表示为有理数,即分子分母形式。正如您在这里看到的,以秒为单位的延迟和增益都用有理数表示。
然而,这并没有完全解决问题。这些有理数现在通过取LCM重新排列在最终的输出方程中,从而有一个公约数。这将除法的次数减少到只有一个,这最终减少了由于无符号整数值的除法而造成的精度损失。
正如你在这里看到的,这是回波效应的最终输出方程,它被重新安排为有一个公约数,因此进行了一个单独的除法操作,这有助于达到更好的精度。
对,所以这是回声效果。接下来,让我们来看看混响效果。又称混响,这种效果是在发出声音后的声音的持久性,由多个反射产生,这最终衰减,因为声音被不同的物体吸收。这意味着输出方程取决于过去的音频输入样本以及过去的音频输出样本,以分别模拟反射和衰减现象。
在回波输出方程中,参数alpha控制影响的强度,而tauD是与实际延迟相对应的延迟样本数(以秒为单位)。
为了模拟多个反射和衰减,输出方程已经用级联方式以三种不同的Taud值实现,以便模拟后续反射和衰减。
好吧,所以现在我们可以跳转到Matlab FCN阻止实现的混响效果。类似于回声效果,浮点变量和常数已表示为Rational Numbum,并且重新排列最终输出方程以具有单个划分的公共除数,以减少由于无符号整数值的划分而降低精度的损失。
这是对应于第一个延迟值的第一个差分方程。该方程的输出作为第二个差分方程对应的第二个延迟值的输入,以此类推。
最后,输出与音频输入叠加,然后归一化处理饱和。
到目前为止,我们已经讨论了回声和混响算法。让我们来谈谈这些算法的性能。声音片段的采样率为8KHz。这意味着为了听到在声音剪辑上实现的有意义的音频效果,算法需要在125uS内工作,这是8KHz的倒数。如果不这样做,就会导致棋盘上算法的过度运行,音频效果也会不受欢迎。对回波算法和混响算法进行了优化,使得Simulink中每个时间步的执行时间都小于125uS。万博1manbetx
好了,现在我们来看最后一个算法,也就是调距效应。这种效果是通过拉伸或压缩声音片段,然后以等于拉伸或压缩因子的速率播放产生的信号,分别导致音调的增加或减少。例如,拉伸是通过在声音片段的相等间隔上固定小窗口长度,然后通过在这些间隔上附加窗口来扩展声音片段来实现的。这实际上是在相同的时间间隔复制声音片段。合成的声音片段有两倍的样本现在。以两倍的采样率或回放率播放合成的声音片段,合成的声音片段播放相同的时间,但音调有所增加。而不是附加音频样本,一个人可以在相同的间隔删除音频样本,然后以较慢的速度播放信号,以获得音高的减少。
现在有了这样的理解,让我们回到Simulink模型,回到MATLAB的Fcn模块,来实现纵移效果。万博1manbetx这里实现了20ms的窗口长度。该算法将等于窗口长度的音频样本累积起来,然后定期将其添加到原始声音剪辑中。
现在正如所讨论的,与其他算法相比,使用变焦算法,我们需要将回放速率提高一倍,或者换句话说,将MATLAB Fcn块的采样时间减少一半。这种调度在Simulink中可以很容易地完成。万博1manbetx事实上,Simulink的核心优势之一就是它的调度功能。万博1manbetx在Simulink模型中执行不同块的调度是非常方便的。万博1manbetx它与从块参数设置采样时间一样简单。让我们右键点击一个特定的块。导航到块参数。这是样本时间。因此,对于移距MATLAB Fcn块,采样时间应为其他块的一半,即采样率为算法要求的两倍。
此外,我们需要在Simulink中处理速率转换块,从而处理多速率建模。万博1manbetx由于音高移位MATLAB FCN块以采样率的两倍运行,因此在此MATLAB FCN块之前和之后插入这些块。如果您的模型中没有多率,与我不同,您将不需要它们。
不同的线条颜色表示模型中存在的不同样本时间。红色是最慢的最快和绿色。粉红色的推荐人常数,意思是具有无限的采样时间。粉红色就像你的朋友!您理想地希望粉红色线以确保参数始终可用于模拟,并表现得像常量,因此在代码生成期间进入闪存。
实际上,Simulink中的调度特性是令人难以置信的,因为有时在其他万博1manbetxide中实现同样的功能会变得太麻烦。
好了,这是三个MATLAB Fcn块实现为这个应用设计的三个音频效果。现在,在将代码部署到硬件之前,让我们在Simulink中模拟模型万博1manbetx。选择“普通模式”在主机上模拟模型,主机就是这台笔记本电脑。由于音频剪辑的长度为5s,所以将模拟的持续时间设置为5s。
好了,现在我们来玩模拟数据。通常情况下,我可以从音频系统工具箱库中添加“音频写入”块到这个模型中,然后播放声音。但是,如果没有,可以使用To-Workspace块在模拟结束时创建的变量从MATLAB中播放声音。这个按钮触发了一个回调函数,该函数从工作空间中获取变量,并从MATLAB中播放它。
这是最初的声音片段。现在让我们在剪辑上实现一些音频效果。这就是回声的声音。接下来,让我们点击混响和模拟。这就是混响效果。选择我们最终的算法,即变焦效果。让我们模拟一下这种效果。完美!所有算法的模拟都进行得很顺利。
现在,我们将转向目标硬件部署。一旦部署到硬件上,每次只有一个算法在硬件上运行。没有办法在算法之间动态切换,除非我们连接一些外部按钮开关,这只会增加越来越多的硬件到这个应用程序。
幸运的是,我们有一个机制,通过它我们可以从Simulink动态切换算法,当它们运行在目标上。万博1manbetx这是通过在外部模式下运行模拟来实现的。外部模式仿真是Simulink的另一个有趣的特性,它可以帮助您在硬件上实时运行您的模型,并将Simulink模型中的实时参数变化应用到万博1manbetx电路板上。因此,只需生成一次代码就可以调优参数和监视信号。在我们的应用中,当代码在硬件上运行时,我们将通过外部模式模拟在不同的算法之间切换。
在开始之前,让我们快速查看一下硬件设置。如上所述,只需简单设置Arduino MKR1000板,通过micro USB线连接到笔记本电脑,并在一端连接到笔记本电脑,另一端连接到分线板,就可以记录最终的音频输出。在您的情况下,您只需将一个合适的3.5毫米耳机连接到接线板,而不是这个绿色音频电缆,就可以直接从Arduino接收音频输出。
好吧,所以现在我们将开始外部模式仿真,将时间段设置为Infinity,因为我们将连续运行模拟。让我们点击运行按钮。默认情况下,该模型设置为播放原始声音剪辑。播放原始声剪辑后,我们将选择回波效果,然后是旋转旋钮的帮助和振荡效果。在外部模式仿真的帮助下,这些更改直接传送到板上运行的代码。
好吧,好吧,这是你的外部模式模拟。
通过这个模拟,我们来到了这个视频的末尾。在此视频中实现的音频应用程序只是一个小示例,演示了Matlab FCN块在Simulink中实现了MATLAB脚本的功能。万博1manbetx您可以使用Matlab脚本以及Matlab FCN块在Simulink中使用Matlab脚本来构建自己的应用程序。万博1manbetx
希望你喜欢这个视频。更多关于MATLAB和Simulink产品的视频,请访问我们的网站s manbetx 845万博1manbetxwww.tianjin-qmedu.com/videos
您也可以从以下列表中选择一个网站:
选择中国网站(中文或英文)以获得最佳的网站性能。其他MathWorks国家网站没有针对您所在位置的访问进行优化。
本网站使用cookie来改善您的用户体验,个性化内容和广告,并分析网站流量。通过继续使用本网站,您同意我们使用cookie。请看我们隐私政策了解更多关于cookie和如何更改您的设置。