diff --git a/sdrbase/dsp/movingaverage.h b/sdrbase/dsp/movingaverage.h index dfe284856..6d1199f98 100644 --- a/sdrbase/dsp/movingaverage.h +++ b/sdrbase/dsp/movingaverage.h @@ -1,6 +1,7 @@ #ifndef INCLUDE_MOVINGAVERAGE_H #define INCLUDE_MOVINGAVERAGE_H +#include #include #include "dsp/dsptypes.h" @@ -9,46 +10,54 @@ public: MovingAverage() : m_history(), m_sum(0), - m_ptr(0) + m_index(0) { } MovingAverage(int historySize, Type initial) : m_history(historySize, initial), m_sum((float) historySize * initial), - m_ptr(0) + m_index(0) { } void resize(int historySize, Type initial) { m_history.resize(historySize); - for(size_t i = 0; i < m_history.size(); i++) + + for(size_t i = 0; i < m_history.size(); i++) { m_history[i] = initial; - m_sum = (float) m_history.size() * initial; - m_ptr = 0; + } + + m_sum = (Type) m_history.size() * initial; + m_index = 0; } void feed(Type value) { - m_sum -= m_history[m_ptr]; - m_history[m_ptr] = value; - m_sum += value; - m_ptr++; - if(m_ptr >= m_history.size()) - m_ptr = 0; + Type& oldest = m_history[m_index]; + m_sum += value - oldest; + oldest = value; + + m_index++; + + if(m_index >= m_history.size()) { + m_index = 0; + } } void fill(Type value) { - for(size_t i = 0; i < m_history.size(); i++) + for(size_t i = 0; i < m_history.size(); i++) { m_history[i] = value; - m_sum = (float) m_history.size() * value; + } + + m_sum = (Type) m_history.size() * value; } Type average() const { - return m_sum / (float) m_history.size(); + return m_sum / (Type) m_history.size(); } Type sum() const @@ -59,7 +68,7 @@ public: protected: std::vector m_history; Type m_sum; - uint m_ptr; + uint32_t m_index; }; #endif // INCLUDE_MOVINGAVERAGE_H