【问题标题】:R lowpass filter using Signal package使用 Signal 包的 R 低通滤波器
【发布时间】:2018-05-31 22:20:52
【问题描述】:

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

The data contains negative force values as seen in this image

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

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

【问题讨论】:

    标签: r signals lowpass-filter highpass-filter


    【解决方案1】:

    序言

    我不确定我能否在数据中看到任何暗示您的“罪魁祸首”频率是 250 Hz,或者您应该削减高于该值的频率。

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

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

    简答

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

    长答案

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

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

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

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

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

    【讨论】:

    • 谢谢杰森 - 我的问题的基石是,如果我想消除任何 的力数据,我该如何实现这一点,以便我有 Y 轴没有负值
    • 首先最重要的是:您是否有理由移除负力值?设置中没有任何弹性或弹性吗?
    • 至于如何移除它们:我认为在频域中解决这个问题是很难的。如果您只想绘制正值,但保留相同的数据:plot(x, y, type="l", ylim=c(0, your_upper_limit_here)。如果你想删除 y y_pos <- y ; y_pos[ y_pos<0] <- NA 如果你想平滑地过滤掉它,你需要弄清楚哪些频率对此有影响。我知道没有通用的方法可以做到这一点。它通常涉及频域的一些调查。
    • 很好看的杰森 - 负力值是由于弹簧反冲造成的,但不应包含在数据分析中,这就是我必须删除它们的原因。力数据来自用于模拟在月球等低重力下跑步的垂直跑步机——这是通过使用弹簧和滑轮系统将跑步机垂直悬挂在空中来实现的,因此它确实会产生一些不需要的负力。我将实施您的代码以消除负面影响。谢谢。
    • 好的,如果你想消除弹簧振荡的影响,并且弹簧频率与其他强迫频率不同,那么在频域中使用陷波滤波器会做得更好。简单地消除负面因素仍将包括弹簧的积极贡献,我想你不想要。玩spectrum看看能不能分离出弹簧频率。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 2016-02-29
      • 2015-05-03
      • 2023-04-10
      • 2011-05-29
      • 2019-04-29
      • 2015-05-09
      相关资源
      最近更新 更多