Компенсируйте задержку и искажения, введенные фильтрами

Фильтрация сигнала вводит задержку. Это означает, что выходной сигнал сдвигается во времени относительно входа.

Когда сдвиг является постоянным, можно исправить задержку, сдвинув сигнал во времени.

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

Figure contains an axes. The axes with title Electrocardiogram contains 2 objects of type line. These objects represent Original, FIR Filtered.

Использование grpdelay чтобы проверить, что задержка, вызванная фильтром, равна половине порядка фильтра.

grpdelay(firf,N,Fs)

Figure Filter Visualization Tool - Group delay contains an axes and other objects of type uitoolbar, uimenu. The axes with title Group delay contains an object of type line.

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

Figure contains an axes. The axes with title Electrocardiogram contains 2 objects of type line. These objects represent Original Signal, Filtered Shifted Signal.

Повторите расчет с помощью БИХ 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

Figure contains an axes. The axes with title Electrocardiogram contains 2 objects of type line. These objects represent Original, Filtered.

Взгляд на групповую задержку, введенную фильтром, показывает, что задержка зависит от частоты.

grpdelay(iir,N,Fs)

Figure Filter Visualization Tool - Group delay contains an axes and other objects of type uitoolbar, uimenu. The axes with title Group delay contains an object of type line.

Пропустите сигнал, используя 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

Figure contains an axes. The axes with title Electrocardiogram contains 3 objects of type line. These objects represent Original, 'filter', 'filtfilt'.