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

时间:2009-06-21 13:05:57

标签: math signal-processing average digital-filter

我有一个连续值,我想计算exponential moving average。通常我只是使用标准公式:

  • 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上计算的区间t计算相同2,4,4],它没有做。或者这有意义吗?

有人可以告诉我如何适当地改变alpha吗? “请展示你的作品。”即,向我展示数学,证明你的方法确实做得对。

8 个答案:

答案 0 :(得分:46)

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

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

Y n =αX+(1-α)Y n-1 →Y n = Y n-1 < / sub> +α(X - Y n-1

代码:

 Y += alpha * (X-Y);

其次,α的值在此等于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=(X-Y)/τ

ΔY=(X-Y)(Δt/τ)=α(X-Y)

并且α= 1-e -Δt/τ的“外推”来自于试图将该行为与单位阶跃函数情形匹配。

答案 1 :(得分:6)

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

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

我认为该文档准确描述了您需要的编程算法。

答案 2 :(得分:2)

这不是一个完整的答案,但可能是一个问题的开始。在一个小时左右的时间里,这就是我所能得到的;我发布它作为我正在寻找的一个例子,也许是对解决这个问题的其他人的启发。

我从S 0 开始,这是前一个平均S -1 得到的平均值,而样本Y 0 取自t <子> 0 。 (t 1 - t 0 )是我的采样间隔,α设置为适合该采样间隔的任何值和我希望平均的周期。

我考虑过如果我错过t 1 处的样本会发生什么,而是必须处理在t 2 2 >?那么,我们可以从扩展等式开始,看看如果我们有Y 1 会发生什么:

  • S 2 =αY 2 +(1-α)S 1 ,其中S 1 =αY 1 +(1-α)S 0

代:

  • S 2 =αY 2 +(1-α)(αY 1 +(1-α)S 0 < /子>)
  • S 2 =αY 2 +(1-α)αY 1 +(1-α)(1-α)S <子> 0
  • S 2 =αY 2 +(1-α)αY 1 +(1-α) 2 取值<子> 0

我注意到这个系列似乎以这种方式无限扩展,因为我们可以无限期地替换右侧的S n

  • S 2 =αY 2 +(1-α)αY 1 +(1-α) 2 (αY 0 +(1-α)S -1
  • S 2 =αY 2 +(1-α)αY 1 +(1-α) 2 αY 0 +(1-α) 3 S -1

好吧,所以它不是真正的多项式(愚蠢的我),但如果我们将初始项乘以1,我们就会看到一种模式:

  • S 2 =(1-α) 0 αY 2 +(1-α)αY 1 +(1-α) 2 αY 0 +(1-α) 3 S -1

嗯:这是一个指数系列。 Quelle惊喜!想象一下,以指数移动平均线出现的等式!

所以无论如何,我有x 0 + x 1 + x 2 + x 3 +。 ......事情进展了,我确定我闻到了e或者在这里踢了一个自然的对数,但是在我没时间用完之前我不记得我要去哪里了。

答案 3 :(得分:1)

对此问题的任何回答,或此类答案的正确性证明,都取决于您所测量的数据。

如果你的样本是在t 0 = 0ms,t 1 = 0.9ms而t 2 = 2.1ms,但是你的选择α的基于1-ms间隔,因此您需要局部调整的α n ,选择正确性的证明意味着在t = 1ms和t = 2ms时知道样本值。

这导致了一个问题:你能否合理地插入你的数据,以便对两者之间的值进行合理的猜测?或者你甚至可以插入平均值吗?

如果这些都不可能,那么据我所知,中间值Y(t)的逻辑选择是最近计算的平均值,即Y(t) ≈S n 其中n是maxmial,使得t n

这种选择有一个简单的结果:无论时差是多少,都可以单独留下α。

另一方面,如果可以插值,那么这将为您提供可用的恒定间隔样本。最后,如果甚至可以插入平均值本身,那将使问题变得毫无意义。

答案 4 :(得分:1)

假设我们想在连续函数上进行指数衰减平均。但是我们没有该函数的所有值,只有少数样本。该公式将对我们确实具有的连续平均值的权重进行加权平均。

乘数 n = Alpha 时间 n -Time n-1

Sum n = Val n + Sum n-1 * Multiplier n

计数 n = 1 + Count n-1 *乘数 n

平均 n = Sum n / Count n

答案 5 :(得分:1)

使用略微不同的α等于(1-α问题中的那个),将新值Y添加到S 0的现有平均值的基本公式看起来像这样:

  

S(Y,S 0 )=

     

(1-α)Y +αS 0 =

     

Y - αY+αS 0 =

     

Y +α(S 0 -Y)

如果我们现在添加时间间隔t的长度并假设只有α取决于该t,那么该公式如下所示:

  

S(Y,t,S 0 )= Y +α t (S 0 -Y)

现在假设t = t 1 + t 2 。如果通过在时间间隔t 1 和t 2 中添加两个Y值来创建平均值,则得到的平均值如下所示:

  

S(Y,t 2 ,S(Y,t 1 ,S 0 ))=

     

Y +α t 2 (S(Y,t 1 ,S 0 ) - Y) =

     

Y +α t 2 ((Y +α t 1 (S 0 < / sub> -Y)) - Y)=

     

Y +α t 2 α t 1 (S 0 - Y)

如果这个平均值应该与一次加入整个t区间相同,那么α t t 1 < /子>α<子>吨<子> 2 。满足此要求的α的定义是:

  

α x := A x (对于某些常数A)

由于:

  

α t = A t =    t 1 + t 2 =    t 1 A t 2 =   α<子>吨<子> 1 α<子>吨<子> 2

这导致以下平均功能:

  

S(Y,t,S 0 )= Y + A t (S 0 -Y)

我还没有真正测试过这个,但是如果我做出的假设符合您的情况,那么这看起来像一个平均函数,可以很好地处理采样间隔的变化。

答案 6 :(得分:0)

我会单独留下alpha值,并填写缺失的数据。

由于您不知道在无法采样期间发生的情况,您可以使用0填充这些样本,或保持先前的值稳定并将这些值用于EMA。或者,如果您有新样本,请进行一些向后插值,填写缺失值,然后重新计算EMA。

我想要的是你有一个输入x[n],它有漏洞。没有办法解决您丢失数据的事实。因此,您可以使用零阶保持,或将其设置为零,或在x[n]x[n+M]之间进行某种插值,其中M是缺失样本的数量,n是开始的差距。甚至可能在n之前使用值。

答案 7 :(得分:0)

这类似于我的待办事项清单上的一个未解决的问题。我有一个计划在某种程度上解决了,但还没有数学工作来支持这个建议。

更新&amp;摘要:希望保持平滑因子(alpha)与补偿因子无关(我在此称为beta)。杰森在这里已经接受的优秀答案对我来说非常有用。

第一步。

  • 如果您还可以测量自上一次采样以来的时间(以恒定采样时间的舍入倍数 - 因此自上次采样后的7.8 ms为8个单位),可用于多次应用平滑。在这种情况下,应用公式8次。您已经有效地使平滑偏向于当前值。

第二步。

  • 为了获得更好的平滑效果,我们需要调整alpha值,同时在前一种情况下应用公式8次。

这种平滑近似会错过什么?

  • 上面的示例中已经错过了7个样​​本
  • 这是在步骤1中近似的,扁平重新应用当前值7次
  • 如果我们定义一个近似因子 beta 将与 alpha 一起应用(作为alpha * beta而不是alpha),我们将假设7错过了样本在先前和当前样本值之间平滑变化。