为什么即使在更改加速时间序列数据的截止频率后,仍能从 fir 滤波器获得相同的输出?

如何解决为什么即使在更改加速时间序列数据的截止频率后,仍能从 fir 滤波器获得相同的输出?

我对过滤有疑问。

目前我正在使用惯性测量单元(加速度计/加速度数据)进行行人步数检测,我需要在预处理级别对我的信号进行过滤。任何人都可以建议哪一种是获得良好准确性的最佳过滤算法。 现在我使用数字低通冷杉滤波器order=2,窗口大小=1.2sec,采样频率=200hz,但似乎不起作用。我想使用较低的截止频率。我使用了 0.03hz 和 3hz 的截止频率,但我得到了 两个截止频率的相同结果。我需要你的指导或帮助,我该如何继续。下面我分别附上过滤结果的图像作为链接,分别为 3hz 和 0.03hz,以及我尝试过的代码。 有人可以建议我或在 matlab 中提供任何好的过滤和/或我如何处理。

fir result at 3hz cutoff fir result at 0.03hz cutoff

Full signal

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 宽窗口的传递函数图。 Transfer function of a rectangular window of width 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 秒长的示例一样短的信号,它完全无法使用。 Filter Design Assistant screenshot Freq. response of a 2nd order Butterworth lowpass with Fc=0.03 Hz. From Matlab Filter Designer. Freq. response of FIR filter meeting design criteria similar to a 2nd order Butterworth.  The order required was 2399.  From Matlab Filter Designer.

  1. |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');

Figure created by code above.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?