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:
parent
80869c2202
commit
57ad54332b
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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_;
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user