Фильтрация сигнала приводит к задержке. Это означает, что выходной сигнал сдвигается во времени относительно входного сигнала.
Фильтры с бесконечной импульсной характеристикой задерживают некоторые частотные компоненты больше, чем другие. Они эффективно искажают входной сигнал. Функция filtfilt компенсирует задержки, вносимые такими фильтрами, и, таким образом, корректирует искажение фильтра. Эта «нулевая фазовая фильтрация» является результатом фильтрации сигнала в прямом и обратном направлениях.
Возьмите показания электрокардиограммы, отобранные при 500 Гц в течение 1 с. Добавьте случайный шум.
Fs = 500;
N = 500;
rng default
xn = ecg(N) + 0.2*randn([1 N]);
tn = (0:N-1)/Fs;Удалите часть шума с помощью фильтра, который останавливает частоты выше 75 Гц. Укажите фильтр IIR 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