c++ - 从 matlab 生成 C++ 代码

标签 c++ matlab code-generation

假设我们有以下代码

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

我从下面的命令中获取了这个命令 enter image description here

但是我得到了以下错误

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

最佳答案

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

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

但是fdesign.lowpass类不支持代码生成。这将抛出一个代码生成错误,说明相同。当您使用 filter 函数或 dsp.FIRFilter 系统对象时,代码生成支持过滤过程。但我认为代码生成不支持任何过滤器设计过程。如果您知道滤波器参数,您通常会在 MATLAB 中设计滤波器,并使用 System object 或滤波器函数在函数中使用滤波器系数。然后,您可以为此函数生成 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 目标,如下所示。

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

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

关于c++ - 从 matlab 生成 C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41343660/

相关文章:

c++ - make_shared 与自定义新运算符

c++ - 如何在带有 C++ 的 Ubuntu 中使用 wmi

c++ - 输入验证以过滤掉字符、字符串和一系列整数

matlab - 如何在matlab中向量化双重求和

matlab - 如何在mexopencv中读取avi文件

xml - 我可以在不使用编译器的情况下使用 clang 获取 C/C++ 代码的 XML AST 转储吗?

c++ - STL 容器和算法 C++

linux - 从 Matlab 启动 Linux 终端

Haskell LLVM——创建了重复的函数

javascript - 有什么办法可以自动可视化 JavaScript 代码树?