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:
@ -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),
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user