mirror of
https://github.com/overte-org/overte.git
synced 2025-06-15 05:05:57 +02:00
75 lines
2.1 KiB
C++
75 lines
2.1 KiB
C++
//
|
|
// SimpleMovingAverage.cpp
|
|
// libraries/shared/src
|
|
//
|
|
// Created by Stephen Birarda on 4/18/13.
|
|
// Copyright 2013 High Fidelity, Inc.
|
|
//
|
|
// Distributed under the Apache License, Version 2.0.
|
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
//
|
|
|
|
#include "SimpleMovingAverage.h"
|
|
|
|
#include "SharedUtil.h"
|
|
|
|
SimpleMovingAverage::SimpleMovingAverage(int numSamplesToAverage) :
|
|
_numSamples(0),
|
|
_lastEventTimestamp(0),
|
|
_average(0.0f),
|
|
_eventDeltaAverage(0.0f),
|
|
WEIGHTING(1.0f / numSamplesToAverage),
|
|
ONE_MINUS_WEIGHTING(1 - WEIGHTING) {
|
|
}
|
|
|
|
SimpleMovingAverage::SimpleMovingAverage(const SimpleMovingAverage& other) {
|
|
*this = other;
|
|
}
|
|
|
|
SimpleMovingAverage& SimpleMovingAverage::operator=(const SimpleMovingAverage& other) {
|
|
_numSamples = (int)other._numSamples;
|
|
_lastEventTimestamp = (uint64_t)other._lastEventTimestamp;
|
|
_average = (float)other._average;
|
|
_eventDeltaAverage = (float)other._eventDeltaAverage;
|
|
WEIGHTING = other.WEIGHTING;
|
|
ONE_MINUS_WEIGHTING = other.ONE_MINUS_WEIGHTING;
|
|
return *this;
|
|
}
|
|
|
|
|
|
int SimpleMovingAverage::updateAverage(float sample) {
|
|
if (_numSamples > 0) {
|
|
_average = (ONE_MINUS_WEIGHTING * _average) + (WEIGHTING * sample);
|
|
|
|
float eventDelta = (usecTimestampNow() - _lastEventTimestamp) / 1000000.0f;
|
|
|
|
if (_numSamples > 1) {
|
|
_eventDeltaAverage = (ONE_MINUS_WEIGHTING * _eventDeltaAverage) +
|
|
(WEIGHTING * eventDelta);
|
|
} else {
|
|
_eventDeltaAverage = eventDelta;
|
|
}
|
|
} else {
|
|
_average = sample;
|
|
_eventDeltaAverage = 0;
|
|
}
|
|
|
|
_lastEventTimestamp = usecTimestampNow();
|
|
|
|
return ++_numSamples;
|
|
}
|
|
|
|
void SimpleMovingAverage::reset() {
|
|
_numSamples = 0;
|
|
_average = 0.0f;
|
|
_eventDeltaAverage = 0.0f;
|
|
}
|
|
|
|
float SimpleMovingAverage::getEventDeltaAverage() const {
|
|
return (ONE_MINUS_WEIGHTING * _eventDeltaAverage) +
|
|
(WEIGHTING * ((usecTimestampNow() - _lastEventTimestamp) / 1000000.0f));
|
|
}
|
|
|
|
uint64_t SimpleMovingAverage::getUsecsSinceLastEvent() const {
|
|
return usecTimestampNow() - _lastEventTimestamp;
|
|
}
|