5
移動平均を計算するための効率的なアルゴリズム/データ構造
現在、ヒートポンプシステムの温度、流量、電圧、電力、エネルギーを表示するグラフィックLCDシステムを開発しています。グラフィックLCDを使用するということは、私のSRAMの半分と私のフラッシュの約75%がスクリーンバッファーと文字列によって使用されていることを意味します。 現在、エネルギーの最小値/最大値/平均値を表示しています。真夜中に毎日の数値がリセットされると、システムはその日の消費量が前の最小値または最大値を上回っているか下回っているかをチェックし、値を保存します。平均は、累積エネルギー消費量を日数で割って計算されます。 先週と先月(簡単にするために4週間)の日平均、つまり移動平均を表示したいと思います。現在、これには過去28日間の値の配列を維持し、毎月の配列全体と毎週の最後の7日間の平均を計算することが含まれます。 最初は、フロートの配列を使用してこれを実行していました(エネルギーは「12.12kWh」の形式であるため)。これは、28 * 4バイト= 112バイト(SRAMの5.4%)を使用していました。小数点以下1桁でも構わないので、uint16_tを使用して図に100を掛けることに変更しました。これは、12.12が1212として表され、表示のために100で割ることを意味します。 配列のサイズは56バイトに下がりました(はるかに良いです!)。 図をuint8_tに減らす簡単な方法はありません。小数点以下の桁落ちは許容できますが(「12.12kWh」ではなく「12.1kWh」)、消費量は25.5kWh(255は8ビットの符号なし整数で表される最高値)よりも高いことがよくあります。消費量が10.0kWh未満または35.0kWhを超えたことは一度もないので、格納された数値から10を差し引くこともできますが、ある日、これらの制限を超えることがわかっています。 次に、9ビットの値を配列にパックするコードをテストしました。これは0-51.2kWhの範囲を与え、合計で32バイトを使用します。ただし、このような配列へのアクセスは、特に平均を計算するためにすべての値を反復処理する必要がある場合は、かなり低速です。 だから私の質問は-寿命、28日、7日の3つのウィンドウで移動平均を計算するより効率的な方法はありますか?効率とは、SRAMの使用量の点で小さいことを意味しますが、巨大なコードのペナルティはありません。すべての値の保存を回避できますか?