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; |