Fixed moving average in utils to avoid index overflow

This commit is contained in:
f4exb 2018-02-03 07:17:49 +01:00
parent a171d82e4c
commit bcdaf91288
1 changed files with 6 additions and 4 deletions

View File

@ -29,19 +29,20 @@ class MovingAverageUtil
{ {
public: public:
MovingAverageUtil() MovingAverageUtil()
: m_num_samples(0), m_total(0) : m_num_samples(0), m_index(0), m_total(0)
{ } { }
void operator()(T sample) void operator()(T sample)
{ {
if (m_num_samples < N) if (m_num_samples < N) // fill up
{ {
m_samples[m_num_samples++] = sample; m_samples[m_num_samples++] = sample;
m_total += sample; m_total += sample;
} }
else else // roll
{ {
T& oldest = m_samples[m_num_samples++ % N]; T& oldest = m_samples[m_index];
m_index = (m_index + 1) % N;
m_total += sample - oldest; m_total += sample - oldest;
oldest = sample; oldest = sample;
} }
@ -54,6 +55,7 @@ class MovingAverageUtil
private: private:
T m_samples[N]; T m_samples[N];
int m_num_samples; int m_num_samples;
unsigned int m_index;
Total m_total; Total m_total;
}; };