Added flags for the adaptive analog AGC in audioproc_f.

Added back the 'agc2 level estimation' flag. Also added a flag for
moving the level measurement before AEC and NS. This is to run offline
experiments with audioproc_f.


Bug: webrtc:7494
Change-Id: I3e3ffceede7166b754130be2b707b620ba527e9f
Reviewed-on: https://webrtc-review.googlesource.com/97442
Reviewed-by: Alessio Bazzica <alessiob@webrtc.org>
Commit-Queue: Alex Loiko <aleloi@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24657}
This commit is contained in:
Alex Loiko 2018-09-10 13:59:41 +02:00 committed by Commit Bot
parent b2d7116733
commit d934244feb
8 changed files with 47 additions and 13 deletions

View File

@ -17,7 +17,7 @@ namespace webrtc {
AdaptiveModeLevelEstimatorAgc::AdaptiveModeLevelEstimatorAgc( AdaptiveModeLevelEstimatorAgc::AdaptiveModeLevelEstimatorAgc(
ApmDataDumper* apm_data_dumper) ApmDataDumper* apm_data_dumper)
: level_estimator_(apm_data_dumper) { : level_estimator_(apm_data_dumper) {
set_target_level_dbfs(kDefaultLevelDbfs); set_target_level_dbfs(kDefaultAgc2LevelHeadroomDbfs);
} }
// |audio| must be mono; in a multi-channel stream, provide the first (usually // |audio| must be mono; in a multi-channel stream, provide the first (usually

View File

@ -38,7 +38,7 @@ class AdaptiveModeLevelEstimatorAgc : public Agc {
private: private:
static constexpr int kTimeUntilConfidentMs = 700; static constexpr int kTimeUntilConfidentMs = 700;
static constexpr int kDefaultLevelDbfs = 0; static constexpr int kDefaultAgc2LevelHeadroomDbfs = -1;
int32_t time_in_ms_since_last_estimate_ = 0; int32_t time_in_ms_since_last_estimate_ = 0;
AdaptiveModeLevelEstimator level_estimator_; AdaptiveModeLevelEstimator level_estimator_;
VadWithLevel agc2_vad_; VadWithLevel agc2_vad_;

View File

@ -365,13 +365,15 @@ AudioProcessingImpl::AudioProcessingImpl(
constants_(config.Get<ExperimentalAgc>().startup_min_volume, constants_(config.Get<ExperimentalAgc>().startup_min_volume,
config.Get<ExperimentalAgc>().clipped_level_min, config.Get<ExperimentalAgc>().clipped_level_min,
#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS) #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
false, /* enabled= */ false,
false, /* enabled_agc2_level_estimator= */ false,
false), /* digital_adaptive_disabled= */ false,
/* analyze_before_aec= */ false),
#else #else
config.Get<ExperimentalAgc>().enabled, config.Get<ExperimentalAgc>().enabled,
config.Get<ExperimentalAgc>().enabled_agc2_level_estimator, config.Get<ExperimentalAgc>().enabled_agc2_level_estimator,
config.Get<ExperimentalAgc>().digital_adaptive_disabled), config.Get<ExperimentalAgc>().digital_adaptive_disabled,
config.Get<ExperimentalAgc>().analyze_before_aec),
#endif #endif
#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS) #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
capture_(false), capture_(false),
@ -1221,6 +1223,13 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() {
private_submodules_->agc_manager->AnalyzePreProcess( private_submodules_->agc_manager->AnalyzePreProcess(
capture_buffer->channels()[0], capture_buffer->num_channels(), capture_buffer->channels()[0], capture_buffer->num_channels(),
capture_nonlocked_.capture_processing_format.num_frames()); capture_nonlocked_.capture_processing_format.num_frames());
if (constants_.use_experimental_agc_process_before_aec) {
private_submodules_->agc_manager->Process(
capture_buffer->channels()[0],
capture_nonlocked_.capture_processing_format.num_frames(),
capture_nonlocked_.capture_processing_format.sample_rate_hz());
}
} }
if (submodule_states_.CaptureMultiBandSubModulesActive() && if (submodule_states_.CaptureMultiBandSubModulesActive() &&
@ -1290,7 +1299,8 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() {
public_submodules_->voice_detection->ProcessCaptureAudio(capture_buffer); public_submodules_->voice_detection->ProcessCaptureAudio(capture_buffer);
if (constants_.use_experimental_agc && if (constants_.use_experimental_agc &&
public_submodules_->gain_control->is_enabled()) { public_submodules_->gain_control->is_enabled() &&
!constants_.use_experimental_agc_process_before_aec) {
private_submodules_->agc_manager->Process( private_submodules_->agc_manager->Process(
capture_buffer->split_bands_const(0)[kBand0To8kHz], capture_buffer->split_bands_const(0)[kBand0To8kHz],
capture_buffer->num_frames_per_band(), capture_nonlocked_.split_rate); capture_buffer->num_frames_per_band(), capture_nonlocked_.split_rate);

View File

@ -355,7 +355,8 @@ class AudioProcessingImpl : public AudioProcessing {
int agc_clipped_level_min, int agc_clipped_level_min,
bool use_experimental_agc, bool use_experimental_agc,
bool use_experimental_agc_agc2_level_estimation, bool use_experimental_agc_agc2_level_estimation,
bool use_experimental_agc_agc2_digital_adaptive) bool use_experimental_agc_agc2_digital_adaptive,
bool use_experimental_agc_process_before_aec)
: // Format of processing streams at input/output call sites. : // Format of processing streams at input/output call sites.
agc_startup_min_volume(agc_startup_min_volume), agc_startup_min_volume(agc_startup_min_volume),
agc_clipped_level_min(agc_clipped_level_min), agc_clipped_level_min(agc_clipped_level_min),
@ -363,12 +364,15 @@ class AudioProcessingImpl : public AudioProcessing {
use_experimental_agc_agc2_level_estimation( use_experimental_agc_agc2_level_estimation(
use_experimental_agc_agc2_level_estimation), use_experimental_agc_agc2_level_estimation),
use_experimental_agc_agc2_digital_adaptive( use_experimental_agc_agc2_digital_adaptive(
use_experimental_agc_agc2_digital_adaptive) {} use_experimental_agc_agc2_digital_adaptive),
use_experimental_agc_process_before_aec(
use_experimental_agc_process_before_aec) {}
int agc_startup_min_volume; int agc_startup_min_volume;
int agc_clipped_level_min; int agc_clipped_level_min;
bool use_experimental_agc; bool use_experimental_agc;
bool use_experimental_agc_agc2_level_estimation; bool use_experimental_agc_agc2_level_estimation;
bool use_experimental_agc_agc2_digital_adaptive; bool use_experimental_agc_agc2_digital_adaptive;
bool use_experimental_agc_process_before_aec;
} constants_; } constants_;

View File

@ -122,10 +122,12 @@ struct ExperimentalAgc {
explicit ExperimentalAgc(bool enabled) : enabled(enabled) {} explicit ExperimentalAgc(bool enabled) : enabled(enabled) {}
ExperimentalAgc(bool enabled, ExperimentalAgc(bool enabled,
bool enabled_agc2_level_estimator, bool enabled_agc2_level_estimator,
bool digital_adaptive_disabled) bool digital_adaptive_disabled,
bool analyze_before_aec)
: enabled(enabled), : enabled(enabled),
enabled_agc2_level_estimator(enabled_agc2_level_estimator), enabled_agc2_level_estimator(enabled_agc2_level_estimator),
digital_adaptive_disabled(digital_adaptive_disabled) {} digital_adaptive_disabled(digital_adaptive_disabled),
analyze_before_aec(analyze_before_aec) {}
ExperimentalAgc(bool enabled, int startup_min_volume) ExperimentalAgc(bool enabled, int startup_min_volume)
: enabled(enabled), startup_min_volume(startup_min_volume) {} : enabled(enabled), startup_min_volume(startup_min_volume) {}
@ -140,6 +142,9 @@ struct ExperimentalAgc {
int clipped_level_min = kClippedLevelMin; int clipped_level_min = kClippedLevelMin;
bool enabled_agc2_level_estimator = false; bool enabled_agc2_level_estimator = false;
bool digital_adaptive_disabled = false; bool digital_adaptive_disabled = false;
// 'analyze_before_aec' is an experimental flag. It is intended to be removed
// at some point.
bool analyze_before_aec = false;
}; };
// Use to enable experimental noise suppression. It can be set in the // Use to enable experimental noise suppression. It can be set in the

View File

@ -730,7 +730,9 @@ void AudioProcessingSimulator::CreateAudioProcessor() {
!!settings_.use_experimental_agc_agc2_level_estimator && !!settings_.use_experimental_agc_agc2_level_estimator &&
*settings_.use_experimental_agc_agc2_level_estimator, *settings_.use_experimental_agc_agc2_level_estimator,
!!settings_.experimental_agc_disable_digital_adaptive && !!settings_.experimental_agc_disable_digital_adaptive &&
*settings_.experimental_agc_disable_digital_adaptive)); *settings_.experimental_agc_disable_digital_adaptive,
!!settings_.experimental_agc_analyze_before_aec &&
*settings_.experimental_agc_analyze_before_aec));
if (settings_.use_ed) { if (settings_.use_ed) {
apm_config.residual_echo_detector.enabled = *settings_.use_ed; apm_config.residual_echo_detector.enabled = *settings_.use_ed;
} }

View File

@ -68,6 +68,7 @@ struct SimulationSettings {
absl::optional<bool> use_experimental_agc; absl::optional<bool> use_experimental_agc;
absl::optional<bool> use_experimental_agc_agc2_level_estimator; absl::optional<bool> use_experimental_agc_agc2_level_estimator;
absl::optional<bool> experimental_agc_disable_digital_adaptive; absl::optional<bool> experimental_agc_disable_digital_adaptive;
absl::optional<bool> experimental_agc_analyze_before_aec;
absl::optional<int> aecm_routing_mode; absl::optional<int> aecm_routing_mode;
absl::optional<bool> use_aecm_comfort_noise; absl::optional<bool> use_aecm_comfort_noise;
absl::optional<int> agc_mode; absl::optional<int> agc_mode;

View File

@ -119,6 +119,15 @@ DEFINE_int(experimental_agc_disable_digital_adaptive,
kParameterNotSpecifiedValue, kParameterNotSpecifiedValue,
"Force-deactivate (1) digital adaptation in " "Force-deactivate (1) digital adaptation in "
"experimental AGC. Digital adaptation is active by default (0)."); "experimental AGC. Digital adaptation is active by default (0).");
DEFINE_int(experimental_agc_analyze_before_aec,
kParameterNotSpecifiedValue,
"Make level estimation happen before AEC"
" in the experimental AGC. After AEC is the default (0)");
DEFINE_int(
experimental_agc_agc2_level_estimator,
kParameterNotSpecifiedValue,
"AGC2 level estimation"
" in the experimental AGC. AGC1 level estimation is the default (0)");
DEFINE_int( DEFINE_int(
refined_adaptive_filter, refined_adaptive_filter,
kParameterNotSpecifiedValue, kParameterNotSpecifiedValue,
@ -259,7 +268,10 @@ SimulationSettings CreateSettings() {
SetSettingIfFlagSet(FLAG_experimental_agc, &settings.use_experimental_agc); SetSettingIfFlagSet(FLAG_experimental_agc, &settings.use_experimental_agc);
SetSettingIfFlagSet(FLAG_experimental_agc_disable_digital_adaptive, SetSettingIfFlagSet(FLAG_experimental_agc_disable_digital_adaptive,
&settings.experimental_agc_disable_digital_adaptive); &settings.experimental_agc_disable_digital_adaptive);
SetSettingIfFlagSet(FLAG_experimental_agc_analyze_before_aec,
&settings.experimental_agc_analyze_before_aec);
SetSettingIfFlagSet(FLAG_experimental_agc_agc2_level_estimator,
&settings.use_experimental_agc_agc2_level_estimator);
SetSettingIfSpecified(FLAG_aecm_routing_mode, &settings.aecm_routing_mode); SetSettingIfSpecified(FLAG_aecm_routing_mode, &settings.aecm_routing_mode);
SetSettingIfFlagSet(FLAG_aecm_comfort_noise, SetSettingIfFlagSet(FLAG_aecm_comfort_noise,
&settings.use_aecm_comfort_noise); &settings.use_aecm_comfort_noise);