Home | History | Annotate | Download | only in base
      1 /*
      2  *  Copyright (c) 2011 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 WEBRTC_BASE_EXP_FILTER_H_
     12 #define WEBRTC_BASE_EXP_FILTER_H_
     13 
     14 namespace rtc {
     15 
     16 // This class can be used, for example, for smoothing the result of bandwidth
     17 // estimation and packet loss estimation.
     18 
     19 class ExpFilter {
     20  public:
     21   static const float kValueUndefined;
     22 
     23   explicit ExpFilter(float alpha, float max = kValueUndefined)
     24       : max_(max) {
     25     Reset(alpha);
     26   }
     27 
     28   // Resets the filter to its initial state, and resets filter factor base to
     29   // the given value |alpha|.
     30   void Reset(float alpha);
     31 
     32   // Applies the filter with a given exponent on the provided sample:
     33   // y(k) = min(alpha_^ exp * y(k-1) + (1 - alpha_^ exp) * sample, max_).
     34   float Apply(float exp, float sample);
     35 
     36   // Returns current filtered value.
     37   float filtered() const { return filtered_; }
     38 
     39   // Changes the filter factor base to the given value |alpha|.
     40   void UpdateBase(float alpha);
     41 
     42  private:
     43   float alpha_;  // Filter factor base.
     44   float filtered_;  // Current filter output.
     45   const float max_;
     46 };
     47 }  // namespace rtc
     48 
     49 #endif  // WEBRTC_BASE_EXP_FILTER_H_
     50