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

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

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

designfilt | filter | filtfilt | grpdelay