mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 18:42:58 +02:00
add a decay to the event delta average
This commit is contained in:
parent
cf1254f53b
commit
6e540d166b
2 changed files with 19 additions and 14 deletions
|
@ -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());
|
||||||
}
|
}
|
|
@ -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__) */
|
||||||
|
|
Loading…
Reference in a new issue