AEC3: Propagate the number of channels to the adaptive filters

This CL propagates the number of render and capture channels into
the echo subtractor and the adaptive filters.

Bug: webrtc:10913
Change-Id: I5ffff24ff64b7cc0f262bf008b34b6dfca1e78f9
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/151300
Reviewed-by: Sam Zackrisson <saza@webrtc.org>
Commit-Queue: Per Åhgren <peah@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29059}
This commit is contained in:
Per Åhgren
2019-09-03 23:59:52 +02:00
committed by Commit Bot
parent 1a3859c161
commit a33dc0144a
10 changed files with 36 additions and 20 deletions

View File

@ -418,6 +418,8 @@ void ApplyFilter_SSE2(const RenderBuffer& render_buffer,
AdaptiveFirFilter::AdaptiveFirFilter(size_t max_size_partitions,
size_t initial_size_partitions,
size_t size_change_duration_blocks,
size_t num_render_channels,
size_t num_capture_channels,
Aec3Optimization optimization,
ApmDataDumper* data_dumper)
: data_dumper_(data_dumper),

View File

@ -96,6 +96,8 @@ class AdaptiveFirFilter {
AdaptiveFirFilter(size_t max_size_partitions,
size_t initial_size_partitions,
size_t size_change_duration_blocks,
size_t num_render_channels,
size_t num_capture_channels,
Aec3Optimization optimization,
ApmDataDumper* data_dumper);

View File

@ -296,13 +296,14 @@ TEST(AdaptiveFirFilter, UpdateErlSse2Optimization) {
#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
// Verifies that the check for non-null data dumper works.
TEST(AdaptiveFirFilter, NullDataDumper) {
EXPECT_DEATH(AdaptiveFirFilter(9, 9, 250, DetectOptimization(), nullptr), "");
EXPECT_DEATH(
AdaptiveFirFilter(9, 9, 250, 1, 1, DetectOptimization(), nullptr), "");
}
// Verifies that the check for non-null filter output works.
TEST(AdaptiveFirFilter, NullFilterOutput) {
ApmDataDumper data_dumper(42);
AdaptiveFirFilter filter(9, 9, 250, DetectOptimization(), &data_dumper);
AdaptiveFirFilter filter(9, 9, 250, 1, 1, DetectOptimization(), &data_dumper);
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(EchoCanceller3Config(), 48000, 1));
EXPECT_DEATH(filter.Filter(*render_delay_buffer->GetRenderBuffer(), nullptr),
@ -315,7 +316,7 @@ TEST(AdaptiveFirFilter, NullFilterOutput) {
// are turned on.
TEST(AdaptiveFirFilter, FilterStatisticsAccess) {
ApmDataDumper data_dumper(42);
AdaptiveFirFilter filter(9, 9, 250, DetectOptimization(), &data_dumper);
AdaptiveFirFilter filter(9, 9, 250, 1, 1, DetectOptimization(), &data_dumper);
filter.Erl();
filter.FilterFrequencyResponse();
}
@ -324,7 +325,7 @@ TEST(AdaptiveFirFilter, FilterStatisticsAccess) {
TEST(AdaptiveFirFilter, FilterSize) {
ApmDataDumper data_dumper(42);
for (size_t filter_size = 1; filter_size < 5; ++filter_size) {
AdaptiveFirFilter filter(filter_size, filter_size, 250,
AdaptiveFirFilter filter(filter_size, filter_size, 250, 1, 1,
DetectOptimization(), &data_dumper);
EXPECT_EQ(filter_size, filter.SizePartitions());
}
@ -342,7 +343,7 @@ TEST(AdaptiveFirFilter, FilterAndAdapt) {
EchoCanceller3Config config;
AdaptiveFirFilter filter(config.filter.main.length_blocks,
config.filter.main.length_blocks,
config.filter.config_change_duration_blocks,
config.filter.config_change_duration_blocks, 1, 1,
DetectOptimization(), &data_dumper);
Aec3Fft fft;
config.delay.default_delay = 1;

View File

@ -160,7 +160,11 @@ EchoRemoverImpl::EchoRemoverImpl(const EchoCanceller3Config& config,
num_capture_channels_(num_capture_channels),
use_shadow_filter_output_(
config_.filter.enable_shadow_filter_output_usage),
subtractor_(config, data_dumper_.get(), optimization_),
subtractor_(config,
num_render_channels_,
num_capture_channels_,
data_dumper_.get(),
optimization_),
suppression_gain_(config_, optimization_, sample_rate_hz),
cng_(optimization_),
suppression_filter_(optimization_, sample_rate_hz_),
@ -171,8 +175,6 @@ EchoRemoverImpl::EchoRemoverImpl(const EchoCanceller3Config& config,
x_old_.fill(0.f);
y_old_.fill(0.f);
e_old_.fill(0.f);
(void)num_render_channels_;
(void)num_capture_channels_;
}
EchoRemoverImpl::~EchoRemoverImpl() = default;

View File

@ -51,12 +51,12 @@ void RunFilterUpdateTest(int num_blocks_to_process,
config.filter.shadow.length_blocks = filter_length_blocks;
AdaptiveFirFilter main_filter(config.filter.main.length_blocks,
config.filter.main.length_blocks,
config.filter.config_change_duration_blocks,
DetectOptimization(), &data_dumper);
config.filter.config_change_duration_blocks, 1,
1, DetectOptimization(), &data_dumper);
AdaptiveFirFilter shadow_filter(config.filter.shadow.length_blocks,
config.filter.shadow.length_blocks,
config.filter.config_change_duration_blocks,
DetectOptimization(), &data_dumper);
1, 1, DetectOptimization(), &data_dumper);
Aec3Fft fft;
std::array<float, kBlockSize> x_old;
x_old.fill(0.f);
@ -210,7 +210,7 @@ TEST(MainFilterUpdateGain, NullDataOutputGain) {
EchoCanceller3Config config;
AdaptiveFirFilter filter(config.filter.main.length_blocks,
config.filter.main.length_blocks,
config.filter.config_change_duration_blocks,
config.filter.config_change_duration_blocks, 1, 1,
DetectOptimization(), &data_dumper);
RenderSignalAnalyzer analyzer(EchoCanceller3Config{});
SubtractorOutput output;

View File

@ -43,12 +43,12 @@ void RunFilterUpdateTest(int num_blocks_to_process,
config.filter.main.length_blocks = filter_length_blocks;
AdaptiveFirFilter main_filter(config.filter.main.length_blocks,
config.filter.main.length_blocks,
config.filter.config_change_duration_blocks,
DetectOptimization(), &data_dumper);
config.filter.config_change_duration_blocks, 1,
1, DetectOptimization(), &data_dumper);
AdaptiveFirFilter shadow_filter(config.filter.shadow.length_blocks,
config.filter.shadow.length_blocks,
config.filter.config_change_duration_blocks,
DetectOptimization(), &data_dumper);
1, 1, DetectOptimization(), &data_dumper);
Aec3Fft fft;
constexpr int kSampleRateHz = 48000;

View File

@ -56,6 +56,8 @@ void ScaleFilterOutput(rtc::ArrayView<const float> y,
} // namespace
Subtractor::Subtractor(const EchoCanceller3Config& config,
size_t num_render_channels,
size_t num_capture_channels,
ApmDataDumper* data_dumper,
Aec3Optimization optimization)
: fft_(),
@ -65,11 +67,15 @@ Subtractor::Subtractor(const EchoCanceller3Config& config,
main_filter_(config_.filter.main.length_blocks,
config_.filter.main_initial.length_blocks,
config.filter.config_change_duration_blocks,
num_render_channels,
num_capture_channels,
optimization,
data_dumper_),
shadow_filter_(config_.filter.shadow.length_blocks,
config_.filter.shadow_initial.length_blocks,
config.filter.config_change_duration_blocks,
num_render_channels,
num_capture_channels,
optimization,
data_dumper_),
G_main_(config_.filter.main_initial,

View File

@ -39,6 +39,8 @@ namespace webrtc {
class Subtractor {
public:
Subtractor(const EchoCanceller3Config& config,
size_t num_render_channels,
size_t num_capture_channels,
ApmDataDumper* data_dumper,
Aec3Optimization optimization);
~Subtractor();

View File

@ -38,7 +38,7 @@ float RunSubtractorTest(int num_blocks_to_process,
config.filter.main.length_blocks = main_filter_length_blocks;
config.filter.shadow.length_blocks = shadow_filter_length_blocks;
Subtractor subtractor(config, &data_dumper, DetectOptimization());
Subtractor subtractor(config, 1, 1, &data_dumper, DetectOptimization());
absl::optional<DelayEstimate> delay_estimate;
std::vector<std::vector<std::vector<float>>> x(
kNumBands, std::vector<std::vector<float>>(
@ -120,7 +120,8 @@ std::string ProduceDebugText(size_t delay, int filter_length_blocks) {
// Verifies that the check for non data dumper works.
TEST(Subtractor, NullDataDumper) {
EXPECT_DEATH(
Subtractor(EchoCanceller3Config(), nullptr, DetectOptimization()), "");
Subtractor(EchoCanceller3Config(), 1, 1, nullptr, DetectOptimization()),
"");
}
// Verifies the check for null subtractor output.
@ -129,7 +130,7 @@ TEST(Subtractor, NullDataDumper) {
TEST(Subtractor, DISABLED_NullOutput) {
ApmDataDumper data_dumper(42);
EchoCanceller3Config config;
Subtractor subtractor(config, &data_dumper, DetectOptimization());
Subtractor subtractor(config, 1, 1, &data_dumper, DetectOptimization());
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(config, 48000, 1));
RenderSignalAnalyzer render_signal_analyzer(config);
@ -145,7 +146,7 @@ TEST(Subtractor, DISABLED_NullOutput) {
TEST(Subtractor, WrongCaptureSize) {
ApmDataDumper data_dumper(42);
EchoCanceller3Config config;
Subtractor subtractor(config, &data_dumper, DetectOptimization());
Subtractor subtractor(config, 1, 1, &data_dumper, DetectOptimization());
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(config, 48000, 1));
RenderSignalAnalyzer render_signal_analyzer(config);

View File

@ -79,7 +79,7 @@ TEST(SuppressionGain, BasicGainComputation) {
EchoCanceller3Config config;
AecState aec_state(config);
ApmDataDumper data_dumper(42);
Subtractor subtractor(config, &data_dumper, DetectOptimization());
Subtractor subtractor(config, 1, 1, &data_dumper, DetectOptimization());
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
RenderDelayBuffer::Create(config, kSampleRateHz, kNumChannels));
absl::optional<DelayEstimate> delay_estimate;