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