主要内容

生成C代码MATLAB代码

MATLAB®编码器™生成高度优化的ANSI C和c++代码从系统功能和对象DSP系统工具箱™。这段代码可以部署在各种各样的应用程序。

这个示例生成的C代码构造一个正弦信号使用高能FFT系数从生成的代码示例和构建一个可执行的。

这是MATLAB代码示例:

L = 1020;Sineobject = dsp.SineWave (“SamplesPerFrame”L,“PhaseOffset”10“SampleRate”,44100,“频率”,1000);英国《金融时报》= dsp.FFT (“FFTImplementation”,“FFTW”);界面张力= dsp.IFFT (“FFTImplementation”,“FFTW”,“ConjugateSymmetricInput”,真正的);rng (1);numIter = 1000;Iter = 1: numIter Sinewave1 = Sineobject ();输入= Sinewave1 + 0.01 * randn(大小(Sinewave1));FFTCoeff =英尺(输入);FFTCoeffMagSq = abs (FFTCoeff) ^ 2;EnergyFreqDomain = (1 / L) *总和(FFTCoeffMagSq);[FFTCoeffSorted,印第安纳州]= (((1 / L) * FFTCoeffMagSq), 1,“下”);CumFFTCoeffs = cumsum (FFTCoeffSorted);EnergyPercent = (CumFFTCoeffs / EnergyFreqDomain) * 100;Vec =找到(EnergyPercent > 99.99);FFTCoeffsModified = 0 (L, 1);FFTCoeffsModified(印第安纳州(1:Vec (1))) = FFTCoeff(印第安纳州(1:Vec (1)));ReconstrSignal = ift (FFTCoeffsModified);结束马克斯(abs (Input-ReconstrSignal))情节(输入,‘*’);持有;情节(ReconstrSignal“o”);持有;

您可以运行在MATLAB环境中生成的可执行文件。此外,您还可以包和搬迁到另一个开发环境的代码没有MATLAB安装。你可以使用生成代码MATLAB编码器应用程序或codegen(MATLAB编码器)函数。这个例子向您展示了使用的工作流codegen函数。工作流应用程序的更多信息,请参阅通过使用MATLAB编码器应用生成C代码(MATLAB编码器)

设置编译器

第一步是设置一个C编译器的支持。万博1manbetxMATLAB编码器自动定位和使用一个支持安装编译器。万博1manbetx您可以更改默认的编译器使用墨西哥人设置。更多细节,请参阅改变默认的编译器。当前支持的编译器列表,请参阅万博1manbetx万博1manbetx支持和兼容的编译器

打破计算算法的一部分成MATLAB函数

生成C代码,必须一个函数的入口点。你不需要为整个MATLAB应用程序生成代码。如果你有具体的计算密集型的部分,从这些部分生成代码以加快你的算法。利用或驱动程序调用MATLAB函数不需要生成代码。利用MATLAB和运行可以包含可视化和其他验证工具没有被测试的系统的一部分。例如,在构造一个正弦信号使用高能FFT系数的例子中,情节函数输入信号和重建信号的阴谋。情节不支持代码生成万博1manbetx和利用必须保持。从利用包含生成代码的可视化工具,重写利用函数和声明可视化函数作为外在功能使用coder.extrinsic(MATLAB编码器)。运行生成的代码包含外在功能,您必须在您的计算机上安装了MATLAB。

在MATLAB代码循环使用高能FFT系数重建原始信号是该算法的计算密集型部分。加快循环通过移动这计算成一个函数的一部分,GenerateSignalWithHighEnergyFFTCoeffs.m

