考虑以下内容(源自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")
可以看出,红色和蓝色(过滤和过滤,即)都来自(0,0)。但是,我希望它们以给定的初始值开始,例如init = mean(x[1:10])
。无论我如何在filter(bf, x)
中提供约束,无论是整数还是向量,我都得不到结果或length of 'init' must equal length of 'filter'
。作为所需输出的比较,提供简单的移动平均值(绿色)。谢谢。
答案 0 :(得分:1)
要为蓝线传递init
值,可以通过更改代码的2行来实现。
首先:将过滤器顺序存储在变量n
bf <- butter(n<-5, 0.1)
然后创建一个init
向量或正确大小的矩阵
z <- filter(bf, x, init=rep(mean(x[1:10]), n))
至于红线,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))