Фильтрация сигнала вводит задержку. Это означает, что выходной сигнал смещен вовремя относительно входа.
Фильтры импульсной характеристики Бога задерживают некоторые частотные составляющие больше, чем другие. Они эффективно искажают входной сигнал. Функциональный filtfilt
компенсирует задержки, введенные такими фильтрами, и таким образом корректирует для искажения фильтра. Эта "нулевая фаза, фильтрующая" результаты фильтрации сигнала в прямых и обратных направлениях.
Снимите показания электрокардиограммы, произведенные на уровне 500 Гц в течение 1 с. Добавьте случайный шум.
Fs = 500;
N = 500;
rng default
xn = ecg(N) + 0.2*randn([1 N]);
tn = (0:N-1)/Fs;
Удалите часть шума с фильтром, который останавливает частоты выше 75 Гц. Задайте БИХ-фильтр 7-го порядка с 1 дБ неравномерности в полосе пропускания и 60 дБ затухания в полосе задерживания.
Nf = 7; Fp = 75; Ap = 1; As = 60; d = designfilt('lowpassiir','FilterOrder',Nf,'PassbandFrequency',Fp, ... 'PassbandRipple',Ap,'StopbandAttenuation',As,'SampleRate',Fs);
Отфильтруйте сигнал. Отфильтрованный сигнал более чист, чем оригинал, но отстает вовремя относительно него. Это также искажено из-за нелинейной фазы фильтра. Увеличьте масштаб близко к пику.
xfilter = filter(d,xn); plot(tn,xn,tn,xfilter) title 'Electrocardiogram' xlabel 'Time (s)', legend('Original Signal','Filtered Signal') axis([0.25 0.55 -1 1.5])
Взгляд на групповую задержку, введенную фильтром, показывает, что задержка зависима частотой.
grpdelay(d,N,Fs)
Отфильтруйте сигнал с помощью filtfilt
. Задержка и искажение были эффективно удалены. Используйте filtfilt
когда очень важно сохранить информацию фазы сигнала неповрежденной.
xfiltfilt = filtfilt(d,xn); plot(tn,xn,tn,xfilter) hold on plot(tn,xfiltfilt,'r','linewidth',2) hold off title 'Electrocardiogram' xlabel 'Time (s)' legend('Original Signal','Filtered Signal', ... 'Zero-phase filtered with ''filtfilt''') axis([0.25 0.55 -1 1.5])
designfilt
| filter
| filtfilt
| grpdelay