You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

适用于低内存嵌入式系统的移动平均算法优化问询

实时移动平均计算的滞后问题与优化思考

我当前在处理实时移动平均计算,采用了一种低复杂度的实时算法,代码如下:

public void AddPoint(double input)
{
    Value += (input - Value) / (dataLength * divergenceCorrection);
}

但实际测试发现,该算法得出的平均值与真实逐值计算结果相比,存在明显滞后:

示例1

double[] values = new double[] { 10, 10, 10, 10, 10, 2, 2, 2, 2, 2 };
double value = 0;
foreach(double num in values)
{
    value += (num - value) / (5 * 1);
}

运行结果为3.54..,但真实的最近5个值的平均值是2。

示例2

若输入数组为{ 100000, 100000, 100000, 100000, 100000, 2, 2, 2, 2, 2 },运行上述算法得到的结果是22031,与真实值(2+2+2+2+2)/5 = 2相差极大。


为缩小衰减效果与目标窗口长度的差距,我尝试调整divergenceCorrection参数:

double[] values = new double[] { 100000, 100000, 100000, 100000, 100000, 2, 2, 2, 2, 2 };
double value = 0;
foreach(double num in values)
{
    value += (num - value) / (5 * 0.25);
}

调整后结果为33,虽更接近真实值,但我担心修改该参数会带来其他未知影响,希望找到更合适的解决办法。


我也考虑过传统的基于队列的移动平均实现,代码如下:

double[] values = new double[] { 100000, 100000, 100000, 100000, 2, 2, 2, 2, 2 };
Queue<double> queue = new Queue<double>();
double value = 100000;
// 初始化队列,填充初始值的均分
for(int i = 0; i < 5; i++)
{
    queue.Enqueue(value / 5);
}
// 实时计算逻辑
double tempVal = double.NaN;
foreach(double num in values)
{
    tempVal = num/5;
    value += tempVal;
    queue.Enqueue(tempVal);
    value -= queue.Dequeue();
}

但该方案需要存储历史数据,而我在嵌入式系统中使用,内存资源有限,这限制了可设置的窗口长度和采样分辨率。注:输入为实时传感器数据,必须存储历史值才能计算准确的移动平均。

内容的提问来源于stack exchange,提问作者julian bechtold

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:55:30