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