L = 1020;Sineobject = dsp.SineWave (“SamplesPerFrame”L,“SampleRate”,44100,“频率”,1000);rng (1);numIter = 1000;Iter = 1: numIter Sinewave1 = Sineobject ();输入= Sinewave1 + 0.01 * randn(大小(Sinewave1));[ReconstrSignal, numCoeff] = GenerateSignalWithHighEnergyFFTCoeffs(输入);结束马克斯(abs (Input-ReconstrSignal))图(1);情节(输入);情节(ReconstrSignal‘*’)举行
函数[ReconstrSignal, numCoeff] = GenerateSignalWithHighEnergyFFTCoeffs(输入)英尺= dsp.FFT (“FFTImplementation”,“FFTW”);界面张力= dsp.IFFT (“FFTImplementation”,“FFTW”,“ConjugateSymmetricInput”,真正的);FFTCoeff =英尺(输入);FFTCoeffMagSq = abs (FFTCoeff) ^ 2;L =大小(输入,1);EnergyF = (1 / L) *总和(FFTCoeffMagSq);[FFTCoeffSorted,印第安纳州]= (((1 / L) * FFTCoeffMagSq), 1,“下”);CumFFTCoeffs = cumsum (FFTCoeffSorted);EnergyPercent = (CumFFTCoeffs / EnergyF) * 100;Vec =找到(EnergyPercent > 99.99);FFTCoeffsModified = 0 (L, 1);FFTCoeffsModified(印第安纳州(1:Vec (1))) = FFTCoeff(印第安纳州(1:Vec (1)));numCoeff = Vec (1);ReconstrSignal = ift (FFTCoeffsModified);结束

使代码适合代码生成

在生成代码之前,你必须准备你的MATLAB代码生成代码。

在设计时检查问题

第一步是消除不支持的构造和检查任何代码生成问题。万博1manbetx为支持的DSP系统工具箱功能列表万博1manbetxMATLAB编码器,请参阅功能和系统对象支持C代码生成万博1manbetx支持的语言结构列表,看看万博1manbetxMATLAB语言特性支持C / c++代码生成万博1manbetx(MATLAB编码器)

在设计时代码分析仪检测编码问题当你进入代码。使代码分析器,你必须添加% # codegen编译指示你的MATLAB文件。

GeneratSignalWithHighEnergyFFTCoeffs的快照。m文件。快照显示的位置% # codegen年底编译指示函数的第一行。函数是函数的第一行[ReconstrSignal numCoeff] = GenerateSignalWithHighEnergyFFTCoeffs(输入)% # codegen

代码生成屏幕准备工具MATLAB代码为代码生成功能,不支持。万博1manbetx的一个方法来访问这个工具是通过右键单击MATLAB文件在当前文件夹。运行代码生成工具GenerateSignalWithHighEnergyFFTCoeffs.m发现没有问题。

快照的代码创准备工具。代码生成准备得分显示5绿条,表明现在适合代码生成的代码。这是一个初步的检查,没有发现问题。一些小问题可能会发现如果代码生成是未遂,但如果是这样,他们应该很容易解决。

在代码生成时检查问题

在您生成C代码之前,确保成功的MATLAB代码生成一个墨西哥人的功能。的codegen(MATLAB编码器)命令用于生成墨西哥人功能检测到任何错误,防止被适用于代码生成的代码。

运行codegenGenerateSignalWithHighEnergyFFTCoeffs.m函数。

codegenarg游戏{输入}GenerateSignalWithHighEnergyFFTCoeffs

以下消息出现在MATLAB命令提示符:

? ? ?左边是限制非复杂,但右边是复杂的。纠正这个问题,使右边真正的使用功能,或改变初始分配左边变量使用复杂的函数是一个复杂的价值。错误= = > GenerateSignalWithHighEnergy: 24列:1代码生成失败:视图使用codegen错误报告错误

这个消息指的是变量FFTCoeffsModified。编码器是期待这个变量被初始化为一个复杂的变量。为了解决这个问题,初始化FFTCoeffsModified变量一样复杂。

FFTCoeffsModified = 0 (L, 1) + 0我;

重新运行codegen功能,您可以看到,一个墨西哥人文件生成成功在当前文件夹.mex扩展。

