假设我们有以下代码
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
最佳答案
您的尝试存在多个问题。首先,仅当您的函数有输入时才需要 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/