add a decay to the event delta average

This commit is contained in:
Stephen Birarda 2013-04-18 16:30:38 -07:00
parent cf1254f53b
commit 6e540d166b
2 changed files with 19 additions and 14 deletions

View file

@ -9,26 +9,24 @@
#include "SharedUtil.h" #include "SharedUtil.h"
#include "SimpleMovingAverage.h" #include "SimpleMovingAverage.h"
SimpleMovingAverage::SimpleMovingAverage(float numSamplesToAverage) : SimpleMovingAverage::SimpleMovingAverage(int numSamplesToAverage) :
_numSamples(0), _numSamples(0),
_numSamplesToAverage(numSamplesToAverage),
_average(0), _average(0),
_eventDeltaAverage(0) { _eventDeltaAverage(0),
WEIGHTING(1.0f / numSamplesToAverage),
ONE_MINUS_WEIGHTING(1 - WEIGHTING) {
} }
int SimpleMovingAverage::updateAverage(float sample) { int SimpleMovingAverage::updateAverage(float sample) {
if (_numSamples > 0) { if (_numSamples > 0) {
_average = (ONE_MINUS_WEIGHTING * _average) + (WEIGHTING * sample);
float firstCoefficient = 1 - (1.0f / _numSamplesToAverage);
float secondCoefficient = (1.0f / _numSamplesToAverage);
_average = (firstCoefficient * _average) + (secondCoefficient * sample);
float eventDelta = (usecTimestampNow() - _lastEventTimestamp) / 1000000; float eventDelta = (usecTimestampNow() - _lastEventTimestamp) / 1000000;
if (_numSamples > 1) { if (_numSamples > 1) {
_eventDeltaAverage = (firstCoefficient * _eventDeltaAverage) + _eventDeltaAverage = (ONE_MINUS_WEIGHTING * _eventDeltaAverage) +
(secondCoefficient * eventDelta); (WEIGHTING * eventDelta);
} else { } else {
_eventDeltaAverage = eventDelta; _eventDeltaAverage = eventDelta;
} }
@ -46,6 +44,11 @@ void SimpleMovingAverage::reset() {
_numSamples = 0; _numSamples = 0;
} }
float SimpleMovingAverage::getEventDeltaAverage() {
return (ONE_MINUS_WEIGHTING * _eventDeltaAverage) +
(WEIGHTING * ((usecTimestampNow() - _lastEventTimestamp) / 1000000));
}
float SimpleMovingAverage::getAverageSampleValuePerSecond() { float SimpleMovingAverage::getAverageSampleValuePerSecond() {
return _average * (1 / _eventDeltaAverage); return _average * (1 / getEventDeltaAverage());
} }

View file

@ -14,21 +14,23 @@
class SimpleMovingAverage { class SimpleMovingAverage {
public: public:
SimpleMovingAverage(float numSamplesToAverage); SimpleMovingAverage(int numSamplesToAverage);
int updateAverage(float sample); int updateAverage(float sample);
void reset(); void reset();
int getSampleCount() { return _numSamples; }; int getSampleCount() { return _numSamples; };
float getAverage() { return _average; }; float getAverage() { return _average; };
float getEventDeltaAverage() { return _eventDeltaAverage; }; float getEventDeltaAverage();
float getAverageSampleValuePerSecond(); float getAverageSampleValuePerSecond();
private: private:
int _numSamples; int _numSamples;
int _numSamplesToAverage;
double _lastEventTimestamp; double _lastEventTimestamp;
float _average; float _average;
float _eventDeltaAverage; float _eventDeltaAverage;
const float WEIGHTING;
const float ONE_MINUS_WEIGHTING;
}; };
#endif /* defined(__hifi__Stats__) */ #endif /* defined(__hifi__Stats__) */