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