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

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

Конечные фильтры импульсной характеристики часто задерживают все частотные составляющие той же суммой. Это дает возможность корректировать для задержки путем сдвига сигнала вовремя.

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

Fs = 500;
N = 500;
rng default

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

Удалите часть шума с фильтром, который останавливает частоты выше 75 Гц. Используйте designfilt спроектировать фильтр порядка 70.

nfilt = 70;
Fst = 75;

d = designfilt('lowpassfir','FilterOrder',nfilt, ...
               'CutoffFrequency',Fst,'SampleRate',Fs);

Отфильтруйте сигнал и постройте его. Результат более сглажен, чем оригинал, но отстает от него.

xf = filter(d,xn);

plot(tn,xn)
hold on, plot(tn,xf,'-r','linewidth',1.5), hold off
title 'Electrocardiogram'
xlabel 'Time (s)', legend('Original Signal','Filtered Signal')

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

grpdelay(d,N,Fs)

delay = mean(grpdelay(d))
delay = 35

Переключите отфильтрованный сигнал выстроить в линию данные. Удалите его первый delay выборки. Удалите последний delay выборки оригинала и временного вектора.

tt = tn(1:end-delay);
sn = xn(1:end-delay);

sf = xf;
sf(1:delay) = [];

Постройте сигналы и проверьте, что они выравниваются.

plot(tt,sn)
hold on, plot(tt,sf,'-r','linewidth',1.5), hold off
title 'Electrocardiogram'
xlabel('Time (s)'), legend('Original Signal','Filtered Shifted Signal')

Смотрите также

| | |

Похожие темы