如何解决为什么即使在更改加速时间序列数据的截止频率后,仍能从 fir 滤波器获得相同的输出?
我对过滤有疑问。
目前我正在使用惯性测量单元(加速度计/加速度数据)进行行人步数检测,我需要在预处理级别对我的信号进行过滤。任何人都可以建议哪一种是获得良好准确性的最佳过滤算法。 现在我使用数字低通冷杉滤波器,order=2,窗口大小=1.2sec,采样频率=200hz,但似乎不起作用。我想使用较低的截止频率。我使用了 0.03hz 和 3hz 的截止频率,但我得到了 两个截止频率的相同结果。我需要你的指导或帮助,我该如何继续。下面我分别附上过滤结果的图像作为链接,分别为 3hz 和 0.03hz,以及我尝试过的代码。 有人可以建议我或在 matlab 中提供任何好的过滤和/或我如何处理。
fir result at 3hz cutoff fir result at 0.03hz cutoff
Fs = 200;
Hd = designfilt('lowpassfir','FilterOrder',2,'CutoffFrequency',0.03,...
'DesignMethod','window','Window',{@kaiser,1.2},'SampleRate',Fs);
y1 = filter(Hd,norm);
plot(Time,norm,'b',Time,y1,'red')
xlabel('Time (s)')
ylabel('Amplitude')
legend('norm','Filtered Data')
解决方法
我正在添加另一个答案以回复您的后续问题。宽度为 T 的矩形窗(或箱车窗)用作移动平均滤波器时,是具有传递函数幅值的低通滤波器
|H(f)|=(sin(pifT))/(pifT) (1)
你可以通过傅里叶变换来验证。因此,当 fco=0.44/T 时 H(f)=0.707,当 f=1/T 时 H(f)=0。因此,可以使用宽度为 1/fco(特别是 .44/fco)的矩形窗口来实现具有截止 fco 的低通滤波器。当 fco=0.03 Hz 时,宽度约为 30 s(特别是 15 s)。请参见 30 s 宽窗口的传递函数图。
如何找到必要的顺序:
>> Fs=200; Fc=.03;
>> Hd003=designfilt('lowpassfir','CutoffFrequency',Fc,'SampleRate',Fs);
Hd003 = designfilt('lowpassfir','PassbandFrequency',.03,'StopbandFrequency',.1,'PassbandRipple',3,'StopbandAttenuation',20,200,'DesignMethod','kaiserwin');
>> disp(length(Hd003.Coefficients));
2400
上面的命令 Hd003=designfilt(...) 会导致过滤器设计助手启动,因为 designfilt() 没有足够的信息。在 FDA 中,指定 Order mode = Minimum、Passband freq=0.03、Stopband freq=0.1、通带波纹=3 dB、stopband atten.=20 db、design method=Kaiser window。我选择这些频率和 dB 值是因为二阶巴特沃斯也同样出色。 (见图。)然后单击“确定”,控制返回到 Matlab 命令窗口,该窗口使用指定的参数运行“designfilt”。然后检查系数向量的长度:是2400! IE。 FIR 滤波器阶数=2399,滤波器长度为 12 秒。这是不切实际的,而且对于像您 1.6 秒长的示例一样短的信号,它完全无法使用。
- |H(f)| 的这个方程是连续时间。只要采样率 Fs>=10/T,它对于离散时间也是准确的。
您尝试制作二阶 FIR 滤波器。对于您的采样率 (200 Hz) 和所需的截止频率 (3 或 0.03 Hz),该顺序太低了。 FIR 滤波器所需的阶数与 IIR 滤波器的阶数非常不同。 N 阶 FIR 滤波器对 N+1 个数据点进行移动平均。 Hd=designfilt(...) 计算移动平均值的系数或权重。我使用您的代码片段制作了 3 Hz 和 0.03 Hz 截止滤波器,并将它们称为 Hd300 和 Hd003。然后我查看了两个滤波器的系数:
>> disp(Hd003.Coefficients);
0.2947 0.4107 0.2947
>> disp(Hd300.Coefficients);
0.2945 0.4110 0.2945
如您所见,它们实际上是相同的 - 这就是输出过滤信号看起来相同的原因。系数非常相似,因为当采样率为 200 Hz 时,阶数 = 2 太低了,无法制作 3 或 0.03 Hz 截止的有效 FIR 滤波器。 您尝试的 0.03 截止频率对应于大约 30 (=1/.03) 秒的时间常数。对只有 1.6 秒长的数据使用如此低的截止值是没有意义的。即使您有数百秒的数据,这也没有任何意义,因为您将使用大约 30 秒的宽窗口平滑数据,这会使检测每一步变得非常困难。 更好的方法:简单的二阶巴特沃斯低通,截止频率 = 1 到 10 Hz。请参阅下面的代码并参见图。我在代码中使用了 filtfilt() 而不是 filter(),因为 filtfilt() 可以更好地处理启动瞬态。将 filtfilt() 替换为 filter(),您就会明白我的意思。
%pedometerAccelFilter.m WCR 20210117
% Question on stack exchange
% The code provided on stack exchange assumes vector "norm"
% contains 1.6 seconds of acceleration data sampled at 200 Hz.
% I digitized the data from the figure on stack exchange and
% saved it in file pedometerInterpData.txt (2 columns,329 rows).
%Load the data
data=load('pedometerInterpData.txt');
Time=data(:,1); norm=data(:,2);
%Compute the filter coefficients
Fs=200; %sampling frequency (Hz)
order=2;
Fc1=5; %filter 1 cutoff frequency (Hz)
Wn1=Fc1*2/Fs; %filter 1 normalized cutoff frequency
[b1,a1]=butter(order,Wn1); %filter 1 coefficients
Fc2=2; %filter 2 cutoff frequency (Hz)
Wn2=Fc2*2/Fs; %filter 2 normalized cutoff frequency
[b2,a2]=butter(order,Wn2); %filter 2 coefficients
%Filter the data
y1=filtfilt(b1,a1,norm); %filtfilt() could be replaced with filter()
y2=filtfilt(b2,a2,norm);
%Plot the data
plot(Time,norm,'r.-',Time,y1,'gx-',y2,'bo-');
xlabel('Time (s)'); ylabel('Amplitude');
legend('Raw Data','Filter 1','Filter 2');
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。