Further utilizing the AEC3 config struct for constants
BUG=webrtc:5298
Review-Url: https://codereview.webrtc.org/3007833002
Cr-Commit-Position: refs/heads/master@{#19605}
diff --git a/webrtc/modules/audio_processing/aec3/aec_state.cc b/webrtc/modules/audio_processing/aec3/aec_state.cc
index 6908270..d4a3c76 100644
--- a/webrtc/modules/audio_processing/aec3/aec_state.cc
+++ b/webrtc/modules/audio_processing/aec3/aec_state.cc
@@ -129,7 +129,11 @@
// Update counters.
const float x_energy = std::inner_product(x.begin(), x.end(), x.begin(), 0.f);
- const bool active_render_block = x_energy > 10000.f * kFftLengthBy2;
+
+ const bool active_render_block =
+ x_energy > (config_.param.render_levels.active_render_limit *
+ config_.param.render_levels.active_render_limit) *
+ kFftLengthBy2;
if (active_render_block) {
render_received_ = true;
}
diff --git a/webrtc/modules/audio_processing/aec3/block_processor.cc b/webrtc/modules/audio_processing/aec3/block_processor.cc
index 52bc4ef..536335e 100644
--- a/webrtc/modules/audio_processing/aec3/block_processor.cc
+++ b/webrtc/modules/audio_processing/aec3/block_processor.cc
@@ -181,7 +181,7 @@
std::unique_ptr<RenderDelayBuffer> render_buffer(
RenderDelayBuffer::Create(NumBandsForRate(sample_rate_hz)));
std::unique_ptr<RenderDelayController> delay_controller(
- RenderDelayController::Create(sample_rate_hz));
+ RenderDelayController::Create(config, sample_rate_hz));
std::unique_ptr<EchoRemover> echo_remover(
EchoRemover::Create(config, sample_rate_hz));
return Create(config, sample_rate_hz, std::move(render_buffer),
@@ -193,7 +193,7 @@
int sample_rate_hz,
std::unique_ptr<RenderDelayBuffer> render_buffer) {
std::unique_ptr<RenderDelayController> delay_controller(
- RenderDelayController::Create(sample_rate_hz));
+ RenderDelayController::Create(config, sample_rate_hz));
std::unique_ptr<EchoRemover> echo_remover(
EchoRemover::Create(config, sample_rate_hz));
return Create(config, sample_rate_hz, std::move(render_buffer),
diff --git a/webrtc/modules/audio_processing/aec3/echo_path_delay_estimator.cc b/webrtc/modules/audio_processing/aec3/echo_path_delay_estimator.cc
index 8f84f59..3c182f3 100644
--- a/webrtc/modules/audio_processing/aec3/echo_path_delay_estimator.cc
+++ b/webrtc/modules/audio_processing/aec3/echo_path_delay_estimator.cc
@@ -24,13 +24,16 @@
constexpr int kDownSamplingFactor = 4;
} // namespace
-EchoPathDelayEstimator::EchoPathDelayEstimator(ApmDataDumper* data_dumper)
+EchoPathDelayEstimator::EchoPathDelayEstimator(
+ ApmDataDumper* data_dumper,
+ const AudioProcessing::Config::EchoCanceller3& config)
: data_dumper_(data_dumper),
matched_filter_(data_dumper_,
DetectOptimization(),
kMatchedFilterWindowSizeSubBlocks,
kNumMatchedFilters,
- kMatchedFilterAlignmentShiftSizeSubBlocks),
+ kMatchedFilterAlignmentShiftSizeSubBlocks,
+ config.param.render_levels.poor_excitation_render_limit),
matched_filter_lag_aggregator_(data_dumper_,
matched_filter_.NumLagEstimates()) {
RTC_DCHECK(data_dumper);
diff --git a/webrtc/modules/audio_processing/aec3/echo_path_delay_estimator.h b/webrtc/modules/audio_processing/aec3/echo_path_delay_estimator.h
index d392044..4b536b9 100644
--- a/webrtc/modules/audio_processing/aec3/echo_path_delay_estimator.h
+++ b/webrtc/modules/audio_processing/aec3/echo_path_delay_estimator.h
@@ -17,6 +17,7 @@
#include "webrtc/modules/audio_processing/aec3/downsampled_render_buffer.h"
#include "webrtc/modules/audio_processing/aec3/matched_filter.h"
#include "webrtc/modules/audio_processing/aec3/matched_filter_lag_aggregator.h"
+#include "webrtc/modules/audio_processing/include/audio_processing.h"
#include "webrtc/rtc_base/constructormagic.h"
#include "webrtc/rtc_base/optional.h"
@@ -27,7 +28,8 @@
// Estimates the delay of the echo path.
class EchoPathDelayEstimator {
public:
- explicit EchoPathDelayEstimator(ApmDataDumper* data_dumper);
+ EchoPathDelayEstimator(ApmDataDumper* data_dumper,
+ const AudioProcessing::Config::EchoCanceller3& config);
~EchoPathDelayEstimator();
// Resets the estimation.
@@ -44,7 +46,7 @@
MatchedFilter matched_filter_;
MatchedFilterLagAggregator matched_filter_lag_aggregator_;
- RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(EchoPathDelayEstimator);
+ RTC_DISALLOW_COPY_AND_ASSIGN(EchoPathDelayEstimator);
};
} // namespace webrtc
diff --git a/webrtc/modules/audio_processing/aec3/echo_path_delay_estimator_unittest.cc b/webrtc/modules/audio_processing/aec3/echo_path_delay_estimator_unittest.cc
index aaaf87d..89b49ca 100644
--- a/webrtc/modules/audio_processing/aec3/echo_path_delay_estimator_unittest.cc
+++ b/webrtc/modules/audio_processing/aec3/echo_path_delay_estimator_unittest.cc
@@ -37,7 +37,8 @@
ApmDataDumper data_dumper(0);
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3));
- EchoPathDelayEstimator estimator(&data_dumper);
+ EchoPathDelayEstimator estimator(&data_dumper,
+ AudioProcessing::Config::EchoCanceller3());
std::vector<std::vector<float>> render(3, std::vector<float>(kBlockSize));
std::vector<float> capture(kBlockSize);
for (size_t k = 0; k < 100; ++k) {
@@ -59,7 +60,8 @@
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3));
DelayBuffer<float> signal_delay_buffer(delay_samples);
- EchoPathDelayEstimator estimator(&data_dumper);
+ EchoPathDelayEstimator estimator(&data_dumper,
+ AudioProcessing::Config::EchoCanceller3());
rtc::Optional<size_t> estimated_delay_samples;
for (size_t k = 0; k < (100 + delay_samples / kBlockSize); ++k) {
@@ -91,7 +93,8 @@
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3));
- EchoPathDelayEstimator estimator(&data_dumper);
+ EchoPathDelayEstimator estimator(&data_dumper,
+ AudioProcessing::Config::EchoCanceller3());
for (size_t k = 0; k < 19; ++k) {
RandomizeSampleVector(&random_generator, render[0]);
std::copy(render[0].begin(), render[0].end(), capture.begin());
@@ -109,7 +112,8 @@
std::vector<std::vector<float>> render(3, std::vector<float>(kBlockSize));
std::vector<float> capture(kBlockSize);
ApmDataDumper data_dumper(0);
- EchoPathDelayEstimator estimator(&data_dumper);
+ EchoPathDelayEstimator estimator(&data_dumper,
+ AudioProcessing::Config::EchoCanceller3());
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3));
for (size_t k = 0; k < 100; ++k) {
@@ -132,7 +136,8 @@
std::vector<std::vector<float>> render(3, std::vector<float>(kBlockSize));
std::vector<float> capture(kBlockSize);
ApmDataDumper data_dumper(0);
- EchoPathDelayEstimator estimator(&data_dumper);
+ EchoPathDelayEstimator estimator(&data_dumper,
+ AudioProcessing::Config::EchoCanceller3());
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3));
for (size_t k = 0; k < 100; ++k) {
@@ -152,7 +157,8 @@
// tests on test bots has been fixed.
TEST(EchoPathDelayEstimator, DISABLED_WrongRenderBlockSize) {
ApmDataDumper data_dumper(0);
- EchoPathDelayEstimator estimator(&data_dumper);
+ EchoPathDelayEstimator estimator(&data_dumper,
+ AudioProcessing::Config::EchoCanceller3());
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3));
std::vector<float> capture(kBlockSize);
@@ -166,7 +172,8 @@
// tests on test bots has been fixed.
TEST(EchoPathDelayEstimator, WrongCaptureBlockSize) {
ApmDataDumper data_dumper(0);
- EchoPathDelayEstimator estimator(&data_dumper);
+ EchoPathDelayEstimator estimator(&data_dumper,
+ AudioProcessing::Config::EchoCanceller3());
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3));
std::vector<float> capture(std::vector<float>(kBlockSize - 1));
@@ -177,7 +184,9 @@
// Verifies the check for non-null data dumper.
TEST(EchoPathDelayEstimator, NullDataDumper) {
- EXPECT_DEATH(EchoPathDelayEstimator(nullptr), "");
+ EXPECT_DEATH(EchoPathDelayEstimator(
+ nullptr, AudioProcessing::Config::EchoCanceller3()),
+ "");
}
#endif
diff --git a/webrtc/modules/audio_processing/aec3/matched_filter.cc b/webrtc/modules/audio_processing/aec3/matched_filter.cc
index 4c6e0d7..5414cfc 100644
--- a/webrtc/modules/audio_processing/aec3/matched_filter.cc
+++ b/webrtc/modules/audio_processing/aec3/matched_filter.cc
@@ -291,13 +291,15 @@
Aec3Optimization optimization,
size_t window_size_sub_blocks,
int num_matched_filters,
- size_t alignment_shift_sub_blocks)
+ size_t alignment_shift_sub_blocks,
+ float excitation_limit)
: data_dumper_(data_dumper),
optimization_(optimization),
filter_intra_lag_shift_(alignment_shift_sub_blocks * kSubBlockSize),
filters_(num_matched_filters,
std::vector<float>(window_size_sub_blocks * kSubBlockSize, 0.f)),
- lag_estimates_(num_matched_filters) {
+ lag_estimates_(num_matched_filters),
+ excitation_limit_(excitation_limit) {
RTC_DCHECK(data_dumper);
RTC_DCHECK_LT(0, window_size_sub_blocks);
}
@@ -318,7 +320,8 @@
const std::array<float, kSubBlockSize>& capture) {
const std::array<float, kSubBlockSize>& y = capture;
- const float x2_sum_threshold = filters_[0].size() * 150.f * 150.f;
+ const float x2_sum_threshold =
+ filters_[0].size() * excitation_limit_ * excitation_limit_;
// Apply all matched filters.
size_t alignment_shift = 0;
diff --git a/webrtc/modules/audio_processing/aec3/matched_filter.h b/webrtc/modules/audio_processing/aec3/matched_filter.h
index fd20625..0702a12 100644
--- a/webrtc/modules/audio_processing/aec3/matched_filter.h
+++ b/webrtc/modules/audio_processing/aec3/matched_filter.h
@@ -83,7 +83,8 @@
Aec3Optimization optimization,
size_t window_size_sub_blocks,
int num_matched_filters,
- size_t alignment_shift_sub_blocks);
+ size_t alignment_shift_sub_blocks,
+ float excitation_limit);
~MatchedFilter();
@@ -108,6 +109,7 @@
const size_t filter_intra_lag_shift_;
std::vector<std::vector<float>> filters_;
std::vector<LagEstimate> lag_estimates_;
+ const float excitation_limit_;
RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(MatchedFilter);
};
diff --git a/webrtc/modules/audio_processing/aec3/matched_filter_unittest.cc b/webrtc/modules/audio_processing/aec3/matched_filter_unittest.cc
index b2978b6..47ff353 100644
--- a/webrtc/modules/audio_processing/aec3/matched_filter_unittest.cc
+++ b/webrtc/modules/audio_processing/aec3/matched_filter_unittest.cc
@@ -137,7 +137,7 @@
DelayBuffer<float> signal_delay_buffer(4 * delay_samples);
MatchedFilter filter(&data_dumper, DetectOptimization(),
kWindowSizeSubBlocks, kNumMatchedFilters,
- kAlignmentShiftSubBlocks);
+ kAlignmentShiftSubBlocks, 150);
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3));
@@ -206,7 +206,7 @@
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3));
MatchedFilter filter(&data_dumper, DetectOptimization(), kWindowSizeSubBlocks,
- kNumMatchedFilters, kAlignmentShiftSubBlocks);
+ kNumMatchedFilters, kAlignmentShiftSubBlocks, 150);
// Analyze the correlation between render and capture.
for (size_t k = 0; k < 100; ++k) {
@@ -236,7 +236,7 @@
capture.fill(0.f);
ApmDataDumper data_dumper(0);
MatchedFilter filter(&data_dumper, DetectOptimization(), kWindowSizeSubBlocks,
- kNumMatchedFilters, kAlignmentShiftSubBlocks);
+ kNumMatchedFilters, kAlignmentShiftSubBlocks, 150);
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(3));
DecimatorBy4 capture_decimator;
@@ -273,7 +273,7 @@
for (size_t num_matched_filters = 0; num_matched_filters < 10;
++num_matched_filters) {
MatchedFilter filter(&data_dumper, DetectOptimization(), 32,
- num_matched_filters, 1);
+ num_matched_filters, 1, 150);
EXPECT_EQ(num_matched_filters, filter.GetLagEstimates().size());
}
}
@@ -283,12 +283,13 @@
// Verifies the check for non-zero windows size.
TEST(MatchedFilter, ZeroWindowSize) {
ApmDataDumper data_dumper(0);
- EXPECT_DEATH(MatchedFilter(&data_dumper, DetectOptimization(), 0, 1, 1), "");
+ EXPECT_DEATH(MatchedFilter(&data_dumper, DetectOptimization(), 0, 1, 1, 150),
+ "");
}
// Verifies the check for non-null data dumper.
TEST(MatchedFilter, NullDataDumper) {
- EXPECT_DEATH(MatchedFilter(nullptr, DetectOptimization(), 1, 1, 1), "");
+ EXPECT_DEATH(MatchedFilter(nullptr, DetectOptimization(), 1, 1, 1, 150), "");
}
#endif
diff --git a/webrtc/modules/audio_processing/aec3/render_delay_controller.cc b/webrtc/modules/audio_processing/aec3/render_delay_controller.cc
index a88540e..d5d8a14 100644
--- a/webrtc/modules/audio_processing/aec3/render_delay_controller.cc
+++ b/webrtc/modules/audio_processing/aec3/render_delay_controller.cc
@@ -17,6 +17,7 @@
#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
#include "webrtc/modules/audio_processing/aec3/echo_path_delay_estimator.h"
#include "webrtc/modules/audio_processing/aec3/render_delay_controller_metrics.h"
+#include "webrtc/modules/audio_processing/include/audio_processing.h"
#include "webrtc/rtc_base/atomicops.h"
#include "webrtc/rtc_base/constructormagic.h"
@@ -26,7 +27,9 @@
class RenderDelayControllerImpl final : public RenderDelayController {
public:
- RenderDelayControllerImpl(int sample_rate_hz);
+ RenderDelayControllerImpl(
+ const AudioProcessing::Config::EchoCanceller3& config,
+ int sample_rate_hz);
~RenderDelayControllerImpl() override;
void Reset() override;
void SetDelay(size_t render_delay) override;
@@ -68,10 +71,12 @@
int RenderDelayControllerImpl::instance_count_ = 0;
-RenderDelayControllerImpl::RenderDelayControllerImpl(int sample_rate_hz)
+RenderDelayControllerImpl::RenderDelayControllerImpl(
+ const AudioProcessing::Config::EchoCanceller3& config,
+ int sample_rate_hz)
: data_dumper_(
new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
- delay_estimator_(data_dumper_.get()) {
+ delay_estimator_(data_dumper_.get(), config) {
RTC_DCHECK(ValidFullBandRate(sample_rate_hz));
}
@@ -134,8 +139,10 @@
} // namespace
-RenderDelayController* RenderDelayController::Create(int sample_rate_hz) {
- return new RenderDelayControllerImpl(sample_rate_hz);
+RenderDelayController* RenderDelayController::Create(
+ const AudioProcessing::Config::EchoCanceller3& config,
+ int sample_rate_hz) {
+ return new RenderDelayControllerImpl(config, sample_rate_hz);
}
} // namespace webrtc
diff --git a/webrtc/modules/audio_processing/aec3/render_delay_controller.h b/webrtc/modules/audio_processing/aec3/render_delay_controller.h
index e3a8ee3..ef0aaac 100644
--- a/webrtc/modules/audio_processing/aec3/render_delay_controller.h
+++ b/webrtc/modules/audio_processing/aec3/render_delay_controller.h
@@ -13,6 +13,7 @@
#include "webrtc/modules/audio_processing/aec3/downsampled_render_buffer.h"
#include "webrtc/modules/audio_processing/aec3/render_delay_buffer.h"
+#include "webrtc/modules/audio_processing/include/audio_processing.h"
#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
#include "webrtc/rtc_base/array_view.h"
#include "webrtc/rtc_base/optional.h"
@@ -22,7 +23,9 @@
// Class for aligning the render and capture signal using a RenderDelayBuffer.
class RenderDelayController {
public:
- static RenderDelayController* Create(int sample_rate_hz);
+ static RenderDelayController* Create(
+ const AudioProcessing::Config::EchoCanceller3& config,
+ int sample_rate_hz);
virtual ~RenderDelayController() = default;
// Resets the delay controller.
diff --git a/webrtc/modules/audio_processing/aec3/render_delay_controller_unittest.cc b/webrtc/modules/audio_processing/aec3/render_delay_controller_unittest.cc
index af0778b..ba2f25b 100644
--- a/webrtc/modules/audio_processing/aec3/render_delay_controller_unittest.cc
+++ b/webrtc/modules/audio_processing/aec3/render_delay_controller_unittest.cc
@@ -50,7 +50,8 @@
std::unique_ptr<RenderDelayBuffer> delay_buffer(
RenderDelayBuffer::Create(NumBandsForRate(rate)));
std::unique_ptr<RenderDelayController> delay_controller(
- RenderDelayController::Create(rate));
+ RenderDelayController::Create(AudioProcessing::Config::EchoCanceller3(),
+ rate));
for (size_t k = 0; k < 100; ++k) {
EXPECT_EQ(0u, delay_controller->GetDelay(
delay_buffer->GetDownsampledRenderBuffer(), block));
@@ -68,7 +69,8 @@
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(NumBandsForRate(rate)));
std::unique_ptr<RenderDelayController> delay_controller(
- RenderDelayController::Create(rate));
+ RenderDelayController::Create(AudioProcessing::Config::EchoCanceller3(),
+ rate));
for (size_t k = 0; k < 10; ++k) {
render_delay_buffer->Insert(render_block);
render_delay_buffer->UpdateBuffers();
@@ -95,7 +97,8 @@
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(NumBandsForRate(rate)));
std::unique_ptr<RenderDelayController> delay_controller(
- RenderDelayController::Create(rate));
+ RenderDelayController::Create(
+ AudioProcessing::Config::EchoCanceller3(), rate));
DelayBuffer<float> signal_delay_buffer(delay_samples);
for (size_t k = 0; k < (400 + delay_samples / kBlockSize); ++k) {
RandomizeSampleVector(&random_generator, render_block[0]);
@@ -139,7 +142,8 @@
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(NumBandsForRate(rate)));
std::unique_ptr<RenderDelayController> delay_controller(
- RenderDelayController::Create(rate));
+ RenderDelayController::Create(
+ AudioProcessing::Config::EchoCanceller3(), rate));
DelayBuffer<float> signal_delay_buffer(delay_samples);
for (size_t j = 0;
j <
@@ -188,7 +192,8 @@
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(NumBandsForRate(rate)));
std::unique_ptr<RenderDelayController> delay_controller(
- RenderDelayController::Create(rate));
+ RenderDelayController::Create(AudioProcessing::Config::EchoCanceller3(),
+ rate));
EXPECT_FALSE(delay_controller->AlignmentHeadroomSamples());
}
}
@@ -204,7 +209,8 @@
RenderDelayBuffer::Create(NumBandsForRate(rate)));
EXPECT_DEATH(
std::unique_ptr<RenderDelayController>(
- RenderDelayController::Create(rate))
+ RenderDelayController::Create(
+ AudioProcessing::Config::EchoCanceller3(), rate))
->GetDelay(render_delay_buffer->GetDownsampledRenderBuffer(),
block),
"");
@@ -219,9 +225,10 @@
SCOPED_TRACE(ProduceDebugText(rate));
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(NumBandsForRate(rate)));
- EXPECT_DEATH(std::unique_ptr<RenderDelayController>(
- RenderDelayController::Create(rate)),
- "");
+ EXPECT_DEATH(
+ std::unique_ptr<RenderDelayController>(RenderDelayController::Create(
+ AudioProcessing::Config::EchoCanceller3(), rate)),
+ "");
}
}
diff --git a/webrtc/modules/audio_processing/include/audio_processing.h b/webrtc/modules/audio_processing/include/audio_processing.h
index e130b83..03bd8c8 100644
--- a/webrtc/modules/audio_processing/include/audio_processing.h
+++ b/webrtc/modules/audio_processing/include/audio_processing.h
@@ -292,8 +292,14 @@
struct EchoAudibility {
float low_render_limit = 192.f;
float normal_render_limit = 64.f;
+ float active_render_limit = 100.f;
} echo_audibility;
+ struct RenderLevels {
+ float active_render_limit = 100.f;
+ float poor_excitation_render_limit = 150.f;
+ } render_levels;
+
struct GainUpdates {
struct GainChanges {
float max_inc;