blob: 9e22a92fe0860db3b12e398f07bda87be4a09ff0 [file] [log] [blame]
pbos@webrtc.org788acd12014-12-15 09:41:24 +00001/*
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
kwiberg85d8bb02016-02-16 20:39:36 -080014#include <stddef.h>
pbos@webrtc.org788acd12014-12-15 09:41:24 +000015
kwiberg85d8bb02016-02-16 20:39:36 -080016#include <queue>
pbos@webrtc.org788acd12014-12-15 09:41:24 +000017
18namespace 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.
27class 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_