tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

limiter_db_gain_curve.h (3021B)


      1 /*
      2 *  Copyright (c) 2018 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 MODULES_AUDIO_PROCESSING_AGC2_LIMITER_DB_GAIN_CURVE_H_
     12 #define MODULES_AUDIO_PROCESSING_AGC2_LIMITER_DB_GAIN_CURVE_H_
     13 
     14 #include <array>
     15 
     16 #include "modules/audio_processing/agc2/agc2_testing_common.h"
     17 
     18 namespace webrtc {
     19 
     20 // A class for computing a limiter gain curve (in dB scale) given a set of
     21 // hard-coded parameters (namely, kLimiterDbGainCurveMaxInputLevelDbFs,
     22 // kLimiterDbGainCurveKneeSmoothnessDb, and
     23 // kLimiterDbGainCurveCompressionRatio). The generated curve consists of four
     24 // regions: identity (linear), knee (quadratic polynomial), compression
     25 // (linear), saturation (linear). The aforementioned constants are used to shape
     26 // the different regions.
     27 class LimiterDbGainCurve {
     28 public:
     29  LimiterDbGainCurve();
     30 
     31  double max_input_level_db() const { return max_input_level_db_; }
     32  double max_input_level_linear() const { return max_input_level_linear_; }
     33  double knee_start_linear() const { return knee_start_linear_; }
     34  double limiter_start_linear() const { return limiter_start_linear_; }
     35 
     36  // These methods can be marked 'constexpr' in C++ 14.
     37  double GetOutputLevelDbfs(double input_level_dbfs) const;
     38  double GetGainLinear(double input_level_linear) const;
     39  double GetGainFirstDerivativeLinear(double x) const;
     40  double GetGainIntegralLinear(double x0, double x1) const;
     41 
     42 private:
     43  double GetKneeRegionOutputLevelDbfs(double input_level_dbfs) const;
     44  double GetCompressorRegionOutputLevelDbfs(double input_level_dbfs) const;
     45 
     46  static constexpr double max_input_level_db_ = test::kLimiterMaxInputLevelDbFs;
     47  static constexpr double knee_smoothness_db_ = test::kLimiterKneeSmoothnessDb;
     48  static constexpr double compression_ratio_ = test::kLimiterCompressionRatio;
     49 
     50  const double max_input_level_linear_;
     51 
     52  // Do not modify signal with level <= knee_start_dbfs_.
     53  const double knee_start_dbfs_;
     54  const double knee_start_linear_;
     55 
     56  // The upper end of the knee region, which is between knee_start_dbfs_ and
     57  // limiter_start_dbfs_.
     58  const double limiter_start_dbfs_;
     59  const double limiter_start_linear_;
     60 
     61  // Coefficients {a, b, c} of the knee region polynomial
     62  // ax^2 + bx + c in the DB scale.
     63  const std::array<double, 3> knee_region_polynomial_;
     64 
     65  // Parameters for the computation of the first derivative of GetGainLinear().
     66  const double gain_curve_limiter_d1_;
     67  const double gain_curve_limiter_d2_;
     68 
     69  // Parameters for the computation of the integral of GetGainLinear().
     70  const double gain_curve_limiter_i1_;
     71  const double gain_curve_limiter_i2_;
     72 };
     73 
     74 }  // namespace webrtc
     75 
     76 #endif  // MODULES_AUDIO_PROCESSING_AGC2_LIMITER_DB_GAIN_CURVE_H_