Фильтрация сигнала приводит к задержке. Это означает, что выходной сигнал сдвигается во времени относительно входного сигнала.
При постоянном сдвиге можно скорректировать задержку, сдвинув сигнал во времени.
Иногда фильтр задерживает некоторые частотные компоненты больше, чем другие. Это явление называется фазовым искажением. Чтобы компенсировать этот эффект, можно выполнить фильтрацию нулевой фазы с помощью filtfilt функция.
Возьмите показания электрокардиограммы, отобранные при 500 Гц в течение 1 с. Добавьте случайный шум. Сброс генератора случайных чисел для воспроизводимых результатов
Fs = 500;
N = 500;
rng default
xn = ecg(N)+0.1*randn([1 N]);
tn = (0:N-1)/Fs;Удалите часть шума с помощью фильтра, который останавливает частоты выше 75 Гц. Использовать designfilt для конструирования FIR-фильтра порядка 70.
Nfir = 70; Fst = 75; firf = designfilt('lowpassfir','FilterOrder',Nfir, ... 'CutoffFrequency',Fst,'SampleRate',Fs);
Отфильтруйте сигнал и постройте его график. Результат более плавный, чем оригинал, но отстает от него.
xf = filter(firf,xn); plot(tn,xn,tn,xf) title 'Electrocardiogram' xlabel 'Time (s)' legend('Original','FIR Filtered') grid

Использовать grpdelay для проверки того, что задержка, вызванная фильтром, равна половине порядка фильтра.
grpdelay(firf,N,Fs)

delay = mean(grpdelay(firf))
delay = 35
Выстроить данные. Сдвиг отфильтрованного сигнала путем удаления его первого delay образцы. Удалить последнюю delay выборки исходного и временного вектора.
tt = tn(1:end-delay); sn = xn(1:end-delay); sf = xf; sf(1:delay) = [];
Постройте график сигналов и убедитесь, что они выровнены.
plot(tt,sn,tt,sf) title 'Electrocardiogram' xlabel('Time (s)') legend('Original Signal','Filtered Shifted Signal') grid

Повторите вычисления с помощью фильтра IIR 7-го порядка.
Niir = 7; iir = designfilt('lowpassiir','FilterOrder',Niir, ... 'HalfPowerFrequency',Fst,'SampleRate',Fs);
Фильтрация сигнала. Отфильтрованный сигнал чище исходного, но по отношению к нему отстает во времени. Он также искажается из-за нелинейной фазы фильтра.
xfilter = filter(iir,xn); plot(tn,xn,tn,xfilter) title 'Electrocardiogram' xlabel 'Time (s)' legend('Original','Filtered') axis([0.25 0.55 -1 1.5]) grid

Взгляд на групповую задержку, введенную фильтром, показывает, что задержка зависит от частоты.
grpdelay(iir,N,Fs)

Фильтрация сигнала с помощью filtfilt. Задержка и искажение были эффективно устранены. Использовать filtfilt когда важно сохранить информацию о фазе сигнала нетронутой.
xfiltfilt = filtfilt(iir,xn); plot(tn,xn) hold on plot(tn,xfilter) plot(tn,xfiltfilt) title 'Electrocardiogram' xlabel 'Time (s)' legend('Original','''filter''','''filtfilt''') axis([0.25 0.55 -1 1.5]) grid
