Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(864)

Unified Diff: webrtc/modules/audio_processing/agc/histogram.cc

Issue 2051443002: Change name of files and class in agc/histogram* in order to avoid file-name clash. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Changed name of the Histogram class to reflect what it actually does, and to match the new file name Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/audio_processing/agc/histogram.cc
diff --git a/webrtc/modules/audio_processing/agc/histogram.cc b/webrtc/modules/audio_processing/agc/histogram.cc
deleted file mode 100644
index 5c66727a9f39efa3756c52f00fa49f5fecd2b9f9..0000000000000000000000000000000000000000
--- a/webrtc/modules/audio_processing/agc/histogram.cc
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * 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.
- */
-
-#include "webrtc/modules/audio_processing/agc/histogram.h"
-
-#include <cmath>
-#include <cstring>
-
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-
-static const double kHistBinCenters[] = {
- 7.59621091765857e-02, 9.02036021061016e-02, 1.07115112009343e-01,
- 1.27197217770508e-01, 1.51044347572047e-01, 1.79362373905283e-01,
- 2.12989507320644e-01, 2.52921107370304e-01, 3.00339145144454e-01,
- 3.56647189489147e-01, 4.23511952494003e-01, 5.02912623991786e-01,
- 5.97199455365749e-01, 7.09163326739184e-01, 8.42118356728544e-01,
- 1.00000000000000e+00, 1.18748153630660e+00, 1.41011239906908e+00,
- 1.67448243801153e+00, 1.98841697800836e+00, 2.36120844786349e+00,
- 2.80389143520905e+00, 3.32956930911896e+00, 3.95380207843188e+00,
- 4.69506696634852e+00, 5.57530533426190e+00, 6.62057214370769e+00,
- 7.86180718043869e+00, 9.33575086877358e+00, 1.10860317842269e+01,
- 1.31644580546776e+01, 1.56325508754123e+01, 1.85633655299256e+01,
- 2.20436538184971e+01, 2.61764319021997e+01, 3.10840295702492e+01,
- 3.69117111886792e+01, 4.38319755100383e+01, 5.20496616180135e+01,
- 6.18080121423973e+01, 7.33958732149108e+01, 8.71562442838066e+01,
- 1.03496430860848e+02, 1.22900100720889e+02, 1.45941600416277e+02,
- 1.73302955873365e+02, 2.05794060286978e+02, 2.44376646872353e+02,
- 2.90192756065437e+02, 3.44598539797631e+02, 4.09204403447902e+02,
- 4.85922673669740e+02, 5.77024203055553e+02, 6.85205587130498e+02,
- 8.13668983291589e+02, 9.66216894324125e+02, 1.14736472207740e+03,
- 1.36247442287647e+03, 1.61791322085579e+03, 1.92124207711260e+03,
- 2.28143949334655e+03, 2.70916727454970e+03, 3.21708611729384e+03,
- 3.82023036499473e+03, 4.53645302286906e+03, 5.38695420497926e+03,
- 6.39690865534207e+03, 7.59621091765857e+03, 9.02036021061016e+03,
- 1.07115112009343e+04, 1.27197217770508e+04, 1.51044347572047e+04,
- 1.79362373905283e+04, 2.12989507320644e+04, 2.52921107370304e+04,
- 3.00339145144454e+04, 3.56647189489147e+04};
-
-static const double kProbQDomain = 1024.0;
-// Loudness of -15 dB (smallest expected loudness) in log domain,
-// loudness_db = 13.5 * log10(rms);
-static const double kLogDomainMinBinCenter = -2.57752062648587;
-// Loudness step of 1 dB in log domain
-static const double kLogDomainStepSizeInverse = 5.81954605750359;
-
-static const int kTransientWidthThreshold = 7;
-static const double kLowProbabilityThreshold = 0.2;
-
-static const int kLowProbThresholdQ10 = static_cast<int>(
- kLowProbabilityThreshold * kProbQDomain);
-
-Histogram::Histogram()
- : num_updates_(0),
- audio_content_q10_(0),
- bin_count_q10_(),
- activity_probability_(),
- hist_bin_index_(),
- buffer_index_(0),
- buffer_is_full_(false),
- len_circular_buffer_(0),
- len_high_activity_(0) {
- static_assert(
- kHistSize == sizeof(kHistBinCenters) / sizeof(kHistBinCenters[0]),
- "histogram bin centers incorrect size");
-}
-
-Histogram::Histogram(int window_size)
- : num_updates_(0),
- audio_content_q10_(0),
- bin_count_q10_(),
- activity_probability_(new int[window_size]),
- hist_bin_index_(new int[window_size]),
- buffer_index_(0),
- buffer_is_full_(false),
- len_circular_buffer_(window_size),
- len_high_activity_(0) {}
-
-Histogram::~Histogram() {}
-
-void Histogram::Update(double rms, double activity_probaility) {
- // If circular histogram is activated then remove the oldest entry.
- if (len_circular_buffer_ > 0)
- RemoveOldestEntryAndUpdate();
-
- // Find the corresponding bin.
- int hist_index = GetBinIndex(rms);
- // To Q10 domain.
- int prob_q10 = static_cast<int16_t>(floor(activity_probaility *
- kProbQDomain));
- InsertNewestEntryAndUpdate(prob_q10, hist_index);
-}
-
-// Doing nothing if buffer is not full, yet.
-void Histogram::RemoveOldestEntryAndUpdate() {
- assert(len_circular_buffer_ > 0);
- // Do nothing if circular buffer is not full.
- if (!buffer_is_full_)
- return;
-
- int oldest_prob = activity_probability_[buffer_index_];
- int oldest_hist_index = hist_bin_index_[buffer_index_];
- UpdateHist(-oldest_prob, oldest_hist_index);
-}
-
-void Histogram::RemoveTransient() {
- // Don't expect to be here if high-activity region is longer than
- // |kTransientWidthThreshold| or there has not been any transient.
- assert(len_high_activity_ <= kTransientWidthThreshold);
- int index = (buffer_index_ > 0) ? (buffer_index_ - 1) :
- len_circular_buffer_ - 1;
- while (len_high_activity_ > 0) {
- UpdateHist(-activity_probability_[index], hist_bin_index_[index]);
- activity_probability_[index] = 0;
- index = (index > 0) ? (index - 1) : (len_circular_buffer_ - 1);
- len_high_activity_--;
- }
-}
-
-void Histogram::InsertNewestEntryAndUpdate(int activity_prob_q10,
- int hist_index) {
- // Update the circular buffer if it is enabled.
- if (len_circular_buffer_ > 0) {
- // Removing transient.
- if (activity_prob_q10 <= kLowProbThresholdQ10) {
- // Lower than threshold probability, set it to zero.
- activity_prob_q10 = 0;
- // Check if this has been a transient.
- if (len_high_activity_ <= kTransientWidthThreshold)
- RemoveTransient(); // Remove this transient.
- len_high_activity_ = 0;
- } else if (len_high_activity_ <= kTransientWidthThreshold) {
- len_high_activity_++;
- }
- // Updating the circular buffer.
- activity_probability_[buffer_index_] = activity_prob_q10;
- hist_bin_index_[buffer_index_] = hist_index;
- // Increment the buffer index and check for wrap-around.
- buffer_index_++;
- if (buffer_index_ >= len_circular_buffer_) {
- buffer_index_ = 0;
- buffer_is_full_ = true;
- }
- }
-
- num_updates_++;
- if (num_updates_ < 0)
- num_updates_--;
-
- UpdateHist(activity_prob_q10, hist_index);
-}
-
-void Histogram::UpdateHist(int activity_prob_q10, int hist_index) {
- bin_count_q10_[hist_index] += activity_prob_q10;
- audio_content_q10_ += activity_prob_q10;
-}
-
-double Histogram::AudioContent() const {
- return audio_content_q10_ / kProbQDomain;
-}
-
-Histogram* Histogram::Create() {
- return new Histogram;
-}
-
-Histogram* Histogram::Create(int window_size) {
- if (window_size < 0)
- return NULL;
- return new Histogram(window_size);
-}
-
-void Histogram::Reset() {
- // Reset the histogram, audio-content and number of updates.
- memset(bin_count_q10_, 0, sizeof(bin_count_q10_));
- audio_content_q10_ = 0;
- num_updates_ = 0;
- // Empty the circular buffer.
- buffer_index_ = 0;
- buffer_is_full_ = false;
- len_high_activity_ = 0;
-}
-
-int Histogram::GetBinIndex(double rms) {
- // First exclude overload cases.
- if (rms <= kHistBinCenters[0]) {
- return 0;
- } else if (rms >= kHistBinCenters[kHistSize - 1]) {
- return kHistSize - 1;
- } else {
- // The quantizer is uniform in log domain. Alternatively we could do binary
- // search in linear domain.
- double rms_log = log(rms);
-
- int index = static_cast<int>(floor((rms_log - kLogDomainMinBinCenter) *
- kLogDomainStepSizeInverse));
- // The final decision is in linear domain.
- double b = 0.5 * (kHistBinCenters[index] + kHistBinCenters[index + 1]);
- if (rms > b) {
- return index + 1;
- }
- return index;
- }
-}
-
-double Histogram::CurrentRms() const {
- double p;
- double mean_val = 0;
- if (audio_content_q10_ > 0) {
- double p_total_inverse = 1. / static_cast<double>(audio_content_q10_);
- for (int n = 0; n < kHistSize; n++) {
- p = static_cast<double>(bin_count_q10_[n]) * p_total_inverse;
- mean_val += p * kHistBinCenters[n];
- }
- } else {
- mean_val = kHistBinCenters[0];
- }
- return mean_val;
-}
-
-} // namespace webrtc
« no previous file with comments | « webrtc/modules/audio_processing/agc/histogram.h ('k') | webrtc/modules/audio_processing/agc/histogram_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698