Added further ability to adjust the filter adaptation in AEC3

Bug: webrtc:8609
Change-Id: I079935bd782afc89146d98fd2248a1c6389871c9
Reviewed-on: https://webrtc-review.googlesource.com/32420
Commit-Queue: Gustaf Ullberg <gustaf@webrtc.org>
Reviewed-by: Gustaf Ullberg <gustaf@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#21268}
This commit is contained in:
Per Åhgren
2017-12-12 22:49:41 +01:00
committed by Commit Bot
parent 26246cac66
commit b6f9e6c979
5 changed files with 18 additions and 11 deletions

View File

@ -30,12 +30,14 @@ int MainFilterUpdateGain::instance_count_ = 0;
MainFilterUpdateGain::MainFilterUpdateGain(float leakage_converged,
float leakage_diverged,
float noise_gate_power)
float noise_gate_power,
float error_floor)
: data_dumper_(
new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
leakage_converged_(leakage_converged),
leakage_diverged_(leakage_diverged),
noise_gate_power_(noise_gate_power),
error_floor_(error_floor),
poor_excitation_counter_(kPoorExcitationCounterInitial) {
H_error_.fill(kHErrorInitial);
}
@ -113,8 +115,9 @@ void MainFilterUpdateGain::Compute(
std::transform(erl.begin(), erl.end(), H_error_increase.begin(),
H_error_increase.begin(), std::multiplies<float>());
std::transform(H_error_.begin(), H_error_.end(), H_error_increase.begin(),
H_error_.begin(),
[&](float a, float b) { return std::max(a + b, 0.1f); });
H_error_.begin(), [&](float a, float b) {
return std::max(a + b, error_floor_);
});
data_dumper_->DumpRaw("aec3_main_gain_H_error", H_error_);
}

View File

@ -30,7 +30,8 @@ class MainFilterUpdateGain {
public:
MainFilterUpdateGain(float leakage_converged,
float leakage_diverged,
float noise_gate_power);
float noise_gate_power,
float error_floor);
~MainFilterUpdateGain();
// Takes action in the case of a known echo path change.
@ -50,6 +51,7 @@ class MainFilterUpdateGain {
const float leakage_converged_;
const float leakage_diverged_;
const float noise_gate_power_;
const float error_floor_;
std::array<float, kFftLengthBy2Plus1> H_error_;
size_t poor_excitation_counter_;
size_t call_counter_ = 0;

View File

@ -52,9 +52,9 @@ void RunFilterUpdateTest(int num_blocks_to_process,
x_old.fill(0.f);
ShadowFilterUpdateGain shadow_gain(config.filter.shadow_rate,
config.filter.shadow_noise_gate);
MainFilterUpdateGain main_gain(config.filter.leakage_converged,
config.filter.leakage_diverged,
config.filter.main_noise_gate);
MainFilterUpdateGain main_gain(
config.filter.leakage_converged, config.filter.leakage_diverged,
config.filter.main_noise_gate, config.filter.error_floor);
Random random_generator(42U);
std::vector<std::vector<float>> x(3, std::vector<float>(kBlockSize, 0.f));
std::vector<float> y(kBlockSize, 0.f);
@ -193,9 +193,9 @@ TEST(MainFilterUpdateGain, NullDataOutputGain) {
RenderDelayBuffer::Create(config, 3));
RenderSignalAnalyzer analyzer;
SubtractorOutput output;
MainFilterUpdateGain gain(config.filter.leakage_converged,
config.filter.leakage_diverged,
config.filter.main_noise_gate);
MainFilterUpdateGain gain(
config.filter.leakage_converged, config.filter.leakage_diverged,
config.filter.main_noise_gate, config.filter.error_floor);
EXPECT_DEATH(gain.Compute(*render_delay_buffer->GetRenderBuffer(), analyzer,
output, filter, false, nullptr),
"");

View File

@ -55,7 +55,8 @@ Subtractor::Subtractor(const EchoCanceller3Config& config,
shadow_filter_(config.filter.length_blocks, optimization, data_dumper_),
G_main_(config.filter.leakage_converged,
config.filter.leakage_diverged,
config.filter.main_noise_gate),
config.filter.main_noise_gate,
config.filter.error_floor),
G_shadow_(config.filter.shadow_rate, config.filter.shadow_noise_gate) {
RTC_DCHECK(data_dumper_);
}

View File

@ -1165,6 +1165,7 @@ struct EchoCanceller3Config {
float shadow_rate = 0.5f;
float leakage_converged = 0.01f;
float leakage_diverged = 1.f / 60.f;
float error_floor = 0.1f;
float main_noise_gate = 220075344.f;
float shadow_noise_gate = 220075344.f;
} filter;