R低通滤波器使用信号包



我是R的新手,无法将低通滤波器安装到我的数据中。我正在以 250/s 或250Hz的采样率测量在30 seconds时间内在跑步机上施加的Force

数据包含负力值,如下图所示

这是由于信号中的涟漪或背景噪声造成的。我需要能够过滤掉任何力信号<0,为此我在Signal包中使用了Butter函数:

ritLowPass = function(s, frqCutOff, bPlot = F ) 
{
f = butter( 4, frqCutOff/(smpRate/2), "low" ); # lowpass filter 
s.lp = rev( filter( f, rev( filter( f, s ))) );
if( bPlot ) {

idx=(1*smpRate):(4*smpRate);
plot( x=idx/smpRate, y=s[idx], xlab="time/s", ylab="signal", ty="l" );
lines( x=idx/smpRate, y=s.lp[idx], col="red", lwd=2) 
}

return(data.frame(s.lp));
}

VT_filter <- ritLowPass(guest$Fz, 250, bPlot)

示例数据:

Time    Fz
0        3.769
0.004   -32.94
0.008   -117.305
0.012   -142.329
0.016   -55.35
0.02    -27.362
0.024   29.039
0.028   73.718
0.032   76.633
0.036   4.482
0.04    -80.949
0.044   -114.279
0.048   -102.968
0.052   -9.76
0.056   35.405
0.06    152.541
0.064   79.249
0.068   50.147
0.072   22.547
0.076   47.757
0.08    -29.123
0.084   57.384
0.088   88.715
0.092   195.115
0.096   118.752
0.1     183.22
0.104   157.957
0.108   37.992
0.112   -7.893

当我运行代码时,出现以下错误:

VT_filter <- ritLowPass(guest$Fz, 250, bPlot)
Error in butter.default(4, frqCutOff/(smpRate/2), "low") : 
butter: critical frequencies must be in (0 1)
Called from: butter.default(4, frqCutOff/(smpRate/2), "low")

我想知道我是否应该使用 HighPass 代替,或者是否有另一种选择来衰减任何低于零的力信号?

前言

我不确定我是否可以在数据中看到任何表明您的"罪魁祸首"频率是 250 Hz 的内容,或者您应该将频率降低到此值以上。

如果您尝试消除特定频率的信号噪声,则需要首先找到噪声频率。spectrum是你的朋友。

但是,假设您确实想要过滤 250 Hz 以上的频率:

简答题

如果要过滤 250 Hz 以上的频率,则采样频率至少需要为 500 Hz。

长答案

您的滤波器只能在 0 和奈奎斯特频率之间过滤,即 0 到 (采样频率(/2。这是信息论的硬性限制,而不是实现问题。

你要求它过滤两倍于奈奎斯特频率的东西。

help(butter)给出了有关W参数的以下内容:

W:滤波器的临界频率。对于数字滤波器,W 必须介于 0 和 1 之间,其中 1 是奈奎斯特频率。

您尝试分配给过滤器的截止值是 (250(/(250/2( = 2。该函数告诉您这超出了其功能(或任何数字滤波器的功能(。

从问题来看,您似乎没有费心阅读?butter手册的全部输出。封装中几乎所有滤波器设计函数的频率仅相对于奈奎斯特频率使用,因此每当函数要求您提供频率f_1时,您都需要为其提供f_1/(f_sample/2),结果预计在 0 到 1 之间,因为您的信号预计不会有不可恢复的失真。他们没有准确地告诉你简单的方程,他们在手册中有一些错误(如双线性变换函数的公式(,但在你尝试使用这个包之前,你当然应该有一些关于这个主题的一般和基本知识,所以这不是什么大问题。

另外,如果出于任何原因让您担心的唯一事情是负信号值,那么为什么还要费心尝试过滤它呢?在这里,我使用DSP相关书籍中"过滤"一词的定义,当然这可能不是您在问题中的意思。你可以做一些类似的事情guest$Fz[guest$Fz<0]=0.这通常比使用NA或完全删除样本更好,因为缺失值和因此不规则的采样会产生全局信号伪影,并且比仅用单个采样值替换另一个采样值的局部高频尖峰要糟糕得多。然后,如果您觉得有必要,您可以使用一些数据平滑方法来使您的信号看起来更好。

事实上,我的猜测是,这是一些纯粹的教育测试信号,您可能真的需要使用简单的低通滤波器过滤信号,并且所需的单个截止频率远低于250Hz Fs,负值本身不是问题,而是表明滤波非常糟糕或不存在,但谁知道呢......

最新更新