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