Chromium Code Reviews| 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..64d01b135253ab2f5a616c9c8c75eec2c223ddf6 100644 |
| --- a/webrtc/modules/audio_processing/aec3/suppression_gain.cc |
| +++ b/webrtc/modules/audio_processing/aec3/suppression_gain.cc |
| @@ -107,15 +107,17 @@ float UpperBandsGain( |
| return std::min(gain_below_8_khz, anti_howling_gain); |
| } |
| +} // namespace |
| + |
| // Limits the gain increase. |
| -void UpdateMaxGainIncrease( |
| +void SuppressionGain::UpdateMaxGainIncrease( |
|
hlundin-webrtc
2017/08/23 14:52:22
I think you should avoid littering the h-file with
peah-webrtc
2017/08/24 07:00:52
Good suggestion. That makes sense, I'll do that.
|
| size_t no_saturation_counter, |
| bool low_noise_render, |
| const std::array<float, kFftLengthBy2Plus1>& last_echo, |
| const std::array<float, kFftLengthBy2Plus1>& echo, |
| const std::array<float, kFftLengthBy2Plus1>& last_gain, |
| const std::array<float, kFftLengthBy2Plus1>& new_gain, |
| - std::array<float, kFftLengthBy2Plus1>* gain_increase) { |
| + std::array<float, kFftLengthBy2Plus1>* gain_increase) const { |
| float max_increasing; |
| float max_decreasing; |
| float rate_increasing; |
| @@ -123,27 +125,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) { |
| @@ -162,7 +165,7 @@ void UpdateMaxGainIncrease( |
| } |
| // Computes the gain to reduce the echo to a non audible level. |
| -void GainToNoAudibleEcho( |
| +void SuppressionGain::GainToNoAudibleEcho( |
| bool low_noise_render, |
| bool saturated_echo, |
| const std::array<float, kFftLengthBy2Plus1>& nearend, |
| @@ -171,17 +174,18 @@ void GainToNoAudibleEcho( |
| const std::array<float, kFftLengthBy2Plus1>& min_gain, |
| 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; |
| + std::array<float, kFftLengthBy2Plus1>* gain) const { |
| 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,22 +193,23 @@ void GainToNoAudibleEcho( |
| } |
| // Computes the signal output power that masks the echo signal. |
| -void MaskingPower(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, |
| - std::array<float, kFftLengthBy2Plus1>* masker) { |
| +void SuppressionGain::MaskingPower( |
| + 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, |
| + std::array<float, kFftLengthBy2Plus1>* masker) const { |
| 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]); |
| } |
| } |
| -} // namespace |
| // TODO(peah): Add further optimizations, in particular for the divisions. |
| void SuppressionGain::LowerBandGain( |
| @@ -227,7 +232,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.thresholds.min_echo1 |
| + : config_.param.thresholds.min_echo2; |
| 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 +250,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 |
| @@ -271,8 +280,10 @@ void SuppressionGain::LowerBandGain( |
| 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); |