Chromium Code Reviews

Unified Diff: webrtc/modules/audio_processing/aec/aec_core.cc

Issue 1739993003: Adding fraction of filter divergence in AEC metrics. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Index: webrtc/modules/audio_processing/aec/aec_core.cc
diff --git a/webrtc/modules/audio_processing/aec/aec_core.cc b/webrtc/modules/audio_processing/aec/aec_core.cc
index 2cc2968f81c2e2ffc658d15ba048e3890d8a4a47..4f07a00800c756dc40458f518a13e86741ca75fa 100644
--- a/webrtc/modules/audio_processing/aec/aec_core.cc
+++ b/webrtc/modules/audio_processing/aec/aec_core.cc
@@ -48,6 +48,11 @@ static const int subCountLen = 4;
static const int countLen = 50;
static const int kDelayMetricsAggregationWindow = 1250; // 5 seconds at 16 kHz.
tlegrand-webrtc 2016/03/02 15:30:29 I'm wondering if "Diverge" is the right term, or i
kwiberg-webrtc 2016/03/02 18:33:03 I believe "Divergent" is the trendy form.
+// Diverge metric is based on audio level, which gets updated which every
tlegrand-webrtc 2016/03/02 15:30:29 remove "which" in "which every"
+// |subCountLen + 1| * 10 milliseconds. Diverge metric takes the statistics of
+// |kDivergeMetricAggregationWindow| samples.
+static const int kDivergeMetricAggregationWindow = 50; // 1 seconds at 16 kHz.
+
// Quantities to control H band scaling for SWB input
static const float cnScaleHband = 0.4f; // scale for comfort noise in H band.
// Initial bin for averaging nlp gain in low band
@@ -554,6 +559,10 @@ static void InitMetrics(AecCore* self) {
InitStats(&self->erle);
InitStats(&self->aNlp);
InitStats(&self->rerl);
+
+ self->num_diverge_values = 0;
+ self->num_filter_diverge = 0;
+ self->fraction_filter_diverge = 0.0f;
}
static float CalculatePower(const float* in, size_t num_samples) {
@@ -611,6 +620,20 @@ static void UpdateMetrics(AecCore* aec) {
aec->stateCounter++;
}
+ if (aec->linoutlevel.sfrcounter == 0) {
+ // We count a filter divergence when the audio level of linear filter output
+ // is larger than that of near-end signal by -30dB or more.
peah-webrtc 2016/02/29 14:05:56 I don't think the usage of "-30dB" is correct. I t
+ if (aec->linoutlevel.framelevel > 1.001 * aec->nearlevel.framelevel)
+ aec->num_filter_diverge++;
+ aec->num_diverge_values++;
+ if (aec->num_diverge_values >= kDivergeMetricAggregationWindow) {
+ aec->fraction_filter_diverge =
+ static_cast<float>(aec->num_filter_diverge) / aec->num_diverge_values;
+ aec->num_diverge_values = 0;
+ aec->num_filter_diverge = 0;
+ }
+ }
+
if (aec->farlevel.frcounter == 0) {
if (aec->farlevel.minlevel < noisyPower) {
actThreshold = actThresholdClean;

Powered by Google App Engine