1/*
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
11#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_VAD_VAD_CIRCULAR_BUFFER_H_
12#define WEBRTC_MODULES_AUDIO_PROCESSING_VAD_VAD_CIRCULAR_BUFFER_H_
13
14#include "webrtc/base/scoped_ptr.h"
15
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.
24class VadCircularBuffer {
25 public:
26  static VadCircularBuffer* Create(int buffer_size);
27  ~VadCircularBuffer();
28
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:
47  explicit VadCircularBuffer(int buffer_size);
48  // 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
61  rtc::scoped_ptr<double[]> buffer_;
62  bool is_full_;
63  int index_;
64  int buffer_size_;
65  double sum_;
66};
67
68}  // namespace webrtc
69#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_VAD_VAD_CIRCULAR_BUFFER_H_
70