我想要一个输出 x 周期的移动平均值的信号/功能。我提出了两种方法,两种方法都有效,但我相信第二种方法更具反应性。有谁知道更好的方法?
方法1
@time (
x = Signal(100);
col = foldp(Int[], x) do acc, val
push!(acc, val)
end;
for i in rand(90:110, 100)
push!(x, i)
end;
)
此代码在 0.102663秒 中为我执行,并且很容易产生过去100个信号的平均值:mean(value(col))
方法2
@time (
a = Signal(100);
sar = Vector{Signal}(101);
sar[1] = a;
for i in 1:100
sar[i+1] = previous(sar[i])
end;
for i in rand(90:110, 100)
push!(a, i)
end;
)
此代码在 0.034911秒 中为我执行,并且还可以轻松地显示最近100个信号的平均值:
sarval = map(value, sar)
mean(sarval[2:end])`
上述两种方法均不直接提供输出信号;这里是方法1,用于创建指定长度的移动平均值作为连续信号:
方法1已应用
x = Signal(initial_value)
col = foldp(Float64[], x) do acc, elem
push!(acc, elem)
end
macro moving_average(per, collec)
quote
map($collec) do arr
length(arr) < $per ? mean(arr) : mean(arr[(end-$per+1):end])
end
end
end
ma_period = @moving_average(period_length, col)
此代码使用第一种方法生成所有过去信号的数组信号,其长度随信号数量线性增加。对于更新数千次的信号,这看起来很笨重(充其量)。这似乎并不理想,我正在寻找一些更好的方法。不确定如何采用方法2并将其转换为信号输出,并且不确定它是否是我能采取的最佳方法。
还有一个相关的问题:有一个很好的内置函数previous(signal)
,它在 signal 后面提供了一个信号滞后1更新。有没有办法在信号后面指定一个指定的,任意数量的更新的标志?