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 "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());
}

View file

@ -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__) */