| /* | |
| * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | |
| * | |
| * Use of this source code is governed by a BSD-style license | |
| * that can be found in the LICENSE file in the root of the source | |
| * tree. An additional intellectual property rights grant can be found | |
| * in the file PATENTS. All contributing project authors may | |
| * be found in the AUTHORS file in the root of the source tree. | |
| */ | |
| #ifndef MODULES_AUDIO_PROCESSING_AGC_LOUDNESS_HISTOGRAM_H_ | |
| #define MODULES_AUDIO_PROCESSING_AGC_LOUDNESS_HISTOGRAM_H_ | |
| #include <stdint.h> | |
| #include <memory> | |
| namespace webrtc { | |
| // This class implements the histogram of loudness with circular buffers so that | |
| // the histogram tracks the last T seconds of the loudness. | |
| class LoudnessHistogram { | |
| public: | |
| // Create a non-sliding LoudnessHistogram. | |
| static LoudnessHistogram* Create(); | |
| // Create a sliding LoudnessHistogram, i.e. the histogram represents the last | |
| // `window_size` samples. | |
| static LoudnessHistogram* Create(int window_size); | |
| ~LoudnessHistogram(); | |
| // Insert RMS and the corresponding activity probability. | |
| void Update(double rms, double activity_probability); | |
| // Reset the histogram, forget the past. | |
| void Reset(); | |
| // Current loudness, which is actually the mean of histogram in loudness | |
| // domain. | |
| double CurrentRms() const; | |
| // Sum of the histogram content. | |
| double AudioContent() const; | |
| // Number of times the histogram has been updated. | |
| int num_updates() const { return num_updates_; } | |
| private: | |
| LoudnessHistogram(); | |
| explicit LoudnessHistogram(int window); | |
| // Find the histogram bin associated with the given `rms`. | |
| int GetBinIndex(double rms); | |
| void RemoveOldestEntryAndUpdate(); | |
| void InsertNewestEntryAndUpdate(int activity_prob_q10, int hist_index); | |
| void UpdateHist(int activity_prob_q10, int hist_index); | |
| void RemoveTransient(); | |
| // Number of histogram bins. | |
| static const int kHistSize = 77; | |
| // Number of times the histogram is updated | |
| int num_updates_; | |
| // Audio content, this should be equal to the sum of the components of | |
| // `bin_count_q10_`. | |
| int64_t audio_content_q10_; | |
| // LoudnessHistogram of input RMS in Q10 with `kHistSize_` bins. In each | |
| // 'Update(),' we increment the associated histogram-bin with the given | |
| // probability. The increment is implemented in Q10 to avoid rounding errors. | |
| int64_t bin_count_q10_[kHistSize]; | |
| // Circular buffer for probabilities | |
| std::unique_ptr<int[]> activity_probability_; | |
| // Circular buffer for histogram-indices of probabilities. | |
| std::unique_ptr<int[]> hist_bin_index_; | |
| // Current index of circular buffer, where the newest data will be written to, | |
| // therefore, pointing to the oldest data if buffer is full. | |
| int buffer_index_; | |
| // Indicating if buffer is full and we had a wrap around. | |
| int buffer_is_full_; | |
| // Size of circular buffer. | |
| int len_circular_buffer_; | |
| int len_high_activity_; | |
| }; | |
| } // namespace webrtc | |
| #endif // MODULES_AUDIO_PROCESSING_AGC_LOUDNESS_HISTOGRAM_H_ |