2013-10-14 2 views
1

У меня есть функция передачи, которую я пытаюсь использовать для фильтрации данных ускорения.Постоянно обновляющая передаточная функция

До сих пор я мог использовать lsim с волной sin около 10 секунд, и я получаю ожидаемый результат. Однако я не могу работать, как получить данные в функцию в режиме реального времени.

Чтобы уточнить, каждые 0,1 секунды я получаю значение ускорения от внешней программы. Мне нужно отфильтровать значения для удаления высокочастотных вариаций в данных. Мне нужно, чтобы это произошло для каждой точки данных, которую я получаю, когда я использую текущее значение ускоренного фильтра в дополнительных этапах обработки.

Как использовать функцию передачи в непрерывном режиме и обновлять выходное значение каждый раз, когда будут получены новые данные?

ответ

2

Это пример того, как сделать это с filter:

filter_state = []; % start with empty filter history 
while not_stopped() 
    x = get_one_input_sample(); 
    [y, filter_state] = filter(B, A, x, filter_state); 
    process_one_output_sample(y); 
end; 

Обратите внимание, что вам нужно использовать расширенную форму фильтра, в котором вы передаете историю фильтра от одной итерации к следующей используя переменную filter_state. B и A являются коэффициентами вашего дискретного фильтра. Если ваш фильтр непрерывный, вам необходимо сначала преобразовать его в дискретный фильтр, используя c2d или около того. Обратите внимание, что если ваш фильтр очень сложный, вам может потребоваться разделить фильтрацию в несколько этапов (например, один этап второго этапа на каждый фильтр), чтобы избежать числовых проблем.

+0

У вас есть get_one_input_sample, я предполагаю, что вы извлекаете данные из других источников. Можно ли сказать, что данные * из * внешней программы? Больше похоже на толчок к матлабу, а не тягу. Или, лучше ли опубликовать текущее значение на чем-то вроде UDP-порта и получить его от Matlab? – Steve

+0

Я думаю, это можно сделать либо нажатием, либо вытащить данные, это будет полностью зависеть от того, как вы взаимодействуете с оборудованием с помощью Matlab. Вы можете задать для этого отдельный вопрос. Для фильтрующей части это не имеет значения, это всегда один образец, один образец, при этом необходимо передать историю фильтра на следующую итерацию. –

+0

Хорошо, у меня есть идея получить данные, но в каком формате она должна быть? Может быть, это просто номер? Например, мои данные, которые я получаю каждые 0,1 секунды: 0,3,0,0,001,0,1,0,4,0,6,0,6 и т. Д. Могу ли я просто фильтровать (B, A, 0.3, filter_state), затем фильтровать (B, A, 0 , filter_state) и т. д.? – Steve

Смежные вопросы