r - 使用 Signal 包的 R 低通滤波器
问题描述
我是 R 新手,无法为我的数据安装低通滤波器。我正在Force
以30 seconds
250/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")
我想知道我是否应该改用高通,或者是否有其他选项可以衰减任何低于零的力信号?
解决方案
前言
我不确定我是否可以在数据中看到任何表明您的“罪魁祸首”频率是 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。该函数告诉您这超出了它的能力(或任何数字滤波器的能力)。
推荐阅读
- javascript - Discord.js v12 清除命令
- microsoft-teams - 如何阻止团队选项卡重定向到网页
- python - ArgParse:ValueError:无效的文件路径或缓冲区对象类型:
- rust - rusqlite 和 pyo3 PyResult 处理错误
- markdown - Sublime Text 3 Pandoc md 到 pdf
- arrays - 关于 Delphi / Generic / array's:为什么这不能编译?
- javascript - 我有一个混合类型的数组对象。我需要根据类型拆分它
- java - 重试失败插入结果的重试策略/框架
- assembly - Assembly-RiscV 中的“不”是什么意思?
- json - 从 URL swiftui 解压缩 JSON 文件