Cur*_*son 51 math signal-processing average digital-filter
我有一个连续值,我想计算一个指数移动平均线.通常我只是使用标准公式:
其中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/τ的"外推" 来自试图将行为与单位阶跃函数情况相匹配.
看看这里:http://www.eckner.com/research.html
看看第二个链接:""不均匀间隔时间序列的算法:移动平均线和其他滚动运算符"
我想,该文档准确描述了您需要的编程算法.