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:
@ -30,12 +30,14 @@ int MainFilterUpdateGain::instance_count_ = 0;
|
|||||||
|
|
||||||
MainFilterUpdateGain::MainFilterUpdateGain(float leakage_converged,
|
MainFilterUpdateGain::MainFilterUpdateGain(float leakage_converged,
|
||||||
float leakage_diverged,
|
float leakage_diverged,
|
||||||
float noise_gate_power)
|
float noise_gate_power,
|
||||||
|
float error_floor)
|
||||||
: data_dumper_(
|
: data_dumper_(
|
||||||
new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
|
new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
|
||||||
leakage_converged_(leakage_converged),
|
leakage_converged_(leakage_converged),
|
||||||
leakage_diverged_(leakage_diverged),
|
leakage_diverged_(leakage_diverged),
|
||||||
noise_gate_power_(noise_gate_power),
|
noise_gate_power_(noise_gate_power),
|
||||||
|
error_floor_(error_floor),
|
||||||
poor_excitation_counter_(kPoorExcitationCounterInitial) {
|
poor_excitation_counter_(kPoorExcitationCounterInitial) {
|
||||||
H_error_.fill(kHErrorInitial);
|
H_error_.fill(kHErrorInitial);
|
||||||
}
|
}
|
||||||
@ -113,8 +115,9 @@ void MainFilterUpdateGain::Compute(
|
|||||||
std::transform(erl.begin(), erl.end(), H_error_increase.begin(),
|
std::transform(erl.begin(), erl.end(), H_error_increase.begin(),
|
||||||
H_error_increase.begin(), std::multiplies<float>());
|
H_error_increase.begin(), std::multiplies<float>());
|
||||||
std::transform(H_error_.begin(), H_error_.end(), H_error_increase.begin(),
|
std::transform(H_error_.begin(), H_error_.end(), H_error_increase.begin(),
|
||||||
H_error_.begin(),
|
H_error_.begin(), [&](float a, float b) {
|
||||||
[&](float a, float b) { return std::max(a + b, 0.1f); });
|
return std::max(a + b, error_floor_);
|
||||||
|
});
|
||||||
|
|
||||||
data_dumper_->DumpRaw("aec3_main_gain_H_error", H_error_);
|
data_dumper_->DumpRaw("aec3_main_gain_H_error", H_error_);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,7 +30,8 @@ class MainFilterUpdateGain {
|
|||||||
public:
|
public:
|
||||||
MainFilterUpdateGain(float leakage_converged,
|
MainFilterUpdateGain(float leakage_converged,
|
||||||
float leakage_diverged,
|
float leakage_diverged,
|
||||||
float noise_gate_power);
|
float noise_gate_power,
|
||||||
|
float error_floor);
|
||||||
~MainFilterUpdateGain();
|
~MainFilterUpdateGain();
|
||||||
|
|
||||||
// Takes action in the case of a known echo path change.
|
// Takes action in the case of a known echo path change.
|
||||||
@ -50,6 +51,7 @@ class MainFilterUpdateGain {
|
|||||||
const float leakage_converged_;
|
const float leakage_converged_;
|
||||||
const float leakage_diverged_;
|
const float leakage_diverged_;
|
||||||
const float noise_gate_power_;
|
const float noise_gate_power_;
|
||||||
|
const float error_floor_;
|
||||||
std::array<float, kFftLengthBy2Plus1> H_error_;
|
std::array<float, kFftLengthBy2Plus1> H_error_;
|
||||||
size_t poor_excitation_counter_;
|
size_t poor_excitation_counter_;
|
||||||
size_t call_counter_ = 0;
|
size_t call_counter_ = 0;
|
||||||
|
|||||||
@ -52,9 +52,9 @@ void RunFilterUpdateTest(int num_blocks_to_process,
|
|||||||
x_old.fill(0.f);
|
x_old.fill(0.f);
|
||||||
ShadowFilterUpdateGain shadow_gain(config.filter.shadow_rate,
|
ShadowFilterUpdateGain shadow_gain(config.filter.shadow_rate,
|
||||||
config.filter.shadow_noise_gate);
|
config.filter.shadow_noise_gate);
|
||||||
MainFilterUpdateGain main_gain(config.filter.leakage_converged,
|
MainFilterUpdateGain main_gain(
|
||||||
config.filter.leakage_diverged,
|
config.filter.leakage_converged, config.filter.leakage_diverged,
|
||||||
config.filter.main_noise_gate);
|
config.filter.main_noise_gate, config.filter.error_floor);
|
||||||
Random random_generator(42U);
|
Random random_generator(42U);
|
||||||
std::vector<std::vector<float>> x(3, std::vector<float>(kBlockSize, 0.f));
|
std::vector<std::vector<float>> x(3, std::vector<float>(kBlockSize, 0.f));
|
||||||
std::vector<float> y(kBlockSize, 0.f);
|
std::vector<float> y(kBlockSize, 0.f);
|
||||||
@ -193,9 +193,9 @@ TEST(MainFilterUpdateGain, NullDataOutputGain) {
|
|||||||
RenderDelayBuffer::Create(config, 3));
|
RenderDelayBuffer::Create(config, 3));
|
||||||
RenderSignalAnalyzer analyzer;
|
RenderSignalAnalyzer analyzer;
|
||||||
SubtractorOutput output;
|
SubtractorOutput output;
|
||||||
MainFilterUpdateGain gain(config.filter.leakage_converged,
|
MainFilterUpdateGain gain(
|
||||||
config.filter.leakage_diverged,
|
config.filter.leakage_converged, config.filter.leakage_diverged,
|
||||||
config.filter.main_noise_gate);
|
config.filter.main_noise_gate, config.filter.error_floor);
|
||||||
EXPECT_DEATH(gain.Compute(*render_delay_buffer->GetRenderBuffer(), analyzer,
|
EXPECT_DEATH(gain.Compute(*render_delay_buffer->GetRenderBuffer(), analyzer,
|
||||||
output, filter, false, nullptr),
|
output, filter, false, nullptr),
|
||||||
"");
|
"");
|
||||||
|
|||||||
@ -55,7 +55,8 @@ Subtractor::Subtractor(const EchoCanceller3Config& config,
|
|||||||
shadow_filter_(config.filter.length_blocks, optimization, data_dumper_),
|
shadow_filter_(config.filter.length_blocks, optimization, data_dumper_),
|
||||||
G_main_(config.filter.leakage_converged,
|
G_main_(config.filter.leakage_converged,
|
||||||
config.filter.leakage_diverged,
|
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) {
|
G_shadow_(config.filter.shadow_rate, config.filter.shadow_noise_gate) {
|
||||||
RTC_DCHECK(data_dumper_);
|
RTC_DCHECK(data_dumper_);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1165,6 +1165,7 @@ struct EchoCanceller3Config {
|
|||||||
float shadow_rate = 0.5f;
|
float shadow_rate = 0.5f;
|
||||||
float leakage_converged = 0.01f;
|
float leakage_converged = 0.01f;
|
||||||
float leakage_diverged = 1.f / 60.f;
|
float leakage_diverged = 1.f / 60.f;
|
||||||
|
float error_floor = 0.1f;
|
||||||
float main_noise_gate = 220075344.f;
|
float main_noise_gate = 220075344.f;
|
||||||
float shadow_noise_gate = 220075344.f;
|
float shadow_noise_gate = 220075344.f;
|
||||||
} filter;
|
} filter;
|
||||||
|
|||||||
Reference in New Issue
Block a user