【问题标题】:Provide initial value to signal::filter function in R为 R 中的 signal::filter 函数提供初始值
【发布时间】:2018-06-23 08:57:48
【问题描述】:

考虑以下内容(源自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'。作为所需输出的比较,提供了一个简单的移动平均线(绿色)。谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    bf &lt;- butter(n&lt;-5, 0.1)

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

    z &lt;- 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))
    

    【讨论】:

    • 谢谢。我选择filtfilt 来消除相移。使用您的第一个示例,我必须手动转换功能,例如lines(t[-c((1-10+length(t)):length(t))], z[-c(1:10)], col="blue", lty = "dashed")filterfiltfilt 都让我在开始和结束时丢失了比 SMA 更多的数据。不过,我想这是过滤器的性质,所以我赞成你的简洁答案。
    猜你喜欢
    • 2018-05-15
    • 2013-09-11
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    相关资源
    最近更新 更多