如何对齐原始信号和滤波信号以进行分析?

Posted

技术标签:

【中文标题】如何对齐原始信号和滤波信号以进行分析?【英文标题】:How to align original and filtered signal for analysis? 【发布时间】:2021-04-22 14:20:10 【问题描述】:

我使用巴特沃斯带通滤波器作为我的加速度数据。现在我想对齐/组合 原始信号和平滑信号 以进行观察/分析问题是我试图对齐,但它不起作用。可能我做错了。我需要指导,如何调整它们。 下面我发布了我的输出图像和代码,我试图用它来 align 两个信号。我放在这里的输出图像由原始信号和滤波信号组成,使用巴特沃斯带通滤波器完成。谢谢

delay = mean(grpdelay(B,A))
tt = Time(1:end-delay);
sn = norm(1:end-delay);

sf = Data_filtered;
sf(1:delay) = [];
plot(tt,sn)
hold on, plot(tt,sf,'-r','linewidth',1.5), hold off
title 'Gyro Filtration'
xlabel('Time (s)'), legend('Original Signal','Filtered Shifted Signal')

output original and filtered signals

【问题讨论】:

首先你显示的图和你的代码不符,所以很难看出你遇到了哪些问题。其次,您正在使用没有线性相位行为的 IIR 滤波器来平均群延迟在这种情况下不是最好的方法。请阅读Group and Phase delay 以更好地了解效果。此外,重要的是要知道您是否只对离线分析感兴趣,在这种情况下,您可以使用零相位滤波器 filtfilt 感谢您的回复。我提到的代码用于减少两个信号之间的延迟,但这对我的信号不起作用。第二个是我没有使用 IIR 滤波器,它的巴特沃斯带通滤波器和我放在这里的输出图像是巴特沃斯滤波器的结果。一个是原始信号,另一个是过滤的,所以我想对齐两者,可以看出它们彼此相距很远。我不想使用零相位滤波器,我已经使用了 filtfilt 和 butterworth。 您应该更好地了解巴特沃斯滤波器,无论是低通、高通还是带通它们是 IIR 滤波器,它们都可以用 FIR 来近似,但是它们在 Matlab 中实现的方式是 IIR(即在检查变量A 时会变得很明显)。您应该了解这些非线性相位响应。 如果您需要帮助,请阅读 How to Ask 和 minimal-reproducible-example。现在,我们并没有真正看到您的问题是什么,我们也无法重现它。 【参考方案1】:

我建议您使用 filtfilt() 进行过滤,因为 filfilt() 在所有频率上都具有完全零延迟。它实现了这一点,因为它向前过滤信号,然后向后过滤。向前通过时的时间延迟被向后通过时相等但相反的延迟抵消。请注意,由于您进行了两次过滤,因此每个频率的最终衰减(如果以 dB 为单位)是您从单次通过中获得的两倍。因此,您会在原始截止频率处获得 6 dB 的衰减,而不是通常的 3 dB。对于大多数应用程序,包括您的应用程序,我相信这不是问题。如果有问题,那么您可以调整初始滤波器定义的截止值,以便在两次通过后在所需截止值处获得 3 dB 衰减。

有关延迟与 filt() 和 filtfilt() 的比较,请参见随附的代码和图。该图显示 raw 和 filtfilt() 信号都在完全相同的时间通过 y=0 转换,这反映了 filtfilt() 没有任何延迟。该图还表明,原始信号中的高频噪声已被滤波器去除。

如果由于某种原因您不想使用 filtfilt(),那么通带中 n 阶低通巴特沃斯滤波器的延迟的一个很好的近似是

延迟 = Kn/Fc(延迟单位为 s,Fc=截止频率单位为 Hz)

其中 Kn 是一个取决于过滤器阶数 n 的常数:

n=2,3,4,6,8

Kn=0.225,0.318,0.416,0.615,0.816

有关更多订单和推导,请参阅我的论文“A general solution for the time delay...”,J Biomechanics (2007),https://pubmed.ncbi.nlm.nih.gov/16545388/。

%filterCompare.m  WCR 20210118
% Question on stack exchange
clear;

%Make an illustrative input signal
Fs=200;                     %sampling frequency (Hz)
N=800;                      %number of points
Tdur=N/Fs;                  %duration (s)
Time=(0:(N-1))/Fs;          %time vector
x=square(Time*2*pi/Tdur)...     %square wave plus high frequency ripple
    +0.2*sin(2*pi*.25*Fs*Time);

%Compute the filter coefficients
order=4;
Fhpc=0.1;                   %high pass cutoff frequency (Hz)
Flpc=5;                     %low pass cutoff frequency (Hz)
Wn1=[Fhpc,Flpc]*2/Fs;       %normalized cutoff frequencies
[b,a]=butter(order,Wn1,'bandpass');  %compute filter coefficients

%Filter the data
y1=filter(b,a,x);         %standard (forward-only) filter
y2=filtfilt(b,a,x);       %forward and backward filter

%Plot the data
subplot(2,1,1);
plot(Time,x,'r.-',Time,y1,'g.-',Time,y2,'b.-');
ylabel('Amplitude');
legend('Raw Data','filter()','filtfilt()');
grid on;
subplot(2,1,2);
plot(Time,x,'r.-',Time,y1,'g.-',Time,y2,'b.-');
xlabel('Time (s)'); ylabel('Amplitude');
legend('Raw Data','filter()','filtfilt()');
axis([.45*Tdur .55*Tdur -inf inf]);
grid on;

【讨论】:

感谢您的回复。我已经使用了带有 filtfilt() 的巴特沃斯带通滤波器,正如你提到的,但输出仍然是相同的,如果我使用低通,那么输出很好,没有任何延迟。 如果你只用 filtfilt() 过滤,那么输入和输出信号之间没有延迟。无论传递给 filfilt() 的滤波器系数是巴特沃斯低通、巴特沃斯带通还是其他,这都是正确的。 但我仍然得到与我在主帖中附加的相同的输出,过滤后的信号和原始信号没有重叠@rosewc @muhamamd,您原始帖子中的代码片段未显示如何计算 sf,因此我无法评论您在 snsf 之间观察到的延迟的可能解释(原始和滤波信号)。原帖中图中的时间尺度不允许我们看到信号之间的延迟。 好的,感谢您的帮助,我会再次检查并通知您。

以上是关于如何对齐原始信号和滤波信号以进行分析?的主要内容,如果未能解决你的问题,请参考以下文章

用MATLAB设计对信号进行频谱分析和滤波处理的程序

关于用MATLAB设计确定信号的频谱分析和滤波

用matlab设计一个滤波器

基于matlab的声音信号采集与处理

matlab的音乐信号的分析与处理设计的实验咋做?

c语言中值滤波问题?