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