指数移动平均数在不同时间采样

Cur*_*son 51 math signal-processing average digital-filter

我有一个连续值,我想计算一个指数移动平均线.通常我只是使用标准公式:

  • S n =αY+(1-α)S n-1

其中S n是新的平均值,α是α,Y是样本,S n-1是先前的平均值.

不幸的是,由于各种问题,我没有一致的采样时间.我可能知道我最多可以采样,比如每毫秒一次,但由于我无法控制的因素,我可能无法一次采样几毫秒.然而,一个更常见的情况是我简单地提前或延迟采样:而不是在0,1和2毫秒采样.我在0,0.9和2.1毫秒采样.我确实预计,无论延迟如何,我的采样频率都会远远超过奈奎斯特极限,因此我不必担心混叠.

我认为我可以通过根据自上次样本以来的时间长度适当地改变alpha来以一种或多或少的合理方式处理这个问题.

我的推理部分原因是EMA在前一个数据点和当前数据点之间"线性插值".如果我们考虑以间隔t计算以下样本列表的EMA:[0,1,2,3,4].如果我们使用区间2t,我们应该得到相同的结果,其中输入变为[0,2,4],对吧?如果EMA假设在t 2时该值从t 0开始为2 ,则与[0,2,2,4,4]上计算的区间t计算相同,但它没有这样做.或者这有意义吗?

有人能告诉我如何适当地改变阿尔法吗?"请展示你的作品." 即,向我展示数学,证明你的方法确实做得对.

Jas*_*n S 49

这个答案基于我对低通滤波器的理解("指数移动平均"实际上只是一个单极点低通滤波器),但我对你正在寻找的东西有朦胧的理解.我想以下是你想要的:

首先,您可以稍微简化您的等式(看起来更复杂但代码更容易).我将使用"Y"作为输出,使用"X"作为输入(而不是S表示输出,Y表示输入,正如您所做的那样).

Y n =αX+(1-α)Y n-1 →Y n = Y n-1 +α(X - Y n-1)

代码为:

 Y += alpha * (X-Y);
Run Code Online (Sandbox Code Playgroud)

第二,这里α的值与1-e- Δt "相等",其中Δt是样本之间的时间,τ是低通滤波器的时间常数.我在引号中说"相等",因为当Δt/τ比1小时,这很有效,并且α= 1-e- Δt/ τ≈Δt /τ.(但不是太小:你会遇到量化问题,除非你采用一些奇特的技术,否则你的状态变量S通常需要额外的N位分辨率,其中N = -log 2(α).)对于较大的Δt/τ的值过滤效果开始消失,直到你到达α接近1的点,你基本上只是将输入分配给输出.

这应该适用于不同的Δt值(Δt的变化不是很重要,只要alpha很小,否则你会遇到一些相当奇怪的奈奎斯特问题/混叠/等),如果你正在处理一个处理器其中乘法比除法便宜,或定点问题很重要,预先计算ω= 1 /τ,并考虑尝试近似α的公式.

如果你真的想知道如何推导出公式

α= 1-e- Δt/τ

然后考虑其微分方程源:

Y +τdY/ dt = X.

当X是单位阶跃函数时,其具有解Y = 1-e -t /τ.对于Δt的小值,导数可以近似为ΔY/Δt,屈服

Y +τΔY/Δt= X.

ΔY/Δt=(XY)/τ

ΔY=(XY)(Δt/τ)=α(XY)

并且α= 1-e- Δt/τ的"外推" 来自试图将行为与单位阶跃函数情况相匹配.


Ben*_*erg 6

看看这里:http://www.eckner.com/research.html

看看第二个链接:""不均匀间隔时间序列的算法:移动平均线和其他滚动运算符"

我想,该文档准确描述了您需要的编程算法.

  • 鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户能够了解它是什么以及它为什么存在.如果目标站点无法访问或永久脱机,请始终引用重要链接的最相关部分. (3认同)