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

Side by Side Diff: webrtc/modules/audio_processing/aec/aec_core.cc

Issue 1943193002: Broke apart the functionalities in the SubbandCoherence method in the AEC (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@RefactorAec4_CL
Patch Set: Created 4 years, 7 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
« no previous file with comments | « no previous file | webrtc/modules/audio_processing/aec/aec_core_internal.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 enum { kPrefBandSize = 24 }; 134 enum { kPrefBandSize = 24 };
135 135
136 #ifdef WEBRTC_AEC_DEBUG_DUMP 136 #ifdef WEBRTC_AEC_DEBUG_DUMP
137 extern int webrtc_aec_instance_count; 137 extern int webrtc_aec_instance_count;
138 #endif 138 #endif
139 139
140 WebRtcAecFilterFar WebRtcAec_FilterFar; 140 WebRtcAecFilterFar WebRtcAec_FilterFar;
141 WebRtcAecScaleErrorSignal WebRtcAec_ScaleErrorSignal; 141 WebRtcAecScaleErrorSignal WebRtcAec_ScaleErrorSignal;
142 WebRtcAecFilterAdaptation WebRtcAec_FilterAdaptation; 142 WebRtcAecFilterAdaptation WebRtcAec_FilterAdaptation;
143 WebRtcAecOverdriveAndSuppress WebRtcAec_OverdriveAndSuppress; 143 WebRtcAecOverdriveAndSuppress WebRtcAec_OverdriveAndSuppress;
144 WebRtcAecSubBandCoherence WebRtcAec_SubbandCoherence; 144 WebRtcAecComputeCoherence WebRtcAec_ComputeCoherence;
145 WebRtcAecUpdateCoherenceSpectra WebRtcAec_UpdateCoherenceSpectra;
145 WebRtcAecStoreAsComplex WebRtcAec_StoreAsComplex; 146 WebRtcAecStoreAsComplex WebRtcAec_StoreAsComplex;
146 WebRtcAecPartitionDelay WebRtcAec_PartitionDelay; 147 WebRtcAecPartitionDelay WebRtcAec_PartitionDelay;
147 WebRtcAecWindowData WebRtcAec_WindowData; 148 WebRtcAecWindowData WebRtcAec_WindowData;
148 149
149 __inline static float MulRe(float aRe, float aIm, float bRe, float bIm) { 150 __inline static float MulRe(float aRe, float aIm, float bRe, float bIm) {
150 return aRe * bRe - aIm * bIm; 151 return aRe * bRe - aIm * bIm;
151 } 152 }
152 153
153 __inline static float MulIm(float aRe, float aIm, float bRe, float bIm) { 154 __inline static float MulIm(float aRe, float aIm, float bRe, float bIm) {
154 return aRe * bIm + aIm * bRe; 155 return aRe * bIm + aIm * bRe;
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 // This is to protect overflow, which should almost never happen. 396 // This is to protect overflow, which should almost never happen.
396 RTC_CHECK_NE(0u, metric->hicounter); 397 RTC_CHECK_NE(0u, metric->hicounter);
397 metric->hisum += metric->instant; 398 metric->hisum += metric->instant;
398 metric->himean = metric->hisum / metric->hicounter; 399 metric->himean = metric->hisum / metric->hicounter;
399 } 400 }
400 } 401 }
401 402
402 // Threshold to protect against the ill-effects of a zero far-end. 403 // Threshold to protect against the ill-effects of a zero far-end.
403 const float WebRtcAec_kMinFarendPSD = 15; 404 const float WebRtcAec_kMinFarendPSD = 15;
404 405
405 // Updates the following smoothed Power Spectral Densities (PSD): 406 // Updates the following smoothed Power Spectral Densities (PSD):
minyue-webrtc 2016/05/03 07:29:06 nit: one extra space
peah-webrtc 2016/05/07 21:26:35 Good find! Done.
406 // - sd : near-end 407 // - sd : near-end
407 // - se : residual echo 408 // - se : residual echo
408 // - sx : far-end 409 // - sx : far-end
409 // - sde : cross-PSD of near-end and residual echo 410 // - sde : cross-PSD of near-end and residual echo
410 // - sxd : cross-PSD of near-end and far-end 411 // - sxd : cross-PSD of near-end and far-end
411 // 412 //
412 // In addition to updating the PSDs, also the filter diverge state is 413 // In addition to updating the PSDs, also the filter diverge state is
413 // determined. 414 // determined.
414 static void SmoothedPSD(int mult, 415 static void UpdateCoherenceSpectra(int mult,
415 bool extended_filter_enabled, 416 bool extended_filter_enabled,
416 float efw[2][PART_LEN1], 417 float efw[2][PART_LEN1],
417 float dfw[2][PART_LEN1], 418 float dfw[2][PART_LEN1],
418 float xfw[2][PART_LEN1], 419 float xfw[2][PART_LEN1],
419 CoherenceState* coherence_state, 420 CoherenceState* coherence_state,
420 short* filter_divergence_state, 421 short* filter_divergence_state,
421 int* extreme_filter_divergence) { 422 int* extreme_filter_divergence) {
422 // Power estimate smoothing coefficients. 423 // Power estimate smoothing coefficients.
423 const float* ptrGCoh = 424 const float* ptrGCoh =
424 extended_filter_enabled 425 extended_filter_enabled
425 ? WebRtcAec_kExtendedSmoothingCoefficients[mult - 1] 426 ? WebRtcAec_kExtendedSmoothingCoefficients[mult - 1]
426 : WebRtcAec_kNormalSmoothingCoefficients[mult - 1]; 427 : WebRtcAec_kNormalSmoothingCoefficients[mult - 1];
427 int i; 428 int i;
428 float sdSum = 0, seSum = 0; 429 float sdSum = 0, seSum = 0;
429 430
430 for (i = 0; i < PART_LEN1; i++) { 431 for (i = 0; i < PART_LEN1; i++) {
431 coherence_state->sd[i] = 432 coherence_state->sd[i] =
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
488 data_complex[0][0] = data[0]; 489 data_complex[0][0] = data[0];
489 data_complex[1][0] = 0; 490 data_complex[1][0] = 0;
490 for (i = 1; i < PART_LEN; i++) { 491 for (i = 1; i < PART_LEN; i++) {
491 data_complex[0][i] = data[2 * i]; 492 data_complex[0][i] = data[2 * i];
492 data_complex[1][i] = data[2 * i + 1]; 493 data_complex[1][i] = data[2 * i + 1];
493 } 494 }
494 data_complex[0][PART_LEN] = data[1]; 495 data_complex[0][PART_LEN] = data[1];
495 data_complex[1][PART_LEN] = 0; 496 data_complex[1][PART_LEN] = 0;
496 } 497 }
497 498
498 static void SubbandCoherence(int mult, 499 static void ComputeCoherence(const CoherenceState* coherence_state,
499 bool extended_filter_enabled,
500 float efw[2][PART_LEN1],
501 float dfw[2][PART_LEN1],
502 float xfw[2][PART_LEN1],
503 float* fft,
504 float* cohde, 500 float* cohde,
505 float* cohxd, 501 float* cohxd) {
506 CoherenceState* coherence_state,
507 short* filter_divergence_state,
508 int* extreme_filter_divergence) {
509 int i;
510
511 SmoothedPSD(mult, extended_filter_enabled, efw, dfw, xfw, coherence_state,
512 filter_divergence_state, extreme_filter_divergence);
513
514 // Subband coherence 502 // Subband coherence
515 for (i = 0; i < PART_LEN1; i++) { 503 for (int i = 0; i < PART_LEN1; i++) {
516 cohde[i] = (coherence_state->sde[i][0] * coherence_state->sde[i][0] + 504 cohde[i] = (coherence_state->sde[i][0] * coherence_state->sde[i][0] +
517 coherence_state->sde[i][1] * coherence_state->sde[i][1]) / 505 coherence_state->sde[i][1] * coherence_state->sde[i][1]) /
518 (coherence_state->sd[i] * coherence_state->se[i] + 1e-10f); 506 (coherence_state->sd[i] * coherence_state->se[i] + 1e-10f);
519 cohxd[i] = (coherence_state->sxd[i][0] * coherence_state->sxd[i][0] + 507 cohxd[i] = (coherence_state->sxd[i][0] * coherence_state->sxd[i][0] +
520 coherence_state->sxd[i][1] * coherence_state->sxd[i][1]) / 508 coherence_state->sxd[i][1] * coherence_state->sxd[i][1]) /
521 (coherence_state->sx[i] * coherence_state->sd[i] + 1e-10f); 509 (coherence_state->sx[i] * coherence_state->sd[i] + 1e-10f);
522 } 510 }
523 } 511 }
524 512
525 static void GetHighbandGain(const float* lambda, float* nlpGainHband) { 513 static void GetHighbandGain(const float* lambda, float* nlpGainHband) {
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after
1061 aec->delayEstCtr++; 1049 aec->delayEstCtr++;
1062 if (aec->delayEstCtr == delayEstInterval) { 1050 if (aec->delayEstCtr == delayEstInterval) {
1063 aec->delayEstCtr = 0; 1051 aec->delayEstCtr = 0;
1064 aec->delayIdx = WebRtcAec_PartitionDelay(aec->num_partitions, aec->wfBuf); 1052 aec->delayIdx = WebRtcAec_PartitionDelay(aec->num_partitions, aec->wfBuf);
1065 } 1053 }
1066 1054
1067 // Use delayed far. 1055 // Use delayed far.
1068 memcpy(xfw, aec->xfwBuf + aec->delayIdx * PART_LEN1, 1056 memcpy(xfw, aec->xfwBuf + aec->delayIdx * PART_LEN1,
1069 sizeof(xfw[0][0]) * 2 * PART_LEN1); 1057 sizeof(xfw[0][0]) * 2 * PART_LEN1);
1070 1058
1071 WebRtcAec_SubbandCoherence(aec->mult, aec->extended_filter_enabled == 1, efw, 1059 WebRtcAec_UpdateCoherenceSpectra(aec->mult, aec->extended_filter_enabled == 1,
1072 dfw, xfw, fft, cohde, cohxd, &aec->coherence_state, 1060 efw, dfw, xfw, &aec->coherence_state,
1073 &aec->divergeState, 1061 &aec->divergeState,
1074 &aec->extreme_filter_divergence); 1062 &aec->extreme_filter_divergence);
1063
1064 WebRtcAec_ComputeCoherence(&aec->coherence_state, cohde, cohxd);
1075 1065
1076 // Select the microphone signal as output if the filter is deemed to have 1066 // Select the microphone signal as output if the filter is deemed to have
1077 // diverged. 1067 // diverged.
1078 if (aec->divergeState) { 1068 if (aec->divergeState) {
1079 memcpy(efw, dfw, sizeof(efw[0][0]) * 2 * PART_LEN1); 1069 memcpy(efw, dfw, sizeof(efw[0][0]) * 2 * PART_LEN1);
1080 } 1070 }
1081 1071
1082 hNlXdAvg = 0; 1072 hNlXdAvg = 0;
1083 for (i = minPrefBand; i < prefBandSize + minPrefBand; i++) { 1073 for (i = minPrefBand; i < prefBandSize + minPrefBand; i++) {
1084 hNlXdAvg += cohxd[i]; 1074 hNlXdAvg += cohxd[i];
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
1495 #endif 1485 #endif
1496 aec->extended_filter_enabled = 0; 1486 aec->extended_filter_enabled = 0;
1497 aec->aec3_enabled = 0; 1487 aec->aec3_enabled = 0;
1498 aec->refined_adaptive_filter_enabled = false; 1488 aec->refined_adaptive_filter_enabled = false;
1499 1489
1500 // Assembly optimization 1490 // Assembly optimization
1501 WebRtcAec_FilterFar = FilterFar; 1491 WebRtcAec_FilterFar = FilterFar;
1502 WebRtcAec_ScaleErrorSignal = ScaleErrorSignal; 1492 WebRtcAec_ScaleErrorSignal = ScaleErrorSignal;
1503 WebRtcAec_FilterAdaptation = FilterAdaptation; 1493 WebRtcAec_FilterAdaptation = FilterAdaptation;
1504 WebRtcAec_OverdriveAndSuppress = OverdriveAndSuppress; 1494 WebRtcAec_OverdriveAndSuppress = OverdriveAndSuppress;
1505 WebRtcAec_SubbandCoherence = SubbandCoherence; 1495 WebRtcAec_ComputeCoherence = ComputeCoherence;
1496 WebRtcAec_UpdateCoherenceSpectra = UpdateCoherenceSpectra;
1506 WebRtcAec_StoreAsComplex = StoreAsComplex; 1497 WebRtcAec_StoreAsComplex = StoreAsComplex;
1507 WebRtcAec_PartitionDelay = PartitionDelay; 1498 WebRtcAec_PartitionDelay = PartitionDelay;
1508 WebRtcAec_WindowData = WindowData; 1499 WebRtcAec_WindowData = WindowData;
1509 1500
1510 #if defined(WEBRTC_ARCH_X86_FAMILY) 1501 #if defined(WEBRTC_ARCH_X86_FAMILY)
1511 if (WebRtc_GetCPUInfo(kSSE2)) { 1502 if (WebRtc_GetCPUInfo(kSSE2)) {
1512 WebRtcAec_InitAec_SSE2(); 1503 WebRtcAec_InitAec_SSE2();
1513 } 1504 }
1514 #endif 1505 #endif
1515 1506
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after
2000 1991
2001 int WebRtcAec_system_delay(AecCore* self) { 1992 int WebRtcAec_system_delay(AecCore* self) {
2002 return self->system_delay; 1993 return self->system_delay;
2003 } 1994 }
2004 1995
2005 void WebRtcAec_SetSystemDelay(AecCore* self, int delay) { 1996 void WebRtcAec_SetSystemDelay(AecCore* self, int delay) {
2006 assert(delay >= 0); 1997 assert(delay >= 0);
2007 self->system_delay = delay; 1998 self->system_delay = delay;
2008 } 1999 }
2009 } // namespace webrtc 2000 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | webrtc/modules/audio_processing/aec/aec_core_internal.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698