为R

时间:2018-01-14 15:10:01

标签: r filter signal-processing moving-average butterworth

考虑以下内容(源自signal::filter帮助页面):

require(signal)

bf <- butter(5, 0.1) 
t <- seq(0, 1, len = 100)
x <- sin(2*pi*t*2.3) + 0.25*rnorm(length(t)) + 5
y <- filtfilt(bf, x)
z <- filter(bf, x)

plot(t, x, ylim = c(0, max(x)))
lines(t, y, col="red")
lines(t, z, col="blue")
lines(t, stats::filter(x, rep(1/10, 10)), col = "green")
legend("bottomright", legend = c("data", "filtfilt", "filter", "SMA"), 
       pch = 1, col = c("black", "red", "blue", "green"), bty = "n")

exampleFilter

可以看出,红色和蓝色(过滤和过滤,即)都来自(0,0)。但是,我希望它们以给定的初始值开始,例如init = mean(x[1:10])。无论我如何在filter(bf, x)中提供约束,无论是整数还是向量,我都得不到结果或length of 'init' must equal length of 'filter'。作为所需输出的比较,提供简单的移动平均值(绿色)。谢谢。

1 个答案:

答案 0 :(得分:1)

要为蓝线传递init值,可以通过更改代码的2行来实现。

首先:将过滤器顺序存储在变量n

bf <- butter(n<-5, 0.1)

然后创建一个init向量或正确大小的矩阵

z <- filter(bf, x, init=rep(mean(x[1:10]), n))

enter image description here

至于红线,filtfilt是一个实际上不使用init的便利功能,所以如果你需要为红线设置这个,我想你只想打电话给filter方法自己完成两次,就像完成in the source一样,并以这种方式传递/处理init值。例如:

filtfilt2 <- function(filt, a, x, init)  {
    y = filter(filt, a, c(x, numeric(2 * max(length(a), length(filt)))), init=init)
    y = rev(filter(filt, a, rev(y)))[seq_along(x)]
    y
}
y <- filtfilt2(bf$b, bf$a, x, init=rep(mean(x[1:10]), n))

enter image description here