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