Matlab 编码器:"All inputs must be constant"

Matlab coder: "All inputs must be constant"

我正在使用 Matlab Coder 将此代码转换为 C++:

fs = 50;
[b,a] = butter(3,0.5/(fs/2),'high');
...
% Other code using fs

然后,我得到这个错误:"All inputs must be constant"。

如果我这样做:[b,a] = butter(3,0.5/(50/2),'high');,它会起作用。

我找到这个 post:Constants and Matlab Coder

所以我尝试了:

fs = 50;
[b,a] = coder.const(@butter,3,0.5/(fs/2),'high');

但是还是报同样的错误。我该如何解决这个问题?

Define Class Properties with Constant Values

在ConstInput.m

classdef ConstInput
   properties (Constant)
      fs = 50;
   end
end

然后将 fs 重命名为 ConstInput.fs。 (不幸的是,Shift+Enter 不起作用。也许此链接对 changing variable names 有帮助。)

MATLAB R2020a 现已可用。函数 butter 在 R2020a 中得到增强,以支持具有非常量输入的代码生成。生成的代码可用于在运行时获取有效阶数和截止频率的任何滤波器的系数。

例如,考虑下面给出高通数字滤波器的滤波器系数的代码:

function[num,den] = hpbutter(n,w)
%#codegen

[num,den] = butter(n,w,'high');

现在我们可以生成非常量输入的代码如下:

codegen hpbutter -args {coder.typeof(0),coder.typeof(0)}

您可以将任何有效的滤波器阶数 (n) 和截止频率 (w) 传递给生成的 MEX。

[num,den] = hpbutter_mex(2,0.3)

数量=

0.5050   -1.0100    0.5050

登=

1.0000   -0.7478    0.2722

[num,den] = hpbutter_mex(3,0.4)

数量=

0.2569   -0.7707    0.7707   -0.2569

登=

1.0000   -0.5772    0.4218   -0.0563