exponenta event banner

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

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

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

Иногда фильтр задерживает некоторые частотные компоненты больше, чем другие. Это явление называется фазовым искажением. Чтобы компенсировать этот эффект, можно выполнить фильтрацию нулевой фазы с помощью filtfilt функция.

Возьмите показания электрокардиограммы, отобранные при 500 Гц в течение 1 с. Добавьте случайный шум. Сброс генератора случайных чисел для воспроизводимых результатов

Fs = 500;
N = 500;

rng default

xn = ecg(N)+0.1*randn([1 N]);
tn = (0:N-1)/Fs;

Удалите часть шума с помощью фильтра, который останавливает частоты выше 75 Гц. Использовать designfilt для конструирования FIR-фильтра порядка 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.

Повторите вычисления с помощью фильтра IIR 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'.