【问题标题】:generating c++ code from matlab从 matlab 生成 c++ 代码
【发布时间】:2017-05-11 15:37:54
【问题描述】:

假设我们有以下代码

function Hdl=mcadd()
%#codegen
Fc=0.4;
N=100; % FIR filter order
Hf=fdesign.lowpass('N,Fc',N,Fc);
Hdl=design(Hf,'window','window',@hamming,'SystemObject',true);
end

我想从 matlab 代码转换介绍等效 c++ 代码设计低通滤波器,为此我尝试了以下命令

codegen -args {Z} -report mcadd.m

我已从以下命令中获取此命令

但我得到以下错误

codegen -args {Z} -report mcadd.m
Failed to evaluate '{Z}' to non-empty array in the base workspace.
Use help codegen for more information on using this command.
Error using codegen (line 146)

这是工作代码

function c=add_numbers(a,b)
%#codegen
c=a+b;
disp(c)
end

结果

>> a=5;
>> b=4;
>> codegen -args {a,b} -report add_numbers.m

Code generation successful: View report

【问题讨论】:

    标签: c++ matlab code-generation


    【解决方案1】:

    您正在尝试的内容存在多个问题。首先,只有在您的函数有输入时才需要选项 -args to codegen 命令。由于您没有输入,因此不需要该选项。如果函数需要输入参数,您需要在 {} 之间为该参数提供一个有效的现有 MATLAB 变量。

    您只需运行 codegen mcadd 即可为您的函数尝试 codegen。

    但是fdesign.lowpass 类不支持代码生成。这将引发代码生成错误,说明相同。当您使用filter 函数或dsp.FIRFilter System 对象时,代码生成支持过滤过程。但我认为代码生成不支持任何过滤器设计过程。如果您知道滤波器参数,您通常会在 MATLAB 中设计滤波器,并使用 System object 或 filter 函数在函数中使用滤波器系数。然后,您可以为该函数生成 C 代码。

    示例工作流程如下。

    % Design filter in MATLAB
    Fc=0.4;
    N=100; % FIR filter order
    Hf=fdesign.lowpass('N,Fc',N,Fc);
    Hdl=design(Hf,'window','window',@hamming)
    

    更改您的函数以仅使用输入滤波器系数过滤数据。

    function y=mcadd(data, coeffs)
    %#codegen
    
    persistent obj
    if isempty(obj)
        obj = dsp.FIRFilter('Numerator', coeffs);
    end
    
    y = step(obj, data);
    
    end
    

    编译如下函数。

    codegen mcadd -args {0,coder.Constant(Hdl.Numerator)}
    

    以上行假设您将一次发送一个输入样本进行过滤。您可以在上面的代码中更改 0 以匹配您的输入大小和类型。编译后你可以调用你的函数,

    mcadd_mex(0, Hdl.Numerator)
    

    codegen 命令默认为 mex 文件生成代码。如果您想获取生成的代码并将其用于集成到其他 C 代码中,请尝试使用 lib target for codegen,如下所示。

    codegen -config:lib mcadd -args {0,coder.Constant(Hdl.Numerator)}
    

    MATLAB Coder 应用程序将引导您完成这些步骤,并简化该过程。

    【讨论】:

    • 提前感谢,对于给定的代码,你能帮我展示一个可行的例子吗?提前感谢
    • 那我写个简单的函数
    • 系数是设计滤波器的结果?我的意思是那些过滤器的设计应该是功能超大的?
    • 是的,设计应该在生成代码的函数之外。代码生成不支持设计。
    • 这段代码 codegen mcadd -args {0,coder.Constant(Hdl.Numerator)} 怎么样?
    猜你喜欢
    • 2011-09-17
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    相关资源
    最近更新 更多