补偿 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')
另请参阅
designfilt
| filter
| filtfilt
| grpdelay