1 /* 2 * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef RTC_BASE_NUMERICS_MOVING_AVERAGE_H_ 12 #define RTC_BASE_NUMERICS_MOVING_AVERAGE_H_ 13 14 #include <stddef.h> 15 #include <stdint.h> 16 17 #include <vector> 18 19 #include "absl/types/optional.h" 20 21 namespace rtc { 22 23 // Calculates average over fixed size window. If there are less than window 24 // size elements, calculates average of all inserted so far elements. 25 // 26 class MovingAverage { 27 public: 28 // Maximum supported window size is 2^32 - 1. 29 explicit MovingAverage(size_t window_size); 30 ~MovingAverage(); 31 // MovingAverage is neither copyable nor movable. 32 MovingAverage(const MovingAverage&) = delete; 33 MovingAverage& operator=(const MovingAverage&) = delete; 34 35 // Adds new sample. If the window is full, the oldest element is pushed out. 36 void AddSample(int sample); 37 38 // Returns rounded down average of last |window_size| elements or all 39 // elements if there are not enough of them. Returns nullopt if there were 40 // no elements added. 41 absl::optional<int> GetAverageRoundedDown() const; 42 43 // Same as above but rounded to the closest integer. 44 absl::optional<int> GetAverageRoundedToClosest() const; 45 46 // Returns unrounded average over the window. 47 absl::optional<double> GetUnroundedAverage() const; 48 49 // Resets to the initial state before any elements were added. 50 void Reset(); 51 52 // Returns number of elements in the window. 53 size_t Size() const; 54 55 private: 56 // Total number of samples added to the class since last reset. 57 size_t count_ = 0; 58 // Sum of the samples in the moving window. 59 int64_t sum_ = 0; 60 // Circular buffer for all the samples in the moving window. 61 // Size is always |window_size| 62 std::vector<int> history_; 63 }; 64 65 } // namespace rtc 66 #endif // RTC_BASE_NUMERICS_MOVING_AVERAGE_H_ 67