Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Side by Side 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. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 29 matching lines...) Expand all
40 #include "webrtc/system_wrappers/include/cpu_features_wrapper.h" 40 #include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
41 #include "webrtc/typedefs.h" 41 #include "webrtc/typedefs.h"
42 42
43 // Buffer size (samples) 43 // Buffer size (samples)
44 static const size_t kBufSizePartitions = 250; // 1 second of audio in 16 kHz. 44 static const size_t kBufSizePartitions = 250; // 1 second of audio in 16 kHz.
45 45
46 // Metrics 46 // Metrics
47 static const int subCountLen = 4; 47 static const int subCountLen = 4;
48 static const int countLen = 50; 48 static const int countLen = 50;
49 static const int kDelayMetricsAggregationWindow = 1250; // 5 seconds at 16 kHz. 49 static const int kDelayMetricsAggregationWindow = 1250; // 5 seconds at 16 kHz.
50 50
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.
51 // 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"
52 // |subCountLen + 1| * 10 milliseconds. Diverge metric takes the statistics of
53 // |kDivergeMetricAggregationWindow| samples.
54 static const int kDivergeMetricAggregationWindow = 50; // 1 seconds at 16 kHz.
55
51 // Quantities to control H band scaling for SWB input 56 // Quantities to control H band scaling for SWB input
52 static const float cnScaleHband = 0.4f; // scale for comfort noise in H band. 57 static const float cnScaleHband = 0.4f; // scale for comfort noise in H band.
53 // Initial bin for averaging nlp gain in low band 58 // Initial bin for averaging nlp gain in low band
54 static const int freqAvgIc = PART_LEN / 2; 59 static const int freqAvgIc = PART_LEN / 2;
55 60
56 // Matlab code to produce table: 61 // Matlab code to produce table:
57 // win = sqrt(hanning(63)); win = [0 ; win(1:32)]; 62 // win = sqrt(hanning(63)); win = [0 ; win(1:32)];
58 // fprintf(1, '\t%.14f, %.14f, %.14f,\n', win); 63 // fprintf(1, '\t%.14f, %.14f, %.14f,\n', win);
59 ALIGN16_BEG const float ALIGN16_END WebRtcAec_sqrtHanning[65] = { 64 ALIGN16_BEG const float ALIGN16_END WebRtcAec_sqrtHanning[65] = {
60 0.00000000000000f, 0.02454122852291f, 0.04906767432742f, 0.07356456359967f, 65 0.00000000000000f, 0.02454122852291f, 0.04906767432742f, 0.07356456359967f,
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 self->stateCounter = 0; 552 self->stateCounter = 0;
548 InitLevel(&self->farlevel); 553 InitLevel(&self->farlevel);
549 InitLevel(&self->nearlevel); 554 InitLevel(&self->nearlevel);
550 InitLevel(&self->linoutlevel); 555 InitLevel(&self->linoutlevel);
551 InitLevel(&self->nlpoutlevel); 556 InitLevel(&self->nlpoutlevel);
552 557
553 InitStats(&self->erl); 558 InitStats(&self->erl);
554 InitStats(&self->erle); 559 InitStats(&self->erle);
555 InitStats(&self->aNlp); 560 InitStats(&self->aNlp);
556 InitStats(&self->rerl); 561 InitStats(&self->rerl);
562
563 self->num_diverge_values = 0;
564 self->num_filter_diverge = 0;
565 self->fraction_filter_diverge = 0.0f;
557 } 566 }
558 567
559 static float CalculatePower(const float* in, size_t num_samples) { 568 static float CalculatePower(const float* in, size_t num_samples) {
560 size_t k; 569 size_t k;
561 float energy = 0.0f; 570 float energy = 0.0f;
562 571
563 for (k = 0; k < num_samples; ++k) { 572 for (k = 0; k < num_samples; ++k) {
564 energy += in[k] * in[k]; 573 energy += in[k] * in[k];
565 } 574 }
566 return energy / num_samples; 575 return energy / num_samples;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 // a per-sample energy (i.e., power). 613 // a per-sample energy (i.e., power).
605 const float noisyPower = 300000.0f * 2.0f / PART_LEN2; 614 const float noisyPower = 300000.0f * 2.0f / PART_LEN2;
606 615
607 float actThreshold; 616 float actThreshold;
608 float echo, suppressedEcho; 617 float echo, suppressedEcho;
609 618
610 if (aec->echoState) { // Check if echo is likely present 619 if (aec->echoState) { // Check if echo is likely present
611 aec->stateCounter++; 620 aec->stateCounter++;
612 } 621 }
613 622
623 if (aec->linoutlevel.sfrcounter == 0) {
624 // We count a filter divergence when the audio level of linear filter output
625 // 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
626 if (aec->linoutlevel.framelevel > 1.001 * aec->nearlevel.framelevel)
627 aec->num_filter_diverge++;
628 aec->num_diverge_values++;
629 if (aec->num_diverge_values >= kDivergeMetricAggregationWindow) {
630 aec->fraction_filter_diverge =
631 static_cast<float>(aec->num_filter_diverge) / aec->num_diverge_values;
632 aec->num_diverge_values = 0;
633 aec->num_filter_diverge = 0;
634 }
635 }
636
614 if (aec->farlevel.frcounter == 0) { 637 if (aec->farlevel.frcounter == 0) {
615 if (aec->farlevel.minlevel < noisyPower) { 638 if (aec->farlevel.minlevel < noisyPower) {
616 actThreshold = actThresholdClean; 639 actThreshold = actThresholdClean;
617 } else { 640 } else {
618 actThreshold = actThresholdNoisy; 641 actThreshold = actThresholdNoisy;
619 } 642 }
620 643
621 if ((aec->stateCounter > (0.5f * countLen * subCountLen)) && 644 if ((aec->stateCounter > (0.5f * countLen * subCountLen)) &&
622 (aec->farlevel.sfrcounter == 0) 645 (aec->farlevel.sfrcounter == 0)
623 646
(...skipping 1280 matching lines...) Expand 10 before | Expand all | Expand 10 after
1904 } 1927 }
1905 1928
1906 int WebRtcAec_system_delay(AecCore* self) { 1929 int WebRtcAec_system_delay(AecCore* self) {
1907 return self->system_delay; 1930 return self->system_delay;
1908 } 1931 }
1909 1932
1910 void WebRtcAec_SetSystemDelay(AecCore* self, int delay) { 1933 void WebRtcAec_SetSystemDelay(AecCore* self, int delay) {
1911 assert(delay >= 0); 1934 assert(delay >= 0);
1912 self->system_delay = delay; 1935 self->system_delay = delay;
1913 } 1936 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698