codegenarg游戏{输入}GenerateSignalWithHighEnergyFFTCoeffs

在运行时检查问题

运行生成的墨西哥人函数是否存在运行时问题的报道。为此,替换

[ReconstrSignal, numCoeff] = GenerateSignalWithHighEnergyFFTCoeffs(输入);
[ReconstrSignalMex, numCoeffMex] = GenerateSignalWithHighEnergyFFTCoeffs_mex(输入);
在利用。

利用现在的样子:

L = 1020;Sineobject = dsp.SineWave (“SamplesPerFrame”L,“SampleRate”,44100,“频率”,1000);rng (1);numIter = 1000;Iter = 1: numIter Sinewave1 = Sineobject ();输入= Sinewave1 + 0.01 * randn(大小(Sinewave1));[ReconstrSignalMex, numCoeffMex] = GenerateSignalWithHighEnergyFFTCoeffs_mex(输入,L);结束马克斯(abs (Input-ReconstrSignalMex))图(1);情节(输入);情节(ReconstrSignalMex‘*’)举行

成功运行的代码,表明没有运行时错误。

比较了墨西哥人与仿真功能

注意,利用运行更快的墨西哥人功能比常规功能。生成墨西哥人功能的原因不仅是检测代码生成和运行时的问题,但也加速算法的特定部分。例如,看到的信号处理算法在MATLAB加速度

您还必须检查数字输出结果的墨西哥人,正则函数匹配。生成的重构信号进行比较GenerateSignalWithHighEnergyFFTCoeffs.m函数和它的墨西哥人GenerateSignalWithHighEnergyFFTCoeffs_mex

马克斯(abs (ReconstrSignal-ReconstrSignalMex)) ans = 2.2204 e-16

结果密切匹配,确认代码生成成功。

生成一个独立的可执行文件

如果你的目标是在MATLAB环境中运行生成的代码,您的构建目标可以是一个墨西哥人的功能。如果代码部署到另一个应用程序的目标,然后从整个应用程序生成一个独立的可执行文件。为此,利用必须是一个函数调用的子函数GenerateSignalWithHighEnergyFFTCoeffs。重新利用的功能。

函数reconstructSignalTestbench () L = 1020;Sineobject = dsp.SineWave (“SamplesPerFrame”L,“SampleRate”,44100,“频率”,1000);rng (1);numIter = 1000;Iter = 1: numIter Sinewave1 = Sineobject ();输入= Sinewave1 + 0.01 * randn(大小(Sinewave1));[ReconstrSignal, numCoeff] = GenerateSignalWithHighEnergyFFTCoeffs(输入,L);结束

日志输入和重构信号的所有1000帧和FFT系数用来重建的数量每一帧的信号。所有这些数据写入二进制文件命名data.bin使用dsp.BinaryFileWriter系统对象™。这个示例日志系数的数量,标量值,每一帧的第一个元素的输入信号和重建信号。要写的数据帧的大小=l+ 1,身材这样的格式。

两个矩阵一个等号的两边。左边的等号,第一帧是N输入信号。其次是N帧重构信号。等号右边,第一帧是InputAll信号和第二个框架是“ReSignalAll”。

N是FFT系数表示的数量99.99%的当前输入的信号能量。二进制文件的元数据指定该信息。发布二进制文件的作者和最后关闭的二进制文件。

更新后的利用功能,reconstructSignalTestbench所示:

