我正在尝试使用Matlab Coder编译一个包含butterworth过滤器的自定义函数。 我已经提取了使用Matlab编码器函数给我带来问题的行。
function [output] = myfilter(input,fs) %#codegen
f1 = 5; % cuttoff low frequency to get rid of baseline wander
Wn = f1.*2./fs; % cutt off based on fs
N = 3; % order of 3 less processing
[a,b] = butter(N,Wn); % bandpass filtering
output = filtfilt(a,b,input); % filtering
output = output/max(abs(output));
当我启动编译它的命令时,我收到错误:
codegen -config:lib -launchreport myfilter -args {zeros(1,100),10}
输出错误为:所有输入必须保持不变。 我尝试使用函数coder.const修改代码如下,但仍然有同样的问题:
function [output] = myfilter(input,fs) %#codegen
f1 = 5; % cuttoff low frequency to get rid of baseline wander
Wn = f1.*2./fs; % cutt off based on fs
N = 3; % order of 3 less processing
[a,b] = coder.const(@butter,N,Wn); % bandpass filtering
a = coder.const(a);
b = coder.const(b);
output = filtfilt(a,b,input); % filtering
output = output/max(abs(output));
有人可以帮我解决这个问题吗?我是Matlab Coder的新手。提前谢谢!
答案 0 :(得分:1)
函数butter
需要有不变的输入。这意味着在生成代码时,MATLAB Coder必须能够确定所有代码的值。
在这种情况下,代码传递Wn
,它是从顶部输入fs
计算的。因为它取决于顶级输入,Wn
不是常量。
需要考虑两个选项:
在Wn
的调用中为butter
传递N
的文字常量,就像您为fs
将常量传递给Wn
的codegen调用,以便 codegen -config:lib -launchreport myfilter -args {zeros(1,100),coder.Constant(10)}
的计算可以不断折叠
{{1}}