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 c8465eaff679807de445ad3e6c64862946be82a1..02ca3dcd888cc56afff14b216eeba910721eb180 100644 |
--- a/webrtc/modules/audio_processing/aec3/suppression_gain.cc |
+++ b/webrtc/modules/audio_processing/aec3/suppression_gain.cc |
@@ -25,6 +25,16 @@ |
namespace webrtc { |
namespace { |
+// Reduce gain to avoid narrow band echo leakage. |
+void NarrowBandAttenuation(int narrow_bin, |
+ std::array<float, kFftLengthBy2Plus1>* gain) { |
+ const int upper_bin = |
+ std::min(narrow_bin + 6, static_cast<int>(kFftLengthBy2Plus1 - 1)); |
+ for (int k = std::max(0, narrow_bin - 6); k <= upper_bin; ++k) { |
+ (*gain)[k] = std::min((*gain)[k], 0.001f); |
+ } |
+} |
+ |
// Adjust the gains according to the presence of known external filters. |
void AdjustForExternalFilters(std::array<float, kFftLengthBy2Plus1>* gain) { |
// Limit the low frequency gains to avoid the impact of the high-pass filter |
@@ -45,6 +55,7 @@ void AdjustForExternalFilters(std::array<float, kFftLengthBy2Plus1>* gain) { |
// Computes the gain to apply for the bands beyond the first band. |
float UpperBandsGain( |
+ const RenderSignalAnalyzer& render_signal_analyzer, |
bool saturated_echo, |
const std::vector<std::vector<float>>& render, |
const std::array<float, kFftLengthBy2Plus1>& low_band_gain) { |
@@ -53,6 +64,12 @@ float UpperBandsGain( |
return 1.f; |
} |
+ if (render_signal_analyzer.NarrowPeakBand() && |
ivoc
2017/07/11 11:06:50
I think it makes sense to store this in a temporar
peah-webrtc
2017/07/11 11:54:18
I changed it to a separate input argument. Unfortu
|
+ (*render_signal_analyzer.NarrowPeakBand() > |
+ static_cast<int>(kFftLengthBy2Plus1 - 10))) { |
+ return 0.001f; |
+ } |
+ |
constexpr size_t kLowBandGainLimit = kFftLengthBy2 / 2; |
const float gain_below_8_khz = *std::min_element( |
low_band_gain.begin() + kLowBandGainLimit, low_band_gain.end()); |
@@ -193,6 +210,7 @@ void MaskingPower(const std::array<float, kFftLengthBy2Plus1>& nearend, |
// TODO(peah): Add further optimizations, in particular for the divisions. |
void SuppressionGain::LowerBandGain( |
bool low_noise_render, |
+ const RenderSignalAnalyzer& render_signal_analyzer, |
bool saturated_echo, |
const std::array<float, kFftLengthBy2Plus1>& nearend, |
const std::array<float, kFftLengthBy2Plus1>& echo, |
@@ -238,6 +256,9 @@ void SuppressionGain::LowerBandGain( |
GainToNoAudibleEcho(low_noise_render, saturated_echo, nearend, echo, masker, |
min_gain, max_gain, one_by_echo, gain); |
AdjustForExternalFilters(gain); |
+ if (render_signal_analyzer.NarrowPeakBand()) { |
+ NarrowBandAttenuation(*render_signal_analyzer.NarrowPeakBand(), gain); |
+ } |
} |
// Update the allowed maximum gain increase. |
@@ -263,6 +284,7 @@ void SuppressionGain::GetGain( |
const std::array<float, kFftLengthBy2Plus1>& nearend, |
const std::array<float, kFftLengthBy2Plus1>& echo, |
const std::array<float, kFftLengthBy2Plus1>& comfort_noise, |
+ const RenderSignalAnalyzer& render_signal_analyzer, |
ivoc
2017/07/11 11:06:50
This object is passed around a lot, but it seems l
peah-webrtc
2017/07/11 11:54:18
Good point! I changed the code along that, but as
|
bool saturated_echo, |
const std::vector<std::vector<float>>& render, |
bool force_zero_gain, |
@@ -283,11 +305,12 @@ void SuppressionGain::GetGain( |
bool low_noise_render = low_render_detector_.Detect(render); |
// Compute gain for the lower band. |
- LowerBandGain(low_noise_render, saturated_echo, nearend, echo, comfort_noise, |
- low_band_gain); |
+ LowerBandGain(low_noise_render, render_signal_analyzer, saturated_echo, |
+ nearend, echo, comfort_noise, low_band_gain); |
// Compute the gain for the upper bands. |
- *high_bands_gain = UpperBandsGain(saturated_echo, render, *low_band_gain); |
+ *high_bands_gain = UpperBandsGain(render_signal_analyzer, saturated_echo, |
+ render, *low_band_gain); |
} |
// Detects when the render signal can be considered to have low power and |