3

考虑以下内容(来自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")

示例过滤器

可以看出,红色和蓝色(即filter和filtfilt)都起源于(0,0)。但是,我希望它们从给定的初始值开始,例如init = mean(x[1:10]). 无论我如何在 中提供所述约束filter(bf, x),无论是整数还是向量,我要么没有结果,要么length of 'init' must equal length of 'filter'. 作为所需输出的比较,提供了一个简单的移动平均线(绿色)。谢谢你。

4

1 回答 1

2

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

首先:将过滤器顺序存储在一个变量中,n

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

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

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

在此处输入图像描述

至于红线,filtfilt是一个方便的函数,实际上并没有使用init,所以如果你需要为红线设置这个,我想你会想要filter自己调用两次方法,就像在源代码中所做的那样,然后通过/以这种方式处理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))

在此处输入图像描述

于 2018-01-14T17:20:15.933 回答