|  | /* | 
|  | *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #include "modules/audio_processing/echo_detector/moving_max.h" | 
|  |  | 
|  | #include "rtc_base/checks.h" | 
|  |  | 
|  | namespace webrtc { | 
|  | namespace { | 
|  |  | 
|  | // Parameter for controlling how fast the estimated maximum decays after the | 
|  | // previous maximum is no longer valid. With a value of 0.99, the maximum will | 
|  | // decay to 1% of its former value after 460 updates. | 
|  | constexpr float kDecayFactor = 0.99f; | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | MovingMax::MovingMax(size_t window_size) : window_size_(window_size) { | 
|  | RTC_DCHECK_GT(window_size, 0); | 
|  | } | 
|  |  | 
|  | MovingMax::~MovingMax() {} | 
|  |  | 
|  | void MovingMax::Update(float value) { | 
|  | if (counter_ >= window_size_ - 1) { | 
|  | max_value_ *= kDecayFactor; | 
|  | } else { | 
|  | ++counter_; | 
|  | } | 
|  | if (value > max_value_) { | 
|  | max_value_ = value; | 
|  | counter_ = 0; | 
|  | } | 
|  | } | 
|  |  | 
|  | float MovingMax::max() const { | 
|  | return max_value_; | 
|  | } | 
|  |  | 
|  | void MovingMax::Clear() { | 
|  | max_value_ = 0.f; | 
|  | counter_ = 0; | 
|  | } | 
|  |  | 
|  | }  // namespace webrtc |