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

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

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

Иногда фильтр задерживает некоторые частотные составляющие больше, чем другие. Это явление называется искажением фазы. Чтобы компенсировать этот эффект, можно выполнить фильтрацию нулевой фазы с помощью 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 object. The axes object 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 object and other objects of type uitoolbar, uimenu. The axes object 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 object. The axes object 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 object. The axes object 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 object and other objects of type uitoolbar, uimenu. The axes object 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 object. The axes object with title Electrocardiogram contains 3 objects of type line. These objects represent Original, 'filter', 'filtfilt'.