Создание автономного масляного фильтра с кодером Matlab

Я пытаюсь скомпилировать с помощью Matlab Coder пользовательскую функцию, которая включает фильтр Баттерворта. Я извлек строки, которые вызывают у меня проблемы с функцией кодера 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. Заранее спасибо!


person Matteo Maggioni    schedule 20.02.2015    source источник


Ответы (1)


Функция butter должна иметь постоянные входные данные. Это означает, что при генерации кода MATLAB Coder должен уметь определять значения для всех из них.

В этом случае код передает Wn, который вычисляется из верхнего ввода fs. Поскольку это зависит от ввода верхнего уровня, Wn не является константой.

Два варианта для рассмотрения:

  1. Передайте буквальную константу для Wn в вызове butter, как вы сделали для N

  2. Передайте константу вызову codegen для fs, чтобы вычисление для Wn можно было свернуть в константу.

     codegen -config:lib -launchreport myfilter -args {zeros(1,100),coder.Constant(10)}
    
person Ryan Livingston    schedule 21.02.2015
comment
Я попробовал вариант номер 2, и это сработало, спасибо! Другой вопрос... если я скомпилирую его в файл MEX и захочу указать другое значение для fs, что мне делать? - person Matteo Maggioni; 21.02.2015
comment
Вам нужно будет повторно сгенерировать функцию MEX с новым значением. Если вы знакомы с C, подумайте о константе как о #define . Когда вы меняете значение, вы должны перекомпилировать. - person Ryan Livingston; 21.02.2015