AGC2 component that computes and applies the digital gain. The gain is computed from an estimated speech and noise level. This component decides how fast the gain can change and what it should be. Bug: webrtc:7494 Change-Id: If55b6e5c765f958e433730cd9e3b2b93c14a7910 Reviewed-on: https://webrtc-review.googlesource.com/64985 Commit-Queue: Alex Loiko <aleloi@webrtc.org> Reviewed-by: Alessio Bazzica <alessiob@webrtc.org> Cr-Commit-Position: refs/heads/master@{#22741}
84 lines
3.1 KiB
C++
84 lines
3.1 KiB
C++
/*
|
|
* Copyright (c) 2018 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_AGC2_AGC2_COMMON_H_
|
|
#define MODULES_AUDIO_PROCESSING_AGC2_AGC2_COMMON_H_
|
|
|
|
#include <cmath>
|
|
|
|
#include "rtc_base/basictypes.h"
|
|
|
|
namespace webrtc {
|
|
|
|
constexpr float kMinFloatS16Value = -32768.f;
|
|
constexpr float kMaxFloatS16Value = 32767.f;
|
|
constexpr float kMaxAbsFloatS16Value = 32768.0f;
|
|
|
|
constexpr size_t kFrameDurationMs = 10;
|
|
constexpr size_t kSubFramesInFrame = 20;
|
|
constexpr size_t kMaximalNumberOfSamplesPerChannel = 480;
|
|
|
|
constexpr float kAttackFilterConstant = 0.f;
|
|
|
|
// Adaptive digital gain applier settings below.
|
|
constexpr float kMaxGainChangePerSecondDb = 3.f;
|
|
constexpr float kMaxGainChangePerFrameDb =
|
|
kMaxGainChangePerSecondDb * kFrameDurationMs / 1000.f;
|
|
constexpr float kHeadroomDbfs = 1.f;
|
|
constexpr float kMaxGainDb = 30.f;
|
|
|
|
// This parameter must be tuned together with the noise estimator.
|
|
constexpr float kMaxNoiseLevelDbfs = -50.f;
|
|
|
|
// Used in the Level Estimator for deciding when to update the speech
|
|
// level estimate. Also used in the adaptive digital gain applier to
|
|
// decide when to allow target gain reduction.
|
|
constexpr float kVadConfidenceThreshold = 0.9f;
|
|
|
|
// The amount of 'memory' of the Level Estimator. Decides leak factors.
|
|
constexpr size_t kFullBufferSizeMs = 1000;
|
|
constexpr float kFullBufferLeakFactor = 1.f - 1.f / kFullBufferSizeMs;
|
|
|
|
constexpr float kInitialSpeechLevelEstimateDbfs = -30.f;
|
|
|
|
// Saturation Protector settings.
|
|
constexpr float kInitialSaturationMarginDb = 17.f;
|
|
|
|
constexpr size_t kPeakEnveloperSuperFrameLengthMs = 500;
|
|
|
|
constexpr size_t kPeakEnveloperBufferSize =
|
|
kFullBufferSizeMs / kPeakEnveloperSuperFrameLengthMs + 1;
|
|
|
|
// This value is 10 ** (-1/20 * frame_size_ms / satproc_attack_ms),
|
|
// where satproc_attack_ms is 5000.
|
|
constexpr float kSaturationProtectorAttackConstant = 0.9988493699365052f;
|
|
|
|
// This value is 10 ** (-1/20 * frame_size_ms / satproc_decay_ms),
|
|
// where satproc_decay_ms is 1000.
|
|
constexpr float kSaturationProtectorDecayConstant = 0.9997697679981565f;
|
|
|
|
// This is computed from kDecayMs by
|
|
// 10 ** (-1/20 * subframe_duration / kDecayMs).
|
|
// |subframe_duration| is |kFrameDurationMs / kSubFramesInFrame|.
|
|
// kDecayMs is defined in agc2_testing_common.h
|
|
constexpr float kDecayFilterConstant = 0.9998848773724686f;
|
|
|
|
// Number of interpolation points for each region of the limiter.
|
|
// These values have been tuned to limit the interpolated gain curve error given
|
|
// the limiter parameters and allowing a maximum error of +/- 32768^-1.
|
|
constexpr size_t kInterpolatedGainCurveKneePoints = 22;
|
|
constexpr size_t kInterpolatedGainCurveBeyondKneePoints = 10;
|
|
constexpr size_t kInterpolatedGainCurveTotalPoints =
|
|
kInterpolatedGainCurveKneePoints + kInterpolatedGainCurveBeyondKneePoints;
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // MODULES_AUDIO_PROCESSING_AGC2_AGC2_COMMON_H_
|