首页 > 解决方案 > 使用 Signal 包的 R 低通滤波器

问题描述

我是 R 新手,无法为我的数据安装低通滤波器。我正在Force30 seconds250/s 的采样率或250Hz.

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

这是由于信号或背景噪声中的波纹造成的。我需要能够过滤掉任何力信号<0,为此我使用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")

我想知道我是否应该改用高通,或者是否有其他选项可以衰减任何低于零的力信号?

标签: rsignalslowpass-filterhighpass-filter

解决方案


前言

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

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

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

简答

如果您想过滤高于 250 Hz 的频率,您的采样频率需要至少为 500 Hz。

长答案

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

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

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

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

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


推荐阅读