R低通滤波器使用Signal包

时间:2018-05-31 22:20:53

标签: r signals lowpass-filter highpass-filter

我是R的新手,无法在我的数据中安装Lowpass滤镜。我正在Force测量30 seconds250Hz期间的采样率,采样率为250 / s或<0

The data contains negative force values as seen in this image

这是由于信号或背景噪音的涟漪造成的。我需要能够过滤掉任何强制信号Butter,为此我在Signal包中使用了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")

当我运行代码时,我收到以下错误:

s3.put_object()

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

2 个答案:

答案 0 :(得分:0)

序言

我不确定我能在数据中看到任何表明你的罪魁祸首的信息。频率为250 Hz,或者您应该将频率切换到此值以上。

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

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

简答

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

长答案

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

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

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

  

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

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

答案 1 :(得分:0)

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

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

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