12 #ifndef hifi_MovingMinMaxAvg_h
13 #define hifi_MovingMinMaxAvg_h
18 #include "RingBufferHistory.h"
24 : _min(std::numeric_limits<T>::max()),
25 _max(std::numeric_limits<T>::min()),
32 _min = std::numeric_limits<T>::max();
33 _max = std::numeric_limits<T>::min();
39 void update(T sample) {
46 double totalSamples = _samples + 1;
47 _average = _average * ((double)_samples / totalSamples)
48 + (double)sample / totalSamples;
54 void update(
const MinMaxAvg<T>& other) {
55 if (other._min < _min) {
58 if (other._max > _max) {
61 double totalSamples = _samples + other._samples;
62 if (totalSamples > 0) {
63 _average = _average * ((double)_samples / totalSamples)
64 + other._average * ((double)other._samples / totalSamples);
68 _samples += other._samples;
71 T getMin()
const {
return _min; }
72 T getMax()
const {
return _max; }
73 double getAverage()
const {
return _average; }
74 int getSamples()
const {
return _samples; }
75 double getSum()
const {
return _samples * _average; }
76 T getLast()
const {
return _last; }
87 class MovingMinMaxAvg {
100 MovingMinMaxAvg(
int intervalLength,
int windowIntervals)
101 : _intervalLength(intervalLength),
102 _windowIntervals(windowIntervals),
105 _currentIntervalStats(),
106 _intervalStats(windowIntervals),
107 _newStatsAvailable(false)
111 _overallStats.reset();
112 _windowStats.reset();
113 _currentIntervalStats.reset();
114 _intervalStats.clear();
115 _newStatsAvailable =
false;
118 void setWindowIntervals(
int windowIntervals) {
119 _windowIntervals = windowIntervals;
120 _overallStats.reset();
121 _windowStats.reset();
122 _currentIntervalStats.reset();
123 _intervalStats.setCapacity(_windowIntervals);
124 _newStatsAvailable =
false;
127 void update(T newSample) {
129 _overallStats.update(newSample);
132 _currentIntervalStats.update(newSample);
136 if (_currentIntervalStats.getSamples() == _intervalLength) {
137 currentIntervalComplete();
143 void currentIntervalComplete() {
145 _intervalStats.insert(_currentIntervalStats);
146 _currentIntervalStats.reset();
149 typename RingBufferHistory< MinMaxAvg<T> >::Iterator i = _intervalStats.begin();
150 typename RingBufferHistory< MinMaxAvg<T> >::Iterator end = _intervalStats.end();
151 _windowStats.reset();
153 _windowStats.update(*i);
157 _newStatsAvailable =
true;
160 bool getNewStatsAvailableFlag()
const {
return _newStatsAvailable; }
161 void clearNewStatsAvailableFlag() { _newStatsAvailable =
false; }
163 T getMin()
const {
return _overallStats.getMin(); }
164 T getMax()
const {
return _overallStats.getMax(); }
165 double getAverage()
const {
return _overallStats.getAverage(); }
166 int getSamples()
const {
return _overallStats.getSamples(); }
167 double getSum()
const {
return _overallStats.getSum(); }
169 T getWindowMin()
const {
return _windowStats.getMin(); }
170 T getWindowMax()
const {
return _windowStats.getMax(); }
171 double getWindowAverage()
const {
return _windowStats.getAverage(); }
172 int getWindowSamples()
const {
return _windowStats.getSamples(); }
173 double getWindowSum()
const {
return _windowStats.getSum(); }
175 int getWindowIntervals()
const {
return _windowIntervals; }
176 T getCurrentIntervalMin()
const {
return _currentIntervalStats.getMin(); }
177 T getCurrentIntervalMax()
const {
return _currentIntervalStats.getMax(); }
178 double getCurrentIntervalAverage()
const {
return _currentIntervalStats.getAverage(); }
179 int getCurrentIntervalSamples()
const {
return _currentIntervalStats.getSamples(); }
180 double getCurrentIntervalSum()
const {
return _currentIntervalStats.getSum(); }
181 T getCurrentIntervalLastSample()
const {
return _currentIntervalStats.getLast(); }
183 const MinMaxAvg<T>& getOverallStats()
const{
return _overallStats; }
184 const MinMaxAvg<T>& getWindowStats()
const{
return _windowStats; }
185 const MinMaxAvg<T>& getCurrentIntervalStats()
const {
return _currentIntervalStats; }
187 MinMaxAvg<T> getLastCompleteIntervalStats()
const {
188 const MinMaxAvg<T>* stats = _intervalStats.getNewestEntry();
189 return stats == NULL ? MinMaxAvg<T>() : *stats;
192 bool isWindowFilled()
const {
return _intervalStats.isFilled(); }
196 int _windowIntervals;
199 MinMaxAvg<T> _overallStats;
202 MinMaxAvg<T> _windowStats;
205 MinMaxAvg<T> _currentIntervalStats;
208 RingBufferHistory< MinMaxAvg<T> > _intervalStats;
210 bool _newStatsAvailable;