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}
This commit is contained in:
@ -129,7 +129,11 @@ void AecState::Update(const std::vector<std::array<float, kFftLengthBy2Plus1>>&
|
|||||||
|
|
||||||
// Update counters.
|
// Update counters.
|
||||||
const float x_energy = std::inner_product(x.begin(), x.end(), x.begin(), 0.f);
|
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) {
|
if (active_render_block) {
|
||||||
render_received_ = true;
|
render_received_ = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -181,7 +181,7 @@ BlockProcessor* BlockProcessor::Create(
|
|||||||
std::unique_ptr<RenderDelayBuffer> render_buffer(
|
std::unique_ptr<RenderDelayBuffer> render_buffer(
|
||||||
RenderDelayBuffer::Create(NumBandsForRate(sample_rate_hz)));
|
RenderDelayBuffer::Create(NumBandsForRate(sample_rate_hz)));
|
||||||
std::unique_ptr<RenderDelayController> delay_controller(
|
std::unique_ptr<RenderDelayController> delay_controller(
|
||||||
RenderDelayController::Create(sample_rate_hz));
|
RenderDelayController::Create(config, sample_rate_hz));
|
||||||
std::unique_ptr<EchoRemover> echo_remover(
|
std::unique_ptr<EchoRemover> echo_remover(
|
||||||
EchoRemover::Create(config, sample_rate_hz));
|
EchoRemover::Create(config, sample_rate_hz));
|
||||||
return Create(config, sample_rate_hz, std::move(render_buffer),
|
return Create(config, sample_rate_hz, std::move(render_buffer),
|
||||||
@ -193,7 +193,7 @@ BlockProcessor* BlockProcessor::Create(
|
|||||||
int sample_rate_hz,
|
int sample_rate_hz,
|
||||||
std::unique_ptr<RenderDelayBuffer> render_buffer) {
|
std::unique_ptr<RenderDelayBuffer> render_buffer) {
|
||||||
std::unique_ptr<RenderDelayController> delay_controller(
|
std::unique_ptr<RenderDelayController> delay_controller(
|
||||||
RenderDelayController::Create(sample_rate_hz));
|
RenderDelayController::Create(config, sample_rate_hz));
|
||||||
std::unique_ptr<EchoRemover> echo_remover(
|
std::unique_ptr<EchoRemover> echo_remover(
|
||||||
EchoRemover::Create(config, sample_rate_hz));
|
EchoRemover::Create(config, sample_rate_hz));
|
||||||
return Create(config, sample_rate_hz, std::move(render_buffer),
|
return Create(config, sample_rate_hz, std::move(render_buffer),
|
||||||
|
|||||||
@ -24,13 +24,16 @@ namespace {
|
|||||||
constexpr int kDownSamplingFactor = 4;
|
constexpr int kDownSamplingFactor = 4;
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
EchoPathDelayEstimator::EchoPathDelayEstimator(ApmDataDumper* data_dumper)
|
EchoPathDelayEstimator::EchoPathDelayEstimator(
|
||||||
|
ApmDataDumper* data_dumper,
|
||||||
|
const AudioProcessing::Config::EchoCanceller3& config)
|
||||||
: data_dumper_(data_dumper),
|
: data_dumper_(data_dumper),
|
||||||
matched_filter_(data_dumper_,
|
matched_filter_(data_dumper_,
|
||||||
DetectOptimization(),
|
DetectOptimization(),
|
||||||
kMatchedFilterWindowSizeSubBlocks,
|
kMatchedFilterWindowSizeSubBlocks,
|
||||||
kNumMatchedFilters,
|
kNumMatchedFilters,
|
||||||
kMatchedFilterAlignmentShiftSizeSubBlocks),
|
kMatchedFilterAlignmentShiftSizeSubBlocks,
|
||||||
|
config.param.render_levels.poor_excitation_render_limit),
|
||||||
matched_filter_lag_aggregator_(data_dumper_,
|
matched_filter_lag_aggregator_(data_dumper_,
|
||||||
matched_filter_.NumLagEstimates()) {
|
matched_filter_.NumLagEstimates()) {
|
||||||
RTC_DCHECK(data_dumper);
|
RTC_DCHECK(data_dumper);
|
||||||
|
|||||||
@ -17,6 +17,7 @@
|
|||||||
#include "webrtc/modules/audio_processing/aec3/downsampled_render_buffer.h"
|
#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.h"
|
||||||
#include "webrtc/modules/audio_processing/aec3/matched_filter_lag_aggregator.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/constructormagic.h"
|
||||||
#include "webrtc/rtc_base/optional.h"
|
#include "webrtc/rtc_base/optional.h"
|
||||||
|
|
||||||
@ -27,7 +28,8 @@ class ApmDataDumper;
|
|||||||
// Estimates the delay of the echo path.
|
// Estimates the delay of the echo path.
|
||||||
class EchoPathDelayEstimator {
|
class EchoPathDelayEstimator {
|
||||||
public:
|
public:
|
||||||
explicit EchoPathDelayEstimator(ApmDataDumper* data_dumper);
|
EchoPathDelayEstimator(ApmDataDumper* data_dumper,
|
||||||
|
const AudioProcessing::Config::EchoCanceller3& config);
|
||||||
~EchoPathDelayEstimator();
|
~EchoPathDelayEstimator();
|
||||||
|
|
||||||
// Resets the estimation.
|
// Resets the estimation.
|
||||||
@ -44,7 +46,7 @@ class EchoPathDelayEstimator {
|
|||||||
MatchedFilter matched_filter_;
|
MatchedFilter matched_filter_;
|
||||||
MatchedFilterLagAggregator matched_filter_lag_aggregator_;
|
MatchedFilterLagAggregator matched_filter_lag_aggregator_;
|
||||||
|
|
||||||
RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(EchoPathDelayEstimator);
|
RTC_DISALLOW_COPY_AND_ASSIGN(EchoPathDelayEstimator);
|
||||||
};
|
};
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|
||||||
|
|||||||
@ -37,7 +37,8 @@ TEST(EchoPathDelayEstimator, BasicApiCalls) {
|
|||||||
ApmDataDumper data_dumper(0);
|
ApmDataDumper data_dumper(0);
|
||||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||||
RenderDelayBuffer::Create(3));
|
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<std::vector<float>> render(3, std::vector<float>(kBlockSize));
|
||||||
std::vector<float> capture(kBlockSize);
|
std::vector<float> capture(kBlockSize);
|
||||||
for (size_t k = 0; k < 100; ++k) {
|
for (size_t k = 0; k < 100; ++k) {
|
||||||
@ -59,7 +60,8 @@ TEST(EchoPathDelayEstimator, DelayEstimation) {
|
|||||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||||
RenderDelayBuffer::Create(3));
|
RenderDelayBuffer::Create(3));
|
||||||
DelayBuffer<float> signal_delay_buffer(delay_samples);
|
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;
|
rtc::Optional<size_t> estimated_delay_samples;
|
||||||
for (size_t k = 0; k < (100 + delay_samples / kBlockSize); ++k) {
|
for (size_t k = 0; k < (100 + delay_samples / kBlockSize); ++k) {
|
||||||
@ -91,7 +93,8 @@ TEST(EchoPathDelayEstimator, NoInitialDelayestimates) {
|
|||||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||||
RenderDelayBuffer::Create(3));
|
RenderDelayBuffer::Create(3));
|
||||||
|
|
||||||
EchoPathDelayEstimator estimator(&data_dumper);
|
EchoPathDelayEstimator estimator(&data_dumper,
|
||||||
|
AudioProcessing::Config::EchoCanceller3());
|
||||||
for (size_t k = 0; k < 19; ++k) {
|
for (size_t k = 0; k < 19; ++k) {
|
||||||
RandomizeSampleVector(&random_generator, render[0]);
|
RandomizeSampleVector(&random_generator, render[0]);
|
||||||
std::copy(render[0].begin(), render[0].end(), capture.begin());
|
std::copy(render[0].begin(), render[0].end(), capture.begin());
|
||||||
@ -109,7 +112,8 @@ TEST(EchoPathDelayEstimator, NoDelayEstimatesForLowLevelRenderSignals) {
|
|||||||
std::vector<std::vector<float>> render(3, std::vector<float>(kBlockSize));
|
std::vector<std::vector<float>> render(3, std::vector<float>(kBlockSize));
|
||||||
std::vector<float> capture(kBlockSize);
|
std::vector<float> capture(kBlockSize);
|
||||||
ApmDataDumper data_dumper(0);
|
ApmDataDumper data_dumper(0);
|
||||||
EchoPathDelayEstimator estimator(&data_dumper);
|
EchoPathDelayEstimator estimator(&data_dumper,
|
||||||
|
AudioProcessing::Config::EchoCanceller3());
|
||||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||||
RenderDelayBuffer::Create(3));
|
RenderDelayBuffer::Create(3));
|
||||||
for (size_t k = 0; k < 100; ++k) {
|
for (size_t k = 0; k < 100; ++k) {
|
||||||
@ -132,7 +136,8 @@ TEST(EchoPathDelayEstimator, NoDelayEstimatesForUncorrelatedSignals) {
|
|||||||
std::vector<std::vector<float>> render(3, std::vector<float>(kBlockSize));
|
std::vector<std::vector<float>> render(3, std::vector<float>(kBlockSize));
|
||||||
std::vector<float> capture(kBlockSize);
|
std::vector<float> capture(kBlockSize);
|
||||||
ApmDataDumper data_dumper(0);
|
ApmDataDumper data_dumper(0);
|
||||||
EchoPathDelayEstimator estimator(&data_dumper);
|
EchoPathDelayEstimator estimator(&data_dumper,
|
||||||
|
AudioProcessing::Config::EchoCanceller3());
|
||||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||||
RenderDelayBuffer::Create(3));
|
RenderDelayBuffer::Create(3));
|
||||||
for (size_t k = 0; k < 100; ++k) {
|
for (size_t k = 0; k < 100; ++k) {
|
||||||
@ -152,7 +157,8 @@ TEST(EchoPathDelayEstimator, NoDelayEstimatesForUncorrelatedSignals) {
|
|||||||
// tests on test bots has been fixed.
|
// tests on test bots has been fixed.
|
||||||
TEST(EchoPathDelayEstimator, DISABLED_WrongRenderBlockSize) {
|
TEST(EchoPathDelayEstimator, DISABLED_WrongRenderBlockSize) {
|
||||||
ApmDataDumper data_dumper(0);
|
ApmDataDumper data_dumper(0);
|
||||||
EchoPathDelayEstimator estimator(&data_dumper);
|
EchoPathDelayEstimator estimator(&data_dumper,
|
||||||
|
AudioProcessing::Config::EchoCanceller3());
|
||||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||||
RenderDelayBuffer::Create(3));
|
RenderDelayBuffer::Create(3));
|
||||||
std::vector<float> capture(kBlockSize);
|
std::vector<float> capture(kBlockSize);
|
||||||
@ -166,7 +172,8 @@ TEST(EchoPathDelayEstimator, DISABLED_WrongRenderBlockSize) {
|
|||||||
// tests on test bots has been fixed.
|
// tests on test bots has been fixed.
|
||||||
TEST(EchoPathDelayEstimator, WrongCaptureBlockSize) {
|
TEST(EchoPathDelayEstimator, WrongCaptureBlockSize) {
|
||||||
ApmDataDumper data_dumper(0);
|
ApmDataDumper data_dumper(0);
|
||||||
EchoPathDelayEstimator estimator(&data_dumper);
|
EchoPathDelayEstimator estimator(&data_dumper,
|
||||||
|
AudioProcessing::Config::EchoCanceller3());
|
||||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||||
RenderDelayBuffer::Create(3));
|
RenderDelayBuffer::Create(3));
|
||||||
std::vector<float> capture(std::vector<float>(kBlockSize - 1));
|
std::vector<float> capture(std::vector<float>(kBlockSize - 1));
|
||||||
@ -177,7 +184,9 @@ TEST(EchoPathDelayEstimator, WrongCaptureBlockSize) {
|
|||||||
|
|
||||||
// Verifies the check for non-null data dumper.
|
// Verifies the check for non-null data dumper.
|
||||||
TEST(EchoPathDelayEstimator, NullDataDumper) {
|
TEST(EchoPathDelayEstimator, NullDataDumper) {
|
||||||
EXPECT_DEATH(EchoPathDelayEstimator(nullptr), "");
|
EXPECT_DEATH(EchoPathDelayEstimator(
|
||||||
|
nullptr, AudioProcessing::Config::EchoCanceller3()),
|
||||||
|
"");
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -291,13 +291,15 @@ MatchedFilter::MatchedFilter(ApmDataDumper* data_dumper,
|
|||||||
Aec3Optimization optimization,
|
Aec3Optimization optimization,
|
||||||
size_t window_size_sub_blocks,
|
size_t window_size_sub_blocks,
|
||||||
int num_matched_filters,
|
int num_matched_filters,
|
||||||
size_t alignment_shift_sub_blocks)
|
size_t alignment_shift_sub_blocks,
|
||||||
|
float excitation_limit)
|
||||||
: data_dumper_(data_dumper),
|
: data_dumper_(data_dumper),
|
||||||
optimization_(optimization),
|
optimization_(optimization),
|
||||||
filter_intra_lag_shift_(alignment_shift_sub_blocks * kSubBlockSize),
|
filter_intra_lag_shift_(alignment_shift_sub_blocks * kSubBlockSize),
|
||||||
filters_(num_matched_filters,
|
filters_(num_matched_filters,
|
||||||
std::vector<float>(window_size_sub_blocks * kSubBlockSize, 0.f)),
|
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(data_dumper);
|
||||||
RTC_DCHECK_LT(0, window_size_sub_blocks);
|
RTC_DCHECK_LT(0, window_size_sub_blocks);
|
||||||
}
|
}
|
||||||
@ -318,7 +320,8 @@ void MatchedFilter::Update(const DownsampledRenderBuffer& render_buffer,
|
|||||||
const std::array<float, kSubBlockSize>& capture) {
|
const std::array<float, kSubBlockSize>& capture) {
|
||||||
const std::array<float, kSubBlockSize>& y = 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.
|
// Apply all matched filters.
|
||||||
size_t alignment_shift = 0;
|
size_t alignment_shift = 0;
|
||||||
|
|||||||
@ -83,7 +83,8 @@ class MatchedFilter {
|
|||||||
Aec3Optimization optimization,
|
Aec3Optimization optimization,
|
||||||
size_t window_size_sub_blocks,
|
size_t window_size_sub_blocks,
|
||||||
int num_matched_filters,
|
int num_matched_filters,
|
||||||
size_t alignment_shift_sub_blocks);
|
size_t alignment_shift_sub_blocks,
|
||||||
|
float excitation_limit);
|
||||||
|
|
||||||
~MatchedFilter();
|
~MatchedFilter();
|
||||||
|
|
||||||
@ -108,6 +109,7 @@ class MatchedFilter {
|
|||||||
const size_t filter_intra_lag_shift_;
|
const size_t filter_intra_lag_shift_;
|
||||||
std::vector<std::vector<float>> filters_;
|
std::vector<std::vector<float>> filters_;
|
||||||
std::vector<LagEstimate> lag_estimates_;
|
std::vector<LagEstimate> lag_estimates_;
|
||||||
|
const float excitation_limit_;
|
||||||
|
|
||||||
RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(MatchedFilter);
|
RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(MatchedFilter);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -137,7 +137,7 @@ TEST(MatchedFilter, LagEstimation) {
|
|||||||
DelayBuffer<float> signal_delay_buffer(4 * delay_samples);
|
DelayBuffer<float> signal_delay_buffer(4 * delay_samples);
|
||||||
MatchedFilter filter(&data_dumper, DetectOptimization(),
|
MatchedFilter filter(&data_dumper, DetectOptimization(),
|
||||||
kWindowSizeSubBlocks, kNumMatchedFilters,
|
kWindowSizeSubBlocks, kNumMatchedFilters,
|
||||||
kAlignmentShiftSubBlocks);
|
kAlignmentShiftSubBlocks, 150);
|
||||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||||
RenderDelayBuffer::Create(3));
|
RenderDelayBuffer::Create(3));
|
||||||
|
|
||||||
@ -206,7 +206,7 @@ TEST(MatchedFilter, LagNotReliableForUncorrelatedRenderAndCapture) {
|
|||||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||||
RenderDelayBuffer::Create(3));
|
RenderDelayBuffer::Create(3));
|
||||||
MatchedFilter filter(&data_dumper, DetectOptimization(), kWindowSizeSubBlocks,
|
MatchedFilter filter(&data_dumper, DetectOptimization(), kWindowSizeSubBlocks,
|
||||||
kNumMatchedFilters, kAlignmentShiftSubBlocks);
|
kNumMatchedFilters, kAlignmentShiftSubBlocks, 150);
|
||||||
|
|
||||||
// Analyze the correlation between render and capture.
|
// Analyze the correlation between render and capture.
|
||||||
for (size_t k = 0; k < 100; ++k) {
|
for (size_t k = 0; k < 100; ++k) {
|
||||||
@ -236,7 +236,7 @@ TEST(MatchedFilter, LagNotUpdatedForLowLevelRender) {
|
|||||||
capture.fill(0.f);
|
capture.fill(0.f);
|
||||||
ApmDataDumper data_dumper(0);
|
ApmDataDumper data_dumper(0);
|
||||||
MatchedFilter filter(&data_dumper, DetectOptimization(), kWindowSizeSubBlocks,
|
MatchedFilter filter(&data_dumper, DetectOptimization(), kWindowSizeSubBlocks,
|
||||||
kNumMatchedFilters, kAlignmentShiftSubBlocks);
|
kNumMatchedFilters, kAlignmentShiftSubBlocks, 150);
|
||||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||||
RenderDelayBuffer::Create(3));
|
RenderDelayBuffer::Create(3));
|
||||||
DecimatorBy4 capture_decimator;
|
DecimatorBy4 capture_decimator;
|
||||||
@ -273,7 +273,7 @@ TEST(MatchedFilter, NumberOfLagEstimates) {
|
|||||||
for (size_t num_matched_filters = 0; num_matched_filters < 10;
|
for (size_t num_matched_filters = 0; num_matched_filters < 10;
|
||||||
++num_matched_filters) {
|
++num_matched_filters) {
|
||||||
MatchedFilter filter(&data_dumper, DetectOptimization(), 32,
|
MatchedFilter filter(&data_dumper, DetectOptimization(), 32,
|
||||||
num_matched_filters, 1);
|
num_matched_filters, 1, 150);
|
||||||
EXPECT_EQ(num_matched_filters, filter.GetLagEstimates().size());
|
EXPECT_EQ(num_matched_filters, filter.GetLagEstimates().size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -283,12 +283,13 @@ TEST(MatchedFilter, NumberOfLagEstimates) {
|
|||||||
// Verifies the check for non-zero windows size.
|
// Verifies the check for non-zero windows size.
|
||||||
TEST(MatchedFilter, ZeroWindowSize) {
|
TEST(MatchedFilter, ZeroWindowSize) {
|
||||||
ApmDataDumper data_dumper(0);
|
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.
|
// Verifies the check for non-null data dumper.
|
||||||
TEST(MatchedFilter, NullDataDumper) {
|
TEST(MatchedFilter, NullDataDumper) {
|
||||||
EXPECT_DEATH(MatchedFilter(nullptr, DetectOptimization(), 1, 1, 1), "");
|
EXPECT_DEATH(MatchedFilter(nullptr, DetectOptimization(), 1, 1, 1, 150), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -17,6 +17,7 @@
|
|||||||
#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
|
#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/echo_path_delay_estimator.h"
|
||||||
#include "webrtc/modules/audio_processing/aec3/render_delay_controller_metrics.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/atomicops.h"
|
||||||
#include "webrtc/rtc_base/constructormagic.h"
|
#include "webrtc/rtc_base/constructormagic.h"
|
||||||
|
|
||||||
@ -26,7 +27,9 @@ namespace {
|
|||||||
|
|
||||||
class RenderDelayControllerImpl final : public RenderDelayController {
|
class RenderDelayControllerImpl final : public RenderDelayController {
|
||||||
public:
|
public:
|
||||||
RenderDelayControllerImpl(int sample_rate_hz);
|
RenderDelayControllerImpl(
|
||||||
|
const AudioProcessing::Config::EchoCanceller3& config,
|
||||||
|
int sample_rate_hz);
|
||||||
~RenderDelayControllerImpl() override;
|
~RenderDelayControllerImpl() override;
|
||||||
void Reset() override;
|
void Reset() override;
|
||||||
void SetDelay(size_t render_delay) override;
|
void SetDelay(size_t render_delay) override;
|
||||||
@ -68,10 +71,12 @@ size_t ComputeNewBufferDelay(size_t current_delay,
|
|||||||
|
|
||||||
int RenderDelayControllerImpl::instance_count_ = 0;
|
int RenderDelayControllerImpl::instance_count_ = 0;
|
||||||
|
|
||||||
RenderDelayControllerImpl::RenderDelayControllerImpl(int sample_rate_hz)
|
RenderDelayControllerImpl::RenderDelayControllerImpl(
|
||||||
|
const AudioProcessing::Config::EchoCanceller3& config,
|
||||||
|
int sample_rate_hz)
|
||||||
: data_dumper_(
|
: data_dumper_(
|
||||||
new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
|
new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
|
||||||
delay_estimator_(data_dumper_.get()) {
|
delay_estimator_(data_dumper_.get(), config) {
|
||||||
RTC_DCHECK(ValidFullBandRate(sample_rate_hz));
|
RTC_DCHECK(ValidFullBandRate(sample_rate_hz));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,8 +139,10 @@ size_t RenderDelayControllerImpl::GetDelay(
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
RenderDelayController* RenderDelayController::Create(int sample_rate_hz) {
|
RenderDelayController* RenderDelayController::Create(
|
||||||
return new RenderDelayControllerImpl(sample_rate_hz);
|
const AudioProcessing::Config::EchoCanceller3& config,
|
||||||
|
int sample_rate_hz) {
|
||||||
|
return new RenderDelayControllerImpl(config, sample_rate_hz);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|||||||
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include "webrtc/modules/audio_processing/aec3/downsampled_render_buffer.h"
|
#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/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/modules/audio_processing/logging/apm_data_dumper.h"
|
||||||
#include "webrtc/rtc_base/array_view.h"
|
#include "webrtc/rtc_base/array_view.h"
|
||||||
#include "webrtc/rtc_base/optional.h"
|
#include "webrtc/rtc_base/optional.h"
|
||||||
@ -22,7 +23,9 @@ namespace webrtc {
|
|||||||
// Class for aligning the render and capture signal using a RenderDelayBuffer.
|
// Class for aligning the render and capture signal using a RenderDelayBuffer.
|
||||||
class RenderDelayController {
|
class RenderDelayController {
|
||||||
public:
|
public:
|
||||||
static RenderDelayController* Create(int sample_rate_hz);
|
static RenderDelayController* Create(
|
||||||
|
const AudioProcessing::Config::EchoCanceller3& config,
|
||||||
|
int sample_rate_hz);
|
||||||
virtual ~RenderDelayController() = default;
|
virtual ~RenderDelayController() = default;
|
||||||
|
|
||||||
// Resets the delay controller.
|
// Resets the delay controller.
|
||||||
|
|||||||
@ -50,7 +50,8 @@ TEST(RenderDelayController, NoRenderSignal) {
|
|||||||
std::unique_ptr<RenderDelayBuffer> delay_buffer(
|
std::unique_ptr<RenderDelayBuffer> delay_buffer(
|
||||||
RenderDelayBuffer::Create(NumBandsForRate(rate)));
|
RenderDelayBuffer::Create(NumBandsForRate(rate)));
|
||||||
std::unique_ptr<RenderDelayController> delay_controller(
|
std::unique_ptr<RenderDelayController> delay_controller(
|
||||||
RenderDelayController::Create(rate));
|
RenderDelayController::Create(AudioProcessing::Config::EchoCanceller3(),
|
||||||
|
rate));
|
||||||
for (size_t k = 0; k < 100; ++k) {
|
for (size_t k = 0; k < 100; ++k) {
|
||||||
EXPECT_EQ(0u, delay_controller->GetDelay(
|
EXPECT_EQ(0u, delay_controller->GetDelay(
|
||||||
delay_buffer->GetDownsampledRenderBuffer(), block));
|
delay_buffer->GetDownsampledRenderBuffer(), block));
|
||||||
@ -68,7 +69,8 @@ TEST(RenderDelayController, BasicApiCalls) {
|
|||||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||||
RenderDelayBuffer::Create(NumBandsForRate(rate)));
|
RenderDelayBuffer::Create(NumBandsForRate(rate)));
|
||||||
std::unique_ptr<RenderDelayController> delay_controller(
|
std::unique_ptr<RenderDelayController> delay_controller(
|
||||||
RenderDelayController::Create(rate));
|
RenderDelayController::Create(AudioProcessing::Config::EchoCanceller3(),
|
||||||
|
rate));
|
||||||
for (size_t k = 0; k < 10; ++k) {
|
for (size_t k = 0; k < 10; ++k) {
|
||||||
render_delay_buffer->Insert(render_block);
|
render_delay_buffer->Insert(render_block);
|
||||||
render_delay_buffer->UpdateBuffers();
|
render_delay_buffer->UpdateBuffers();
|
||||||
@ -95,7 +97,8 @@ TEST(RenderDelayController, Alignment) {
|
|||||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||||
RenderDelayBuffer::Create(NumBandsForRate(rate)));
|
RenderDelayBuffer::Create(NumBandsForRate(rate)));
|
||||||
std::unique_ptr<RenderDelayController> delay_controller(
|
std::unique_ptr<RenderDelayController> delay_controller(
|
||||||
RenderDelayController::Create(rate));
|
RenderDelayController::Create(
|
||||||
|
AudioProcessing::Config::EchoCanceller3(), rate));
|
||||||
DelayBuffer<float> signal_delay_buffer(delay_samples);
|
DelayBuffer<float> signal_delay_buffer(delay_samples);
|
||||||
for (size_t k = 0; k < (400 + delay_samples / kBlockSize); ++k) {
|
for (size_t k = 0; k < (400 + delay_samples / kBlockSize); ++k) {
|
||||||
RandomizeSampleVector(&random_generator, render_block[0]);
|
RandomizeSampleVector(&random_generator, render_block[0]);
|
||||||
@ -139,7 +142,8 @@ TEST(RenderDelayController, AlignmentWithJitter) {
|
|||||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||||
RenderDelayBuffer::Create(NumBandsForRate(rate)));
|
RenderDelayBuffer::Create(NumBandsForRate(rate)));
|
||||||
std::unique_ptr<RenderDelayController> delay_controller(
|
std::unique_ptr<RenderDelayController> delay_controller(
|
||||||
RenderDelayController::Create(rate));
|
RenderDelayController::Create(
|
||||||
|
AudioProcessing::Config::EchoCanceller3(), rate));
|
||||||
DelayBuffer<float> signal_delay_buffer(delay_samples);
|
DelayBuffer<float> signal_delay_buffer(delay_samples);
|
||||||
for (size_t j = 0;
|
for (size_t j = 0;
|
||||||
j <
|
j <
|
||||||
@ -188,7 +192,8 @@ TEST(RenderDelayController, InitialHeadroom) {
|
|||||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||||
RenderDelayBuffer::Create(NumBandsForRate(rate)));
|
RenderDelayBuffer::Create(NumBandsForRate(rate)));
|
||||||
std::unique_ptr<RenderDelayController> delay_controller(
|
std::unique_ptr<RenderDelayController> delay_controller(
|
||||||
RenderDelayController::Create(rate));
|
RenderDelayController::Create(AudioProcessing::Config::EchoCanceller3(),
|
||||||
|
rate));
|
||||||
EXPECT_FALSE(delay_controller->AlignmentHeadroomSamples());
|
EXPECT_FALSE(delay_controller->AlignmentHeadroomSamples());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -204,7 +209,8 @@ TEST(RenderDelayController, WrongCaptureSize) {
|
|||||||
RenderDelayBuffer::Create(NumBandsForRate(rate)));
|
RenderDelayBuffer::Create(NumBandsForRate(rate)));
|
||||||
EXPECT_DEATH(
|
EXPECT_DEATH(
|
||||||
std::unique_ptr<RenderDelayController>(
|
std::unique_ptr<RenderDelayController>(
|
||||||
RenderDelayController::Create(rate))
|
RenderDelayController::Create(
|
||||||
|
AudioProcessing::Config::EchoCanceller3(), rate))
|
||||||
->GetDelay(render_delay_buffer->GetDownsampledRenderBuffer(),
|
->GetDelay(render_delay_buffer->GetDownsampledRenderBuffer(),
|
||||||
block),
|
block),
|
||||||
"");
|
"");
|
||||||
@ -219,8 +225,9 @@ TEST(RenderDelayController, DISABLED_WrongSampleRate) {
|
|||||||
SCOPED_TRACE(ProduceDebugText(rate));
|
SCOPED_TRACE(ProduceDebugText(rate));
|
||||||
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
|
||||||
RenderDelayBuffer::Create(NumBandsForRate(rate)));
|
RenderDelayBuffer::Create(NumBandsForRate(rate)));
|
||||||
EXPECT_DEATH(std::unique_ptr<RenderDelayController>(
|
EXPECT_DEATH(
|
||||||
RenderDelayController::Create(rate)),
|
std::unique_ptr<RenderDelayController>(RenderDelayController::Create(
|
||||||
|
AudioProcessing::Config::EchoCanceller3(), rate)),
|
||||||
"");
|
"");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -292,8 +292,14 @@ class AudioProcessing : public rtc::RefCountInterface {
|
|||||||
struct EchoAudibility {
|
struct EchoAudibility {
|
||||||
float low_render_limit = 192.f;
|
float low_render_limit = 192.f;
|
||||||
float normal_render_limit = 64.f;
|
float normal_render_limit = 64.f;
|
||||||
|
float active_render_limit = 100.f;
|
||||||
} echo_audibility;
|
} echo_audibility;
|
||||||
|
|
||||||
|
struct RenderLevels {
|
||||||
|
float active_render_limit = 100.f;
|
||||||
|
float poor_excitation_render_limit = 150.f;
|
||||||
|
} render_levels;
|
||||||
|
|
||||||
struct GainUpdates {
|
struct GainUpdates {
|
||||||
struct GainChanges {
|
struct GainChanges {
|
||||||
float max_inc;
|
float max_inc;
|
||||||
|
|||||||
Reference in New Issue
Block a user