函数reconstructSignalTestbench () L = 1020;Sineobject = dsp.SineWave (“SamplesPerFrame”L,“SampleRate”,44100,“频率”,1000);头=结构(“FirstElemInBothCols”,系数的数量,“FirstColumn”,“输入”,“SecondColumn”,“ReconstructedSignal”);"自行车造福世界"组织= dsp.BinaryFileWriter (“data.bin”,“HeaderStructure”,头);numIter = 1000;M = L + 1;ReSignalAll = 0 (M * numIter, 1);InputAll = 0 (M * numIter, 1);rng (1);Iter = 1: numIter Sinewave1 = Sineobject ();输入= Sinewave1 + 0.01 * randn(大小(Sinewave1));[ReconstrSignal, numCoeffs] = GenerateSignalWithHighEnergyFFTCoeffs(输入);InputAll (((Iter-1) *米)+ 1:Iter *米)= (numCoeffs;输入);ReSignalAll (((Iter-1) *米)+ 1:Iter *米)= (numCoeffs; ReconstrSignal);结束"自行车造福世界"组织([InputAll ReSignalAll]);释放(");

C生成一个可执行的下一步是创建一个coder.config对象为一个可执行文件,并提供一个c函数这个对象。

cfg = coder.config (exe”);cfg。CustomSource =“reconstructSignalTestbench_Main.c”;

这是如何reconstructSignalTestbench_Main.c函数查找这个例子。

/ * * * reconstructSignalTestbench_main。c * * 2017(版权MathWorks公司* / # include < stdio。h > # include < stdlib。h > # include " reconstructSignalTestbench_initialize。h reconstructSignalTestbench # include。h reconstructSignalTestbench_terminate # include。h " int main () {reconstructSignalTestbench_initialize ();reconstructSignalTestbench ();reconstructSignalTestbench_terminate ();返回0;}

创建主要功能的额外细节,明白了生成独立的C / c++从MATLAB代码可执行文件(MATLAB编码器)

设置CustomInclude配置对象的属性来指定主文件的位置。在这个例子中,是当前文件夹的位置。

cfg。CustomInclude = [“””pwd,“””];

生成C执行由MATLAB命令提示符运行以下命令:

codegen配置cfg报告reconstructSignalTestbench

MATLAB编码器编译和链接的主要函数的C代码生成reconstructSignalTestbench.m

如果您使用的是Windows,你可以看到reconstructSignalTestbench.exe生成在当前文件夹。如果您使用的是Linux,生成的可执行文件没有. exe扩展。

阅读和验证二进制文件数据

运行可执行文件创建一个二进制文件,data.bin在当前的目录并输入写道,FFT系数重构信号,用于重建信号。

reconstructSignalTestbench !

你可以从二进制文件读取这些数据使用dsp.BinaryFileReader对象。正确地验证数据写入,读取数据的二进制文件在MATLAB和比较输出变量InputAllReSignalAll

标题必须有一个原型结构类似于写入文件头结构。读取数据为两个渠道。

M = 1021;numIter = 1000;headerPro =结构(“FirstElemInBothCols”,系数的数量,“FirstColumn”,“输入”,“SecondColumn”,“ReconstructedSignal”);bfr = dsp.BinaryFileReader (“data.bin”,“HeaderStructure”,headerPro,“SamplesPerFrame”,M * numIter,“NumChannels”2);Data = bfr ();

比较第一通道InputAll和第二通道ReSignalAll

isequal (InputAll、数据(:1))
ans =逻辑1
isequal (ReSignalAll、数据(2):,)
ans =逻辑1

结果完全匹配,指示成功的写操作。

代码迁移到另一个开发环境

一旦你从MATLAB算法生成代码,你可以搬迁到另一个开发环境的代码,比如一个系统或一个集成开发环境(IDE),不包括MATLAB。你可以使用的文件打包成一个压缩文件packNGo在命令行或函数选项MATLAB编码器应用。为例,说明了工作流,明白了包代码为其他开发环境(MATLAB编码器)。更多的信息packNGo选项,看到packNGo环球套票。BuildInfo方法(MATLAB编码器)。你可以搬迁,解压zip压缩文件使用标准的压缩实用程序。例如如何包生成的可执行文件在这个例子中,明白了从MATLAB代码生成的代码迁移到另一个开发环境

另请参阅

功能

相关的话题

外部网站