Home | History | Annotate | Download | only in vad
      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.
     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