主要内容

使用生成的代码来加速使用MATLAB编译器部署的应用程序

此示例展示如何使用生成的代码加速使用MATLAB®Compiler部署的应用程序。该示例通过使用MATLAB®Coder™生成算法的MEX版本来加速算法。它使用MATLAB编译器部署一个调用MEX函数的独立应用程序。部署的应用程序使用MATLAB®运行时,它可以为没有MATLAB的人提供免版税的部署。

这个工作流在以下情况下是有用的:

  • 您希望将应用程序部署到MATLAB运行时支持的平台上。金宝app

  • 该应用程序包括一个计算密集型算法,适用于代码生成。

  • 该算法生成的MEX比原来的MATLAB算法更快。

  • 您不需要为应用程序部署可读的C/ c++源代码。

示例应用程序使用了需要DSP System Toolbox™的DSP算法。

创建MATLAB应用程序

对于加速,最好的做法是将计算密集型算法与调用它的代码分开。

在这个例子中,myRLSFilterSystemIDSim实现算法。myRLSFilterSystemIDApp提供调用的用户界面myRLSFilterSystemIDSim

myRLSFilterSystemIDSim采用递归最小二乘(RLS)自适应滤波模拟系统辨识。该算法使用dsp。VariableBandwidthFIRFilter为未知系统建模dsp。RLSFilter来识别FIR滤波器。

myRLSFilterSystemIDApp提供用于动态调优模拟参数的用户界面。它在指定的时间步数内运行模拟,或者直到您停止模拟为止。它绘制了作用域模拟的结果。

该应用的详细信息请参见基于RLS自适应滤波的系统识别(DSP系统工具箱)在DSP系统工具箱文档中。

在可写文件夹中,创建myRLSFilterSystemIDSimmyRLSFilterSystemIDApp.或者,单击,访问这些文件打开脚本

myRLSFilterSystemIDSim

函数(tfe、犯错、cutoffFreq ff) =...myRLSFilterSystemIDSim (tuningUIStruct)中使用的算法% myRLSFilterSystemIDApp。这个函数实例化、初始化和遍历系统%在算法中使用的对象。您可以调优所需系统的截止频率和%遗忘因子的RLS过滤器通过GUI时出现% myRLSFilterSystemIDApp被执行。版权所有:The MathWorks, Inc.% # codegen实例化和初始化系统对象。对象被声明%持久化,这样就不会在每次函数被创建时重新创建它们%在模拟循环中调用。持续的rlsFilt sinunknownsys transferFunctionEstimator如果isempty (rlsFilt)FIR滤波器对未知系统建模unknownSys = dsp。VariableBandwidthFIRFilter (“SampleRate”1 e4,...“FilterOrder”30岁的...“CutoffFrequency”,.48 * 1e4/2);% RLS滤波器用于识别FIR滤波器rlsFilt = dsp。RLSFilter (“ForgettingFactor”获得,...“长度”、28);%用于产生输入信号的正弦波sin = dsp。SineWave (“SamplesPerFrame”, 1024,...“SampleRate”1 e4,...“频率”, 50);传递函数估计器用于估计的频率响应% FIR和RLS滤波器。transferFunctionEstimator = dsp。TransferFunctionEstimator (...“FrequencyRange”“中心”...“SpectralAverages”10...“FFTLengthSource”“属性”...“FFTLength”, 1024,...“窗口”“皇帝”);结束如果tuningUIStruct。重置% reset系统对象重置(rlsFilt);重置(unknownSys);重置(transferFunctionEstimator);重置(sin);结束调整FIR截止频率和RLS遗忘因子如果tuningUIStruct。ValuesChanged param = tuningUIStruct.TuningValues;unknownSys。CutoffFrequency =参数(1);rlsFilt。健忘因子=参数(2);结束生成输入信号-正弦波加高斯噪声inputSignal = sin () + 1 * randn(1024,1);通过FIR滤波器过滤输入desiredOutput = unknownSys(inputSignal);通过RLS滤波器传递原始和所需的信号[rlsOutput, err] = rlsFilt(inputSignal,desiredOutput);为传递函数估计器准备系统输入和输出inChans = repmat(inputSignal,1,2);outChans = [desiredOutput,rlsOutput];估计传递函数tfe = transferFunctionEstimator(inChans,outChans);节省截止频率和遗忘因子cutoffFreq = unknownSys.CutoffFrequency;ff = rlsFilt.ForgettingFactor;结束

