让我们假设我们有以下代码
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
答案 0 :(得分:2)
您尝试的内容存在多个问题。首先,只有当您的函数有输入时,才需要选择-args to codegen命令。由于您没有输入,因此不需要该选项。如果函数需要输入参数,则需要在{}之间为该参数提供有效的现有MATLAB变量。
您可以运行codegen mcadd
为您的功能尝试codegen。
但是fdesign.lowpass
类不支持代码生成。这将抛出代码生成错误,说同样的错误。使用filter
函数或dsp.FIRFilter
System对象时,代码生成支持过滤过程。但我认为代码生成不支持任何过滤器设计过程。如果您知道过滤器参数,通常在MATLAB中设计过滤器,并使用系统对象或过滤器功能在函数中使用过滤器系数。然后,您可以为此函数生成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应用程序将指导您完成此步骤,并使该过程更容易。