Main Content

补偿 FIR 滤波器引入的延迟

对信号进行滤波会引入延迟。这意味着相对于输入,输出信号在时间上有所偏移。此示例向您说明如何抵消这种影响。

有限冲激响应滤波器经常将所有频率分量延迟相同的时间量。这样,我们就很容易通过对信号进行时移处理来针对延迟进行校正。

以 500 Hz 的频率对心电图读数采样,采样时间为 1 秒。添加随机噪声。重置随机数生成器以获得可再现性。

Fs = 500;
N = 500;
rng default

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

使用滤波器阻挡 75 Hz 以上的频率,以消除一部分噪声。使用 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')

另请参阅

| | |

相关主题