Home | History | Annotate | Download | only in transient
      1 /*
      2  *  Copyright (c) 2013 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_MODULES_AUDIO_PROCESSING_TRANSIENT_MOVING_MOMENTS_H_
     12 #define WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_MOVING_MOMENTS_H_
     13 
     14 #include <queue>
     15 
     16 #include "webrtc/base/scoped_ptr.h"
     17 
     18 namespace webrtc {
     19 
     20 // Calculates the first and second moments for each value of a buffer taking
     21 // into account a given number of previous values.
     22 // It preserves its state, so it can be multiple-called.
     23 // TODO(chadan): Implement a function that takes a buffer of first moments and a
     24 // buffer of second moments; and calculates the variances. When needed.
     25 // TODO(chadan): Add functionality to update with a buffer but only output are
     26 // the last values of the moments. When needed.
     27 class MovingMoments {
     28  public:
     29   // Creates a Moving Moments object, that uses the last |length| values
     30   // (including the new value introduced in every new calculation).
     31   explicit MovingMoments(size_t length);
     32   ~MovingMoments();
     33 
     34   // Calculates the new values using |in|. Results will be in the out buffers.
     35   // |first| and |second| must be allocated with at least |in_length|.
     36   void CalculateMoments(const float* in, size_t in_length,
     37                         float* first, float* second);
     38 
     39  private:
     40   size_t length_;
     41   // A queue holding the |length_| latest input values.
     42   std::queue<float> queue_;
     43   // Sum of the values of the queue.
     44   float sum_;
     45   // Sum of the squares of the values of the queue.
     46   float sum_of_squares_;
     47 };
     48 
     49 }  // namespace webrtc
     50 
     51 
     52 #endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_MOVING_MOMENTS_H_
     53