Фильтрация сигнала вводит задержку. Это означает, что выходной сигнал переключен вовремя относительно входа.
Импульсные фильтры ответа Бога задерживают некоторые частотные составляющие больше, чем другие. Они эффективно искажают входной сигнал. Функциональный 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