5
高效的算法/数据结构来计算移动平均值
目前,我正在开发图形LCD系统,以显示热泵系统中的温度,流量,电压,功率和能量。使用图形LCD意味着屏幕缓冲区和字符串耗尽了我一半的SRAM和约75%的闪存。 我当前正在显示能源的最小/最大/平均数字。在午夜,当重置每日数字时,系统将检查当天的消耗量是否高于或低于先前的最小值或最大值,并存储该值。通过将累计能耗除以天数来计算平均值。 我想显示最近一周和一个月的日平均值(为简单起见,为4周),即滚动平均值。当前,这涉及维护最近28天的值数组,并计算整个数组中每月的平均值和每周的最后7天的平均值。 最初,我是使用浮点数组来完成此操作的(因为能量的形式为“ 12.12kWh”),但这使用的是28 * 4字节= 112字节(占SRAM的5.4%)。我不在乎分辨率只有一个小数点,因此我改为使用uint16_t并将该数字乘以100。这意味着12.12表示为1212,为了显示目的,我将其除以100。 数组的大小现在减少到56个字节(好多了!)。 没有简单的方法可以将图形缩小到我能看到的uint8_t。我可以忍受小数点后的损失(“ 12.1kWh”而不是“ 12.12kWh”),但是功耗通常高于25.5kWh(255是由8位无符号整数表示的最大值)。耗电量从未低于10.0kWh或高于35.0kWh,因此可以想象,我可以从存储的数据中减去10,但是我知道有一天我们会超过这些限制。 然后,我测试了将9位值打包到数组中的代码。范围为0-51.2kWh,总共使用32个字节。但是,访问这样的数组非常慢,尤其是当您必须遍历所有值以计算平均值时。 所以我的问题是-是否有更有效的方法来计算三个窗口(寿命,28天和7天)的移动平均值?效率意味着就SRAM的使用而言更小,但不会带来巨额代码的代价。我可以避免存储所有值吗?