Предыдущие выходы как входы для FIR-фильтра - PullRequest
2 голосов
/ 03 июня 2011

Кто-нибудь знает, возможно ли передать предыдущую выходную стоимость в FIR-фильтр в Matlab? Я хотел бы сделать это, потому что у меня есть масса данных (> 300 ГБ), которые я хотел бы отфильтровать и вниз выборки. Если я использую стандартный набор [b, a] коэффициентов в функции КИХ, то первые несколько выборок будут неправильными, поскольку они зависят от начальных условий.

Это проблема, потому что я хотел бы отфильтровать свой большой набор данных, взяв меньшие фрагменты, но если я сделаю это стандартным способом, то в начале каждого фрагмента будет ошибка (которая будет распространяться по это FIR-фильтр).

Любые идеи будут высоко оценены!

Ответы [ 3 ]

4 голосов
/ 03 июня 2011
Команда фильтра

может принимать начальные условия в качестве входных данных и возвращать конечные условия в качестве второго выходных данных. Вы должны использовать их для фильтрации небольших фрагментов ваших данных. Например,

b = fir1(10, 0.5);
Zi = zeros(numel(b)-1,1);
while moreData
   [y Zi] = filter(b, 1, data, Zi);
end

Если у вас есть набор инструментов DSP System, вы также можете использовать системный объект dsp.DigitalFilter, который будет управлять вашими состояниями. Например, приведенный выше код может стать

b = fir1(10, 0.5);
h = dsp.DigitalFilter('TransferFunction', 'FIR (all zeros)', 'Structure', 'Direct form transposed', 'Numerator', b);
while moreData
    y = step(h, data);
end
3 голосов
/ 03 июня 2011

Вы можете использовать функции 'zi', 'zf' команды 'filter': http://www.mathworks.com/help/techdoc/ref/filter.html

Это позволяет вам установить начальные условия фильтра.

1 голос
/ 03 июня 2011

В таких случаях вы можете использовать filtfilt, который реализует фильтрацию нулевой фазы, т. Е. Обрабатывает данные один раз вперед и один раз назад, что не приводит к чистой задержке. Тем не менее, вы должны заметить, что эффективный порядок фильтрации в два раза больше, чем указано в b.

Вот пример из документации (сюжет был изменен):

x=ecg(500)'+0.25*randn(500,1); %'#noisy waveform
h=fdesign.lowpass('Fp,Fst,Ap,Ast',0.15,0.2,1,60);
d=design(h,'equiripple'); %#Lowpass FIR filter
y=filtfilt(d.Numerator,1,x); %#zero-phase filtering
y1=filter(d.Numerator,1,x); %#conventional filtering

figure(1)
h=plot([x y y1]);
set(h(1),'color',[0.8,0.8,0.8])
title('Filtered Waveforms');
legend('Original waveform', 'Zero-phase Filtering','Conventional Filtering');

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...