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