2012-02-25 3 views
2

Я пытаюсь использовать команду filterfilt с кодировщиком MATLAB, но у меня проблемы.Matlab Coder и filterfilt()

Если я запускаю программу обычным способом все работает нормально, но когда я пытаюсь построить для c-кода, отображается следующее сообщение об ошибке: «Данные должны иметь длину более чем в 3 раза по порядку фильтра». Я где-то читал, что это может быть потому, что функция filterfilt должна знать весь сигнал (с течением времени), и это может быть несовместимо с кодером Matlab. Это, однако, кажется, неверно, так как списки MATLAB filtfilt в качестве поддерживаемого функции для генерации кода - http://www.mathworks.se/help/toolbox/signal/ug/br7exek-1.html

Мой вызов является:

y_filt = filtfilt (Ь, а, у);

Мои переменные непосредственно перед вызовом имеют следующие свойства:

Имя Размер .......... Bytes ...... Class

в ...... 1x9 ........... 72 ........... двойной
b ...... 1x9 ........... 72 ... ........ двойного
у ...... 1499400x1 11995200 двойного

кто-нибудь есть предложение о том, как решить эту проблему?

+0

Казалось бы, вы доказали, что это не 'filtfilt' функции, вы можете дать больше кода или более описание ошибки? – macduff

+0

Ну, мне трудно понять, что еще может быть. Для получения (b, a) масло выполняется непосредственно перед [b, a] = маслом (8,0.045, высокий). –

ответ

1

Я понимаю ваше разочарование. Я думаю, проблема связана с тем, что для использования filtfilt вы предварительно выделяете огромное количество данных. Когда я пытаюсь выполнить аналогичную операцию, моя машина, которая считается классом сервера, исчерпала память. Я бы рекомендовал посмотреть ваши требования и убедиться, что filtfilt - единственная функция, которая их встретит. Я понимаю, что свойство нулевой фазы filtfilt идеально подходит для распространения в Matlab Coder, однако требования к памяти могут дать вам еще больше головных болей. Дайте мне знать, если вы хотите обсудить другие альтернативы. Благодаря!

+0

** Спасибо за ваш ответ! ** Вместо этого я попытался использовать 'filter()' в одном направлении. Затем 'flipud()'. Затем я 'filter()' снова и, наконец, 'flipud()'. Я также _pad с нулями_ в два раза длиннее моего возврата из масла (a или b) в качестве первого шага и _remove то, что я добавил в length_ как последний шаг. ** Какие проблемы с этим решением вы видите? ** –

+0

Думаю, это звучит отлично. Разочарование того, что 'filter' будет работать, а не' filterfilt', но до тех пор, пока результат будет таким, как вы ожидаете. Я столкнулся с этим http://www.scipy.org/Cookbook/FiltFilt, я знаю, что это для Python, но я думаю, что это все равно будет иметь значение. – macduff

+0

** Я, наконец, решил это **, чтобы я мог запускать 'filterfilt()'! Проблема заключалась в том, что я не указал, что волновой файл имеет длину больше, чем a или b.Это означает, что кодер Matlab не видит длину, даже если это видно, запустив 'whos'. Однако появилась новая проблема, поскольку я не знаю, как указать константы в коде. 'coder.constant' не работает. Я задал отдельные вопросы по этой ссылке [constants-and-matlab-coder] (http://stackoverflow.com/questions/9467573/constants-and-matlab-coder). ** Знаете ли вы что-нибудь об этом? ** –

0

здесь используется фильтр Buuterwroth. Это фильтр IIR. Фильтр , запрашиваемый, может быть намного больше, чем количество вкладок фильтров. И длина сигнала должна быть в три раза больше фильтра заказать, а не длину фильтра!

С уважением, Tchekov