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 16 namespace 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. 24 class VadCircularBuffer { 25 public: 26 static VadCircularBuffer* Create(int buffer_size); 27 ~VadCircularBuffer(); 28 29 // If buffer is wrapped around. is_full()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