blob: cfa6977a760f46e7814b6606a2a580db710e2600 [file] [log] [blame]
pbos@webrtc.org788acd12014-12-15 09:41:24 +00001/*
2 * Copyright (c) 2012 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
aluebsecf6b812015-06-25 12:28:48 -070011#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_VAD_VAD_CIRCULAR_BUFFER_H_
12#define WEBRTC_MODULES_AUDIO_PROCESSING_VAD_VAD_CIRCULAR_BUFFER_H_
pbos@webrtc.org788acd12014-12-15 09:41:24 +000013
kwibergdabf07f2016-02-17 07:59:48 -080014#include <memory>
pbos@webrtc.org788acd12014-12-15 09:41:24 +000015
16namespace webrtc {
17
18// A circular buffer tailored to the need of this project. It stores last
19// K samples of the input, and keeps track of the mean of the last samples.
20//
21// It is used in class "PitchBasedActivity" to keep track of posterior
22// probabilities in the past few seconds. The posterior probabilities are used
23// to recursively update prior probabilities.
aluebsecf6b812015-06-25 12:28:48 -070024class VadCircularBuffer {
pbos@webrtc.org788acd12014-12-15 09:41:24 +000025 public:
aluebsecf6b812015-06-25 12:28:48 -070026 static VadCircularBuffer* Create(int buffer_size);
27 ~VadCircularBuffer();
pbos@webrtc.org788acd12014-12-15 09:41:24 +000028
29 // If buffer is wrapped around.
30 bool is_full() const { return is_full_; }
31 // Get the oldest entry in the buffer.
32 double Oldest() const;
33 // Insert new value into the buffer.
34 void Insert(double value);
35 // Reset buffer, forget the past, start fresh.
36 void Reset();
37
38 // The mean value of the elements in the buffer. The return value is zero if
39 // buffer is empty, i.e. no value is inserted.
40 double Mean();
41 // Remove transients. If the values exceed |val_threshold| for a period
42 // shorter then or equal to |width_threshold|, then that period is considered
43 // transient and set to zero.
44 int RemoveTransient(int width_threshold, double val_threshold);
45
46 private:
aluebsecf6b812015-06-25 12:28:48 -070047 explicit VadCircularBuffer(int buffer_size);
pbos@webrtc.org788acd12014-12-15 09:41:24 +000048 // Get previous values. |index = 0| corresponds to the most recent
49 // insertion. |index = 1| is the one before the most recent insertion, and
50 // so on.
51 int Get(int index, double* value) const;
52 // Set a given position to |value|. |index| is interpreted as above.
53 int Set(int index, double value);
54 // Return the number of valid elements in the buffer.
55 int BufferLevel();
56
57 // Convert an index with the interpretation as get() method to the
58 // corresponding linear index.
59 int ConvertToLinearIndex(int* index) const;
60
kwibergdabf07f2016-02-17 07:59:48 -080061 std::unique_ptr<double[]> buffer_;
pbos@webrtc.org788acd12014-12-15 09:41:24 +000062 bool is_full_;
63 int index_;
64 int buffer_size_;
65 double sum_;
66};
67
68} // namespace webrtc
aluebsecf6b812015-06-25 12:28:48 -070069#endif // WEBRTC_MODULES_AUDIO_PROCESSING_VAD_VAD_CIRCULAR_BUFFER_H_