使用Matlab编码器创建独立的黄油过滤器

时间:2015-02-20 16:35:55

标签: c++ matlab function compilation matlab-coder

我正在尝试使用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的新手。提前谢谢!

1 个答案:

答案 0 :(得分:1)

函数butter需要有不变的输入。这意味着在生成代码时,MATLAB Coder必须能够确定所有代码的值。

在这种情况下,代码传递Wn,它是从顶部输入fs计算的。因为它取决于顶级输入,Wn不是常量。

需要考虑两个选项:

  1. Wn的调用中为butter传递N的文字常量,就像您为fs

  2. 所做的那样
  3. 将常量传递给Wn的codegen调用,以便 codegen -config:lib -launchreport myfilter -args {zeros(1,100),coder.Constant(10)} 的计算可以不断折叠

    {{1}}