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