适用于低内存嵌入式系统的移动平均算法优化问询
实时移动平均计算的滞后问题与优化思考
我当前在处理实时移动平均计算,采用了一种低复杂度的实时算法,代码如下:
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
相关产品推荐
相关产品推荐

