AGC2 Saturation Protector always on

Tested: bit-exactness verified with audioproc_f

Bug: webrtc:7494
Change-Id: I9f6c22c097b15c83a68e9fbc256abd161626df93
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/185816
Commit-Queue: Alessio Bazzica <alessiob@webrtc.org>
Reviewed-by: Ivo Creusen <ivoc@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#32255}
This commit is contained in:
Alessio Bazzica 2020-09-30 13:20:09 +02:00 committed by Commit Bot
parent 80869c2202
commit 57ad54332b
4 changed files with 22 additions and 35 deletions

View File

@ -13,6 +13,7 @@
#include "modules/audio_processing/agc2/agc2_common.h"
#include "modules/audio_processing/logging/apm_data_dumper.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
#include "rtc_base/numerics/safe_minmax.h"
namespace webrtc {
@ -23,14 +24,10 @@ using LevelEstimatorType =
// Combines a level estimation with the saturation protector margins.
float ComputeLevelEstimateDbfs(float level_estimate_dbfs,
bool use_saturation_protector,
float saturation_margin_db,
float extra_saturation_margin_db) {
return rtc::SafeClamp<float>(
level_estimate_dbfs +
(use_saturation_protector
? (saturation_margin_db + extra_saturation_margin_db)
: 0.f),
level_estimate_dbfs + saturation_margin_db + extra_saturation_margin_db,
-90.f, 30.f);
}
@ -68,7 +65,6 @@ AdaptiveModeLevelEstimator::AdaptiveModeLevelEstimator(
apm_data_dumper,
AudioProcessing::Config::GainController2::LevelEstimator::kRms,
kDefaultAdjacentSpeechFramesThreshold,
kDefaultUseSaturationProtector,
kDefaultInitialSaturationMarginDb,
kDefaultExtraSaturationMarginDb) {}
@ -80,25 +76,25 @@ AdaptiveModeLevelEstimator::AdaptiveModeLevelEstimator(
: AdaptiveModeLevelEstimator(apm_data_dumper,
level_estimator,
kDefaultAdjacentSpeechFramesThreshold,
use_saturation_protector,
kDefaultInitialSaturationMarginDb,
extra_saturation_margin_db) {}
extra_saturation_margin_db) {
if (!use_saturation_protector) {
RTC_LOG(LS_WARNING) << "The saturation protector cannot be disabled.";
}
}
AdaptiveModeLevelEstimator::AdaptiveModeLevelEstimator(
ApmDataDumper* apm_data_dumper,
AudioProcessing::Config::GainController2::LevelEstimator level_estimator,
int adjacent_speech_frames_threshold,
bool use_saturation_protector,
float initial_saturation_margin_db,
float extra_saturation_margin_db)
: apm_data_dumper_(apm_data_dumper),
level_estimator_type_(level_estimator),
adjacent_speech_frames_threshold_(adjacent_speech_frames_threshold),
use_saturation_protector_(use_saturation_protector),
initial_saturation_margin_db_(initial_saturation_margin_db),
extra_saturation_margin_db_(extra_saturation_margin_db),
level_dbfs_(ComputeLevelEstimateDbfs(kInitialSpeechLevelEstimateDbfs,
use_saturation_protector_,
initial_saturation_margin_db_,
extra_saturation_margin_db_)) {
RTC_DCHECK(apm_data_dumper_);
@ -157,16 +153,13 @@ void AdaptiveModeLevelEstimator::Update(
const float level_dbfs = preliminary_state_.level_dbfs.GetRatio();
if (use_saturation_protector_) {
UpdateSaturationProtectorState(vad_level.peak_dbfs, level_dbfs,
preliminary_state_.saturation_protector);
}
UpdateSaturationProtectorState(vad_level.peak_dbfs, level_dbfs,
preliminary_state_.saturation_protector);
if (num_adjacent_speech_frames_ >= adjacent_speech_frames_threshold_) {
// `preliminary_state_` is now reliable. Update the last level estimation.
level_dbfs_ = ComputeLevelEstimateDbfs(
level_dbfs, use_saturation_protector_,
preliminary_state_.saturation_protector.margin_db,
level_dbfs, preliminary_state_.saturation_protector.margin_db,
extra_saturation_margin_db_);
}
}
@ -190,9 +183,9 @@ bool AdaptiveModeLevelEstimator::IsConfident() const {
void AdaptiveModeLevelEstimator::Reset() {
ResetLevelEstimatorState(preliminary_state_);
ResetLevelEstimatorState(reliable_state_);
level_dbfs_ = ComputeLevelEstimateDbfs(
kInitialSpeechLevelEstimateDbfs, use_saturation_protector_,
initial_saturation_margin_db_, extra_saturation_margin_db_);
level_dbfs_ = ComputeLevelEstimateDbfs(kInitialSpeechLevelEstimateDbfs,
initial_saturation_margin_db_,
extra_saturation_margin_db_);
num_adjacent_speech_frames_ = 0;
}

View File

@ -29,7 +29,8 @@ class AdaptiveModeLevelEstimator {
AdaptiveModeLevelEstimator(const AdaptiveModeLevelEstimator&) = delete;
AdaptiveModeLevelEstimator& operator=(const AdaptiveModeLevelEstimator&) =
delete;
// Deprecated ctor.
// Deprecated ctor. `use_saturation_protector` is ignored and the saturation
// protector will be used regardless of what is passed.
AdaptiveModeLevelEstimator(
ApmDataDumper* apm_data_dumper,
AudioProcessing::Config::GainController2::LevelEstimator level_estimator,
@ -40,7 +41,6 @@ class AdaptiveModeLevelEstimator {
ApmDataDumper* apm_data_dumper,
AudioProcessing::Config::GainController2::LevelEstimator level_estimator,
int adjacent_speech_frames_threshold,
bool use_saturation_protector,
float initial_saturation_margin_db,
float extra_saturation_margin_db);
@ -65,7 +65,7 @@ class AdaptiveModeLevelEstimator {
float denominator;
float GetRatio() const;
};
// TODO(crbug.com/webrtc/7494): Remove if saturation protector always used.
// TODO(crbug.com/webrtc/7494): Remove time_to_full_buffer_ms if redundant.
int time_to_full_buffer_ms;
Ratio level_dbfs;
SaturationProtectorState saturation_protector;
@ -81,7 +81,6 @@ class AdaptiveModeLevelEstimator {
const AudioProcessing::Config::GainController2::LevelEstimator
level_estimator_type_;
const int adjacent_speech_frames_threshold_;
const bool use_saturation_protector_;
const float initial_saturation_margin_db_;
const float extra_saturation_margin_db_;
LevelEstimatorState preliminary_state_;

View File

@ -50,7 +50,6 @@ struct TestLevelEstimator {
&data_dumper,
AudioProcessing::Config::GainController2::LevelEstimator::kRms,
/*min_consecutive_speech_frames=*/1,
/*use_saturation_protector=*/true,
kInitialSaturationMarginDb,
kExtraSaturationMarginDb)) {}
ApmDataDumper data_dumper;
@ -192,7 +191,6 @@ TEST(AutomaticGainController2AdaptiveModeLevelEstimator,
struct TestConfig {
int min_consecutive_speech_frames;
bool use_saturation_protector;
float initial_saturation_margin_db;
float extra_saturation_margin_db;
};
@ -206,8 +204,8 @@ TEST_P(AdaptiveModeLevelEstimatorTest, DoNotAdaptToShortSpeechSegments) {
AdaptiveModeLevelEstimator level_estimator(
&apm_data_dumper,
AudioProcessing::Config::GainController2::LevelEstimator::kRms,
params.min_consecutive_speech_frames, params.use_saturation_protector,
params.initial_saturation_margin_db, params.extra_saturation_margin_db);
params.min_consecutive_speech_frames, params.initial_saturation_margin_db,
params.extra_saturation_margin_db);
const float initial_level = level_estimator.level_dbfs();
ASSERT_LT(initial_level, kVadDataSpeech.rms_dbfs);
for (int i = 0; i < params.min_consecutive_speech_frames - 1; ++i) {
@ -225,8 +223,8 @@ TEST_P(AdaptiveModeLevelEstimatorTest, AdaptToEnoughSpeechSegments) {
AdaptiveModeLevelEstimator level_estimator(
&apm_data_dumper,
AudioProcessing::Config::GainController2::LevelEstimator::kRms,
params.min_consecutive_speech_frames, params.use_saturation_protector,
params.initial_saturation_margin_db, params.extra_saturation_margin_db);
params.min_consecutive_speech_frames, params.initial_saturation_margin_db,
params.extra_saturation_margin_db);
const float initial_level = level_estimator.level_dbfs();
ASSERT_LT(initial_level, kVadDataSpeech.rms_dbfs);
for (int i = 0; i < params.min_consecutive_speech_frames; ++i) {
@ -237,10 +235,8 @@ TEST_P(AdaptiveModeLevelEstimatorTest, AdaptToEnoughSpeechSegments) {
INSTANTIATE_TEST_SUITE_P(AutomaticGainController2,
AdaptiveModeLevelEstimatorTest,
::testing::Values(TestConfig{1, false, 0.f, 0.f},
TestConfig{1, true, 0.f, 0.f},
TestConfig{9, false, 0.f, 0.f},
TestConfig{9, true, 0.f, 0.f}));
::testing::Values(TestConfig{1, 0.f, 0.f},
TestConfig{9, 0.f, 0.f}));
} // namespace
} // namespace webrtc

View File

@ -54,7 +54,6 @@ constexpr float kDefaultSmoothedVadProbabilityAttack = 1.f;
constexpr int kDefaultAdjacentSpeechFramesThreshold = 1;
// Saturation Protector settings.
constexpr bool kDefaultUseSaturationProtector = true;
constexpr float kDefaultInitialSaturationMarginDb = 20.f;
constexpr float kDefaultExtraSaturationMarginDb = 2.f;