myRLSFilterSystemIDApp

函数scopeHandles = myRLSFilterSystemIDApp(numTSteps)初始化并执行RLSFilter系统标识示例。然后,使用显示结果%范围。该函数将句柄返回给作用域和UI对象。%的输入:% numTSteps -时间步数%输出:% scopeHandles -可视化作用域的句柄版权所有:The MathWorks, Inc.如果nargin == 0 numTSteps = Inf;%运行直到用户停止模拟。结束%创建作用域Tfescope = dsp。ArrayPlot (“PlotType”“行”...“位置”,[8 696 520 420],...“YLimits”, 30 [-80],...“SampleIncrement”1 e4/1024...“YLabel”“振幅(dB)”...“包含”的频率(赫兹)...“标题”“期望和估计的传递函数”...“ShowLegend”,真的,...“XOffset”, -5000);Msescope =时间镜(“SampleRate”1 e4,...“位置”,[8 184 520 420],...“TimeSpanSource”“属性”“时间间隔”, 0.01,...“YLimits”-300年[10],“ShowGrid”,真的,...“YLabel”均方误差(dB)...“标题”“RLSFilter学习曲线”);Screen = get(0,“拉”);outerSize = min((屏幕(4)-40)/ 2,512);tfescope。位置=[8,屏幕(4)-outerSize+8, outerSize+8,...outersize - 92);msescope。位置=[8,屏幕(4)-2*outerSize+8, outerSize+8,...outersize - 92);创建UI调整FIR滤波器截止频率和RLS滤波器遗忘因子Fs = 1e4;参数= struct([]);参数(1)。Name =截止频率(Hz);参数(1)。初始值= 0.48 * Fs/2;参数(1)。限值= Fs/2 * [1e-5, .9999];参数(2)。Name =“RLS遗忘因子”;参数(2)。InitialValue = 0.99;参数(2)。限制=[。3, 1);hUI = HelperCreateParamTuningUI(参数,“RLS FIR演示”);集(回族,“位置”, (outerSize + 32,屏幕(4)2 * outerSize + 8,...outerSize + 8, outerSize - 92]);执行算法(numTSteps>=0) S = HelperUnpackUIData(hUI);drawnowlimitrate;%需要处理UI回调[tfe,err] = myRLSFilterSystemIDSim(S);如果S.Stop%如果按下“停止模拟”按钮打破;结束如果S.Pause继续;结束%图传递函数tfescope (20 * log10 (abs (tfe)));绘制学习曲线msescope (10 * log10 (sum(犯错。^ 2)));numTSteps = numTSteps - 1;结束如果ishghandle(回族)%如果参数调优UI是打开的,那么关闭它。删除(回族);drawnow;清晰的回族结束scopeHandles。Tfescope = Tfescope;scopeHandles。Msescope = Msescope;结束

MATLAB应用测试

运行系统识别应用程序100个时间步骤。应用程序将运行模拟100个时间步或直到您单击为止停止仿真.它在作用域上绘制结果。

scope1 = myRLSFilterSystemIDApp(100);释放(scope1.tfescope);释放(scope1.msescope);

编写加速算法

当您使用MATLAB Coder加速MATLAB算法时,代码必须适合代码生成。

1.确保myRLSFilterSystemIDSim.m包括% # codegen函数签名之后的指令。

这个指令表明您打算为函数生成代码。在MATLAB编辑器中,它使代码分析器能够检测代码生成问题。

2.筛选算法中不受支持的函数或构造。金宝app

coder.screener (“myRLSFilterSystemIDSim”);

代码生成准备工具在此算法中没有发现代码生成问题。

加速算法

为了加速算法,本例使用MATLAB Codercodegen命令。或者,您可以使用MATLAB Coder应用程序。对于代码生成,您必须指定输入参数的类型、大小和复杂性。这个函数myRLSFilterSystemIDSim获取存储调优信息的结构。定义一个示例调优结构并将其传递给codegen通过使用arg游戏选择。

ParamStruct。TuningValues = [2400 0.99];ParamStruct。ValuesChanged = false;ParamStruct。重置= false; ParamStruct.Pause = false; ParamStruct.Stop = false; codegenmyRLSFilterSystemIDSimarg游戏{ParamStruct};

codegen创建MEX函数myRLSFilterSystemIDSim_mex在当前文件夹中。

比较MEX函数和MATLAB函数的性能

1.计时100次执行myRLSFilterSystemIDSim

清晰的myRLSFilterSystemIDSimdisp (“运行MATLAB函数…”) tic nTimeSteps = 100;ind = 1:nTimeSteps myRLSFilterSystemIDSim(ParamStruct);结束tMATLAB = toc;
运行MATLAB函数…

2.计时100次执行myRLSFilterSystemIDSim_mex

清晰的myRLSFilterSystemIDSimdisp (“正在运行MEX函数…”)抽搐ind = 1:nTimeSteps myRLSFilterSystemIDSim_mex(ParamStruct);结束tMEX = toc;disp (的结果:) disp ([原始MATLAB函数时间:num2str (tMATLAB),...“秒”]);disp ([' MEX函数时间:'num2str (tMEX),“秒”]);disp ([“MEX函数是”num2str (tMATLAB / tMEX),...比原来的MATLAB函数快一倍]);
运行MEX功能…结果:MATLAB原函数时间:2.434秒MEX函数时间:0.29101秒MEX函数比MATLAB原函数快8.3641倍。

优化MEX代码

通过使用不同的C/ c++编译器或使用某些选项或优化,有时可以生成更快的MEX。看到加速MATLAB算法

对于本例,无需进一步优化,MEX已经足够快了。

修改调用MEX功能的应用

修改myRLSFilterSystemIDApp所以它会调用myRLSFilterSystemIDSim_mex而不是myRLSFilterSystemIDSim

保存修改后的函数myRLSFilterSystemIDApp_acc.m

使用加速算法测试应用程序

清晰的myRLSFilterSystemIDSim_mex;scope2 = myRLSFilterSystemIDApp_acc(100);释放(scope2.tfescope);释放(scope2.msescope);

调用MEX函数的应用程序的行为与调用原始MATLAB函数的应用程序的行为相同。然而,由于模拟速度更快,绘图更新得更快。

创建独立应用程序

1.要打开应用程序编译器应用程序,请在应用程序选项卡,在应用程序部署,点击应用程序图标。

2.指定主文件为myRLSFilterSystemIDApp_acc

该应用程序确定该应用程序所需的文件。该应用程序可以找到MATLAB文件和应用程序使用的墨西哥文件。您必须添加其他类型的文件,如mat文件或图像,作为必需的文件。

3.在包装选项部分的工具条,确保从网上下载运行时选中复选框。

此选项创建一个应用程序安装程序,用于下载并安装带有部署的MATLAB应用程序的MATLAB运行时。

4.点击并保存该项目。

5.在“包”窗口中,确保当处理完成时打开输出文件夹选中复选框。

打包完成后,将打开输出文件夹。

安装应用程序

1.打开for_redistribution文件夹中。

2.运行MyAppInstaller_web

3.如果您通过代理服务器连接到internet,请输入服务器设置。

4.通过安装向导的页面前进。

  • 在“Installation Options”页面,使用默认安装文件夹。

  • 在“Required Software”页面,使用默认安装文件夹。

  • 在“许可协议”页面,阅读许可协议并接受许可。

  • 在“确认信息”页面,单击安装

如果MATLAB运行时尚未安装,则安装程序将安装它。

5.点击完成

运行应用程序

1.打开终端窗口。

2.导航到安装应用程序的文件夹。

  • 对于Windows®,导航到C:\Program Files\ myRLSFilterSystemIDApp_acc

  • 对于macOS系统,请导航到/应用程序/ myRLSFilterSystemIDApp_acc

  • 对于Linux,导航到/usr/myRLSFilterSystemIDApp_acc

3.为您的平台使用适当的命令运行应用程序。

  • 对于Windows,请使用应用程序\ myRLSFilterSystemIDApp_acc

  • 对于macOS,请使用myRLSFilterSystemIDApp_acc.app /内容/ MacOS / myRLSFilterSystemIDApp_acc

  • 对于Linux,请使用/ myRLSFilterSystemIDApp_acc

启动应用程序所需的时间与启动MATLAB的时间大致相同。

相关的话题