| Index: webrtc/modules/audio_processing/aec3/suppression_gain.cc
|
| diff --git a/webrtc/modules/audio_processing/aec3/suppression_gain.cc b/webrtc/modules/audio_processing/aec3/suppression_gain.cc
|
| index a25f748edcced09b3c19496a401e400ba71119d1..8e78967e5c7c8165032fb9062bde93a1721ce35d 100644
|
| --- a/webrtc/modules/audio_processing/aec3/suppression_gain.cc
|
| +++ b/webrtc/modules/audio_processing/aec3/suppression_gain.cc
|
| @@ -109,6 +109,7 @@ float UpperBandsGain(
|
|
|
| // Limits the gain increase.
|
| void UpdateMaxGainIncrease(
|
| + const AudioProcessing::Config::EchoCanceller3& config,
|
| size_t no_saturation_counter,
|
| bool low_noise_render,
|
| const std::array<float, kFftLengthBy2Plus1>& last_echo,
|
| @@ -123,27 +124,28 @@ void UpdateMaxGainIncrease(
|
| float min_increasing;
|
| float min_decreasing;
|
|
|
| + auto& param = config.param.gain_updates;
|
| if (low_noise_render) {
|
| - max_increasing = 8.f;
|
| - max_decreasing = 8.f;
|
| - rate_increasing = 2.f;
|
| - rate_decreasing = 2.f;
|
| - min_increasing = 4.f;
|
| - min_decreasing = 4.f;
|
| + max_increasing = param.low_noise.max_inc;
|
| + max_decreasing = param.low_noise.max_dec;
|
| + rate_increasing = param.low_noise.rate_inc;
|
| + rate_decreasing = param.low_noise.rate_dec;
|
| + min_increasing = param.low_noise.min_inc;
|
| + min_decreasing = param.low_noise.min_dec;
|
| } else if (no_saturation_counter > 10) {
|
| - max_increasing = 4.f;
|
| - max_decreasing = 4.f;
|
| - rate_increasing = 2.f;
|
| - rate_decreasing = 2.f;
|
| - min_increasing = 1.2f;
|
| - min_decreasing = 2.f;
|
| + max_increasing = param.normal.max_inc;
|
| + max_decreasing = param.normal.max_dec;
|
| + rate_increasing = param.normal.rate_inc;
|
| + rate_decreasing = param.normal.rate_dec;
|
| + min_increasing = param.normal.min_inc;
|
| + min_decreasing = param.normal.min_dec;
|
| } else {
|
| - max_increasing = 1.2f;
|
| - max_decreasing = 1.2f;
|
| - rate_increasing = 1.5f;
|
| - rate_decreasing = 1.5f;
|
| - min_increasing = 1.f;
|
| - min_decreasing = 1.f;
|
| + max_increasing = param.saturation.max_inc;
|
| + max_decreasing = param.saturation.max_dec;
|
| + rate_increasing = param.saturation.rate_inc;
|
| + rate_decreasing = param.saturation.rate_dec;
|
| + min_increasing = param.saturation.min_inc;
|
| + min_decreasing = param.saturation.min_dec;
|
| }
|
|
|
| for (size_t k = 0; k < new_gain.size(); ++k) {
|
| @@ -163,6 +165,7 @@ void UpdateMaxGainIncrease(
|
|
|
| // Computes the gain to reduce the echo to a non audible level.
|
| void GainToNoAudibleEcho(
|
| + const AudioProcessing::Config::EchoCanceller3& config,
|
| bool low_noise_render,
|
| bool saturated_echo,
|
| const std::array<float, kFftLengthBy2Plus1>& nearend,
|
| @@ -172,16 +175,17 @@ void GainToNoAudibleEcho(
|
| const std::array<float, kFftLengthBy2Plus1>& max_gain,
|
| const std::array<float, kFftLengthBy2Plus1>& one_by_echo,
|
| std::array<float, kFftLengthBy2Plus1>* gain) {
|
| - constexpr float kEchoMaskingMargin = 1.f / 100.f;
|
| const float nearend_masking_margin =
|
| - low_noise_render ? 0.1f : (saturated_echo ? 0.001f : 0.01f);
|
| + low_noise_render ? 0.1f
|
| + : (saturated_echo ? config.param.gain_mask.m2
|
| + : config.param.gain_mask.m3);
|
|
|
| for (size_t k = 0; k < gain->size(); ++k) {
|
| RTC_DCHECK_LE(0.f, nearend_masking_margin * nearend[k]);
|
| if (echo[k] <= nearend_masking_margin * nearend[k]) {
|
| (*gain)[k] = 1.f;
|
| } else {
|
| - (*gain)[k] = kEchoMaskingMargin * masker[k] * one_by_echo[k];
|
| + (*gain)[k] = config.param.gain_mask.m1 * masker[k] * one_by_echo[k];
|
| }
|
|
|
| (*gain)[k] = std::min(std::max((*gain)[k], min_gain[k]), max_gain[k]);
|
| @@ -189,7 +193,8 @@ void GainToNoAudibleEcho(
|
| }
|
|
|
| // Computes the signal output power that masks the echo signal.
|
| -void MaskingPower(const std::array<float, kFftLengthBy2Plus1>& nearend,
|
| +void MaskingPower(const AudioProcessing::Config::EchoCanceller3& config,
|
| + const std::array<float, kFftLengthBy2Plus1>& nearend,
|
| const std::array<float, kFftLengthBy2Plus1>& comfort_noise,
|
| const std::array<float, kFftLengthBy2Plus1>& last_masker,
|
| const std::array<float, kFftLengthBy2Plus1>& gain,
|
| @@ -197,7 +202,8 @@ void MaskingPower(const std::array<float, kFftLengthBy2Plus1>& nearend,
|
| std::array<float, kFftLengthBy2Plus1> side_band_masker;
|
| for (size_t k = 0; k < gain.size(); ++k) {
|
| side_band_masker[k] = nearend[k] * gain[k] + comfort_noise[k];
|
| - (*masker)[k] = comfort_noise[k] + 0.1f * last_masker[k];
|
| + (*masker)[k] =
|
| + comfort_noise[k] + config.param.gain_mask.m4 * last_masker[k];
|
| }
|
| for (size_t k = 1; k < gain.size() - 1; ++k) {
|
| (*masker)[k] += 0.1f * (side_band_masker[k - 1] + side_band_masker[k + 1]);
|
| @@ -227,7 +233,9 @@ void SuppressionGain::LowerBandGain(
|
| // Compute the minimum gain as the attenuating gain to put the signal just
|
| // above the zero sample values.
|
| std::array<float, kFftLengthBy2Plus1> min_gain;
|
| - const float min_echo_power = low_noise_render ? 192.f : 64.f;
|
| + const float min_echo_power =
|
| + low_noise_render ? config_.param.echo_audibility.low_render_limit
|
| + : config_.param.echo_audibility.normal_render_limit;
|
| if (no_saturation_counter_ > 10) {
|
| for (size_t k = 0; k < nearend.size(); ++k) {
|
| const float denom = std::min(nearend[k], echo[k]);
|
| @@ -243,7 +251,9 @@ void SuppressionGain::LowerBandGain(
|
| std::array<float, kFftLengthBy2Plus1> max_gain;
|
| for (size_t k = 0; k < gain->size(); ++k) {
|
| max_gain[k] =
|
| - std::min(std::max(last_gain_[k] * gain_increase_[k], 0.001f), 1.f);
|
| + std::min(std::max(last_gain_[k] * gain_increase_[k],
|
| + config_.param.gain_updates.floor_first_increase),
|
| + 1.f);
|
| }
|
|
|
| // Iteratively compute the gain required to attenuate the echo to a non
|
| @@ -251,9 +261,9 @@ void SuppressionGain::LowerBandGain(
|
| gain->fill(0.f);
|
| for (int k = 0; k < 2; ++k) {
|
| std::array<float, kFftLengthBy2Plus1> masker;
|
| - MaskingPower(nearend, comfort_noise, last_masker_, *gain, &masker);
|
| - GainToNoAudibleEcho(low_noise_render, saturated_echo, nearend, echo, masker,
|
| - min_gain, max_gain, one_by_echo, gain);
|
| + MaskingPower(config_, nearend, comfort_noise, last_masker_, *gain, &masker);
|
| + GainToNoAudibleEcho(config_, low_noise_render, saturated_echo, nearend,
|
| + echo, masker, min_gain, max_gain, one_by_echo, gain);
|
| AdjustForExternalFilters(gain);
|
| if (narrow_peak_band) {
|
| NarrowBandAttenuation(*narrow_peak_band, gain);
|
| @@ -261,18 +271,21 @@ void SuppressionGain::LowerBandGain(
|
| }
|
|
|
| // Update the allowed maximum gain increase.
|
| - UpdateMaxGainIncrease(no_saturation_counter_, low_noise_render, last_echo_,
|
| - echo, last_gain_, *gain, &gain_increase_);
|
| + UpdateMaxGainIncrease(config_, no_saturation_counter_, low_noise_render,
|
| + last_echo_, echo, last_gain_, *gain, &gain_increase_);
|
|
|
| // Store data required for the gain computation of the next block.
|
| std::copy(echo.begin(), echo.end(), last_echo_.begin());
|
| std::copy(gain->begin(), gain->end(), last_gain_.begin());
|
| - MaskingPower(nearend, comfort_noise, last_masker_, *gain, &last_masker_);
|
| + MaskingPower(config_, nearend, comfort_noise, last_masker_, *gain,
|
| + &last_masker_);
|
| aec3::VectorMath(optimization_).Sqrt(*gain);
|
| }
|
|
|
| -SuppressionGain::SuppressionGain(Aec3Optimization optimization)
|
| - : optimization_(optimization) {
|
| +SuppressionGain::SuppressionGain(
|
| + const AudioProcessing::Config::EchoCanceller3& config,
|
| + Aec3Optimization optimization)
|
| + : optimization_(optimization), config_(config) {
|
| last_gain_.fill(1.f);
|
| last_masker_.fill(0.f);
|
| gain_increase_.fill(1.f);
|
|
|