Analog AGC: Add clipping rate metrics
Add a histogram WebRTC.Audio.Agc.InputClippingRate and logging of max clipping rate in AgcManagerDirect. Bug: webrtc:12774 Change-Id: I4a72119b65ad032fc50672e2a8fb4a4d55e1ff24 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/225264 Commit-Queue: Hanna Silen <silen@webrtc.org> Reviewed-by: Minyue Li <minyue@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34450}
This commit is contained in:
parent
a88d5f6733
commit
e7e9292fe8
@ -160,6 +160,13 @@ void LogClippingPredictorMetrics(const ClippingPredictorEvaluator& evaluator) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LogClippingMetrics(int clipping_rate) {
|
||||||
|
RTC_LOG(LS_INFO) << "Input clipping rate: " << clipping_rate << "%";
|
||||||
|
RTC_HISTOGRAM_COUNTS_LINEAR("WebRTC.Audio.Agc.InputClippingRate",
|
||||||
|
clipping_rate, /*min=*/0, /*max=*/100,
|
||||||
|
/*bucket_count=*/50);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
MonoAgc::MonoAgc(ApmDataDumper* data_dumper,
|
MonoAgc::MonoAgc(ApmDataDumper* data_dumper,
|
||||||
@ -480,7 +487,9 @@ AgcManagerDirect::AgcManagerDirect(
|
|||||||
use_clipping_predictor_step_(!!clipping_predictor_ &&
|
use_clipping_predictor_step_(!!clipping_predictor_ &&
|
||||||
clipping_config.use_predicted_step),
|
clipping_config.use_predicted_step),
|
||||||
clipping_predictor_evaluator_(kClippingPredictorEvaluatorHistorySize),
|
clipping_predictor_evaluator_(kClippingPredictorEvaluatorHistorySize),
|
||||||
clipping_predictor_log_counter_(0) {
|
clipping_predictor_log_counter_(0),
|
||||||
|
clipping_rate_log_(0.0f),
|
||||||
|
clipping_rate_log_counter_(0) {
|
||||||
const int min_mic_level = GetMinMicLevel();
|
const int min_mic_level = GetMinMicLevel();
|
||||||
for (size_t ch = 0; ch < channel_agcs_.size(); ++ch) {
|
for (size_t ch = 0; ch < channel_agcs_.size(); ++ch) {
|
||||||
ApmDataDumper* data_dumper_ch = ch == 0 ? data_dumper_.get() : nullptr;
|
ApmDataDumper* data_dumper_ch = ch == 0 ? data_dumper_.get() : nullptr;
|
||||||
@ -511,6 +520,8 @@ void AgcManagerDirect::Initialize() {
|
|||||||
AggregateChannelLevels();
|
AggregateChannelLevels();
|
||||||
clipping_predictor_evaluator_.Reset();
|
clipping_predictor_evaluator_.Reset();
|
||||||
clipping_predictor_log_counter_ = 0;
|
clipping_predictor_log_counter_ = 0;
|
||||||
|
clipping_rate_log_ = 0.0f;
|
||||||
|
clipping_rate_log_counter_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AgcManagerDirect::SetupDigitalGainControl(
|
void AgcManagerDirect::SetupDigitalGainControl(
|
||||||
@ -553,11 +564,6 @@ void AgcManagerDirect::AnalyzePreProcess(const float* const* audio,
|
|||||||
clipping_predictor_->Analyze(frame);
|
clipping_predictor_->Analyze(frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (frames_since_clipped_ < clipped_wait_frames_) {
|
|
||||||
++frames_since_clipped_;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for clipped samples, as the AGC has difficulty detecting pitch
|
// Check for clipped samples, as the AGC has difficulty detecting pitch
|
||||||
// under clipping distortion. We do this in the preprocessing phase in order
|
// under clipping distortion. We do this in the preprocessing phase in order
|
||||||
// to catch clipped echo as well.
|
// to catch clipped echo as well.
|
||||||
@ -569,6 +575,20 @@ void AgcManagerDirect::AnalyzePreProcess(const float* const* audio,
|
|||||||
// gain is increased, through SetMaxLevel().
|
// gain is increased, through SetMaxLevel().
|
||||||
float clipped_ratio =
|
float clipped_ratio =
|
||||||
ComputeClippedRatio(audio, num_capture_channels_, samples_per_channel);
|
ComputeClippedRatio(audio, num_capture_channels_, samples_per_channel);
|
||||||
|
clipping_rate_log_ = std::max(clipped_ratio, clipping_rate_log_);
|
||||||
|
clipping_rate_log_counter_++;
|
||||||
|
constexpr int kNumFramesIn30Seconds = 3000;
|
||||||
|
if (clipping_rate_log_counter_ == kNumFramesIn30Seconds) {
|
||||||
|
LogClippingMetrics(std::round(100.0f * clipping_rate_log_));
|
||||||
|
clipping_rate_log_ = 0.0f;
|
||||||
|
clipping_rate_log_counter_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (frames_since_clipped_ < clipped_wait_frames_) {
|
||||||
|
++frames_since_clipped_;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const bool clipping_detected = clipped_ratio > clipped_ratio_threshold_;
|
const bool clipping_detected = clipped_ratio > clipped_ratio_threshold_;
|
||||||
bool clipping_predicted = false;
|
bool clipping_predicted = false;
|
||||||
int predicted_step = 0;
|
int predicted_step = 0;
|
||||||
@ -592,7 +612,6 @@ void AgcManagerDirect::AnalyzePreProcess(const float* const* audio,
|
|||||||
prediction_interval.value(), /*min=*/0,
|
prediction_interval.value(), /*min=*/0,
|
||||||
/*max=*/49, /*bucket_count=*/50);
|
/*max=*/49, /*bucket_count=*/50);
|
||||||
}
|
}
|
||||||
constexpr int kNumFramesIn30Seconds = 3000;
|
|
||||||
clipping_predictor_log_counter_++;
|
clipping_predictor_log_counter_++;
|
||||||
if (clipping_predictor_log_counter_ == kNumFramesIn30Seconds) {
|
if (clipping_predictor_log_counter_ == kNumFramesIn30Seconds) {
|
||||||
LogClippingPredictorMetrics(clipping_predictor_evaluator_);
|
LogClippingPredictorMetrics(clipping_predictor_evaluator_);
|
||||||
|
|||||||
@ -152,6 +152,8 @@ class AgcManagerDirect final {
|
|||||||
const bool use_clipping_predictor_step_;
|
const bool use_clipping_predictor_step_;
|
||||||
ClippingPredictorEvaluator clipping_predictor_evaluator_;
|
ClippingPredictorEvaluator clipping_predictor_evaluator_;
|
||||||
int clipping_predictor_log_counter_;
|
int clipping_predictor_log_counter_;
|
||||||
|
float clipping_rate_log_;
|
||||||
|
int clipping_rate_log_counter_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class MonoAgc {
|
class MonoAgc {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user