diff --git a/libraries/shared/src/SimpleMovingAverage.cpp b/libraries/shared/src/SimpleMovingAverage.cpp index 94ae96f5d2..db433c020f 100644 --- a/libraries/shared/src/SimpleMovingAverage.cpp +++ b/libraries/shared/src/SimpleMovingAverage.cpp @@ -9,26 +9,24 @@ #include "SharedUtil.h" #include "SimpleMovingAverage.h" -SimpleMovingAverage::SimpleMovingAverage(float numSamplesToAverage) : +SimpleMovingAverage::SimpleMovingAverage(int numSamplesToAverage) : _numSamples(0), - _numSamplesToAverage(numSamplesToAverage), _average(0), - _eventDeltaAverage(0) { + _eventDeltaAverage(0), + WEIGHTING(1.0f / numSamplesToAverage), + ONE_MINUS_WEIGHTING(1 - WEIGHTING) { + } int SimpleMovingAverage::updateAverage(float sample) { if (_numSamples > 0) { - - float firstCoefficient = 1 - (1.0f / _numSamplesToAverage); - float secondCoefficient = (1.0f / _numSamplesToAverage); - - _average = (firstCoefficient * _average) + (secondCoefficient * sample); + _average = (ONE_MINUS_WEIGHTING * _average) + (WEIGHTING * sample); float eventDelta = (usecTimestampNow() - _lastEventTimestamp) / 1000000; if (_numSamples > 1) { - _eventDeltaAverage = (firstCoefficient * _eventDeltaAverage) + - (secondCoefficient * eventDelta); + _eventDeltaAverage = (ONE_MINUS_WEIGHTING * _eventDeltaAverage) + + (WEIGHTING * eventDelta); } else { _eventDeltaAverage = eventDelta; } @@ -46,6 +44,11 @@ void SimpleMovingAverage::reset() { _numSamples = 0; } +float SimpleMovingAverage::getEventDeltaAverage() { + return (ONE_MINUS_WEIGHTING * _eventDeltaAverage) + + (WEIGHTING * ((usecTimestampNow() - _lastEventTimestamp) / 1000000)); +} + float SimpleMovingAverage::getAverageSampleValuePerSecond() { - return _average * (1 / _eventDeltaAverage); + return _average * (1 / getEventDeltaAverage()); } \ No newline at end of file diff --git a/libraries/shared/src/SimpleMovingAverage.h b/libraries/shared/src/SimpleMovingAverage.h index e653e89d85..e24b639133 100644 --- a/libraries/shared/src/SimpleMovingAverage.h +++ b/libraries/shared/src/SimpleMovingAverage.h @@ -14,21 +14,23 @@ class SimpleMovingAverage { public: - SimpleMovingAverage(float numSamplesToAverage); + SimpleMovingAverage(int numSamplesToAverage); int updateAverage(float sample); void reset(); int getSampleCount() { return _numSamples; }; float getAverage() { return _average; }; - float getEventDeltaAverage() { return _eventDeltaAverage; }; + float getEventDeltaAverage(); float getAverageSampleValuePerSecond(); private: int _numSamples; - int _numSamplesToAverage; double _lastEventTimestamp; float _average; float _eventDeltaAverage; + + const float WEIGHTING; + const float ONE_MINUS_WEIGHTING; }; #endif /* defined(__hifi__Stats__) */