From ddfa276b420cac7d75e9eb866aaab7598670e58b Mon Sep 17 00:00:00 2001
From: Alberto Nidasio <alberto.nidasio@skywarder.eu>
Date: Wed, 25 May 2022 20:15:53 +0200
Subject: [PATCH] [MovingAverage] Implemented circular buffer

The previous implementation was actually an exponential moving average
---
 src/shared/utils/MovingAverage.h | 37 +++++++++++++-------------------
 1 file changed, 15 insertions(+), 22 deletions(-)

diff --git a/src/shared/utils/MovingAverage.h b/src/shared/utils/MovingAverage.h
index 6a6efd1bb..bea0055dd 100644
--- a/src/shared/utils/MovingAverage.h
+++ b/src/shared/utils/MovingAverage.h
@@ -22,44 +22,37 @@
 
 #pragma once
 
+#include <utils/collections/CircularBuffer.h>
+
 namespace Boardcore
 {
 
-template <typename T>
+template <typename T, unsigned int Size>
 class MovingAverage
 {
 public:
-    MovingAverage(int movingAverageN = 10) : movingAverageN(movingAverageN) {}
+    MovingAverage() {}
 
-    T getValue() { return value; }
+    void push(T value) { buffer.put(value); }
 
-    void updateValue(T newValue)
+    T getAverage()
     {
-        if (value == 0)
-        {
-            value = newValue;
-            return;
-        }
+        T average = 0;
 
-        value *= movingAverageCompCoeff;
-        value += newValue * movingAverageCoeff;
-    }
+        for (size_t i = 0; i < buffer.getSize(); i++)
+            average += buffer.get(i);
 
-    void reset() { value = 0; }
+        return average / buffer.getSize();
+    }
 
-    void setN(int movingAverageN)
+    void reset()
     {
-        this->movingAverageN   = movingAverageN;
-        movingAverageCoeff     = 1 / (float)movingAverageN;
-        movingAverageCompCoeff = 1 - movingAverageCoeff;
+        while (!buffer.isEmpty())
+            buffer.pop();
     }
 
 private:
-    T value = 0;
-
-    int movingAverageN           = 20;
-    float movingAverageCoeff     = 1 / (float)movingAverageN;
-    float movingAverageCompCoeff = 1 - movingAverageCoeff;
+    CircularBuffer<float, Size> buffer;
 };
 
 }  // namespace Boardcore
-- 
GitLab