text: /*
   *  Copyright (c) 2013 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.
   */
  
  #ifndef MODULES_AUDIO_PROCESSING_TRANSIENT_MOVING_MOMENTS_H_
  #define MODULES_AUDIO_PROCESSING_TRANSIENT_MOVING_MOMENTS_H_
  
  #include <stddef.h>
  
  #include <queue>
  
  namespace webrtc
  {
  
  // Calculates the first and second moments for each value of a buffer taking
  // into account a given number of previous values.
  // It preserves its state, so it can be multiple-called.
  // TODO(chadan): Implement a function that takes a buffer of first moments and a
  // buffer of second moments; and calculates the variances. When needed.
  // TODO(chadan): Add functionality to update with a buffer but only output are
  // the last values of the moments. When needed.
  class MovingMoments
  {
  public:
      // Creates a Moving Moments object, that uses the last |length| values
      // (including the new value introduced in every new calculation).
      explicit MovingMoments(size_t length);
      ~MovingMoments();
  
      // Calculates the new values using |in|. Results will be in the out buffers.
      // |first| and |second| must be allocated with at least |in_length|.
      void CalculateMoments(const float* in,
          size_t in_length,
          float* first,
          float* second);
  
  private:
      size_t length_;
      // A queue holding the |length_| latest input values.
      std::queue<float> queue_;
      // Sum of the values of the queue.
      float sum_;
      // Sum of the squares of the values of the queue.
      float sum_of_squares_;
  };
  
  } // namespace webrtc
  
  #endif // MODULES_AUDIO_PROCESSING_TRANSIENT_MOVING_MOMENTS_H_
  