1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/numerics/moving_average.h" 12*d9f75844SAndroid Build Coastguard Worker 13*d9f75844SAndroid Build Coastguard Worker #include <algorithm> 14*d9f75844SAndroid Build Coastguard Worker 15*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h" 16*d9f75844SAndroid Build Coastguard Worker 17*d9f75844SAndroid Build Coastguard Worker namespace rtc { 18*d9f75844SAndroid Build Coastguard Worker MovingAverage(size_t window_size)19*d9f75844SAndroid Build Coastguard WorkerMovingAverage::MovingAverage(size_t window_size) : history_(window_size, 0) { 20*d9f75844SAndroid Build Coastguard Worker // Limit window size to avoid overflow. 21*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_LE(window_size, (int64_t{1} << 32) - 1); 22*d9f75844SAndroid Build Coastguard Worker } 23*d9f75844SAndroid Build Coastguard Worker MovingAverage::~MovingAverage() = default; 24*d9f75844SAndroid Build Coastguard Worker AddSample(int sample)25*d9f75844SAndroid Build Coastguard Workervoid MovingAverage::AddSample(int sample) { 26*d9f75844SAndroid Build Coastguard Worker count_++; 27*d9f75844SAndroid Build Coastguard Worker size_t index = count_ % history_.size(); 28*d9f75844SAndroid Build Coastguard Worker if (count_ > history_.size()) 29*d9f75844SAndroid Build Coastguard Worker sum_ -= history_[index]; 30*d9f75844SAndroid Build Coastguard Worker sum_ += sample; 31*d9f75844SAndroid Build Coastguard Worker history_[index] = sample; 32*d9f75844SAndroid Build Coastguard Worker } 33*d9f75844SAndroid Build Coastguard Worker GetAverageRoundedDown() const34*d9f75844SAndroid Build Coastguard Workerabsl::optional<int> MovingAverage::GetAverageRoundedDown() const { 35*d9f75844SAndroid Build Coastguard Worker if (count_ == 0) 36*d9f75844SAndroid Build Coastguard Worker return absl::nullopt; 37*d9f75844SAndroid Build Coastguard Worker return sum_ / Size(); 38*d9f75844SAndroid Build Coastguard Worker } 39*d9f75844SAndroid Build Coastguard Worker GetAverageRoundedToClosest() const40*d9f75844SAndroid Build Coastguard Workerabsl::optional<int> MovingAverage::GetAverageRoundedToClosest() const { 41*d9f75844SAndroid Build Coastguard Worker if (count_ == 0) 42*d9f75844SAndroid Build Coastguard Worker return absl::nullopt; 43*d9f75844SAndroid Build Coastguard Worker return (sum_ + Size() / 2) / Size(); 44*d9f75844SAndroid Build Coastguard Worker } 45*d9f75844SAndroid Build Coastguard Worker GetUnroundedAverage() const46*d9f75844SAndroid Build Coastguard Workerabsl::optional<double> MovingAverage::GetUnroundedAverage() const { 47*d9f75844SAndroid Build Coastguard Worker if (count_ == 0) 48*d9f75844SAndroid Build Coastguard Worker return absl::nullopt; 49*d9f75844SAndroid Build Coastguard Worker return sum_ / static_cast<double>(Size()); 50*d9f75844SAndroid Build Coastguard Worker } 51*d9f75844SAndroid Build Coastguard Worker Reset()52*d9f75844SAndroid Build Coastguard Workervoid MovingAverage::Reset() { 53*d9f75844SAndroid Build Coastguard Worker count_ = 0; 54*d9f75844SAndroid Build Coastguard Worker sum_ = 0; 55*d9f75844SAndroid Build Coastguard Worker } 56*d9f75844SAndroid Build Coastguard Worker Size() const57*d9f75844SAndroid Build Coastguard Workersize_t MovingAverage::Size() const { 58*d9f75844SAndroid Build Coastguard Worker return std::min(count_, history_.size()); 59*d9f75844SAndroid Build Coastguard Worker } 60*d9f75844SAndroid Build Coastguard Worker } // namespace rtc 61