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

Side by Side Diff: webrtc/modules/audio_processing/aec/aec_core_neon.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: Rebase 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
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2014 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 486 matching lines...) Expand 10 before | Expand all | Expand 10 after
497 497
498 // Updates the following smoothed Power Spectral Densities (PSD): 498 // Updates the following smoothed Power Spectral Densities (PSD):
499 // - sd : near-end 499 // - sd : near-end
500 // - se : residual echo 500 // - se : residual echo
501 // - sx : far-end 501 // - sx : far-end
502 // - sde : cross-PSD of near-end and residual echo 502 // - sde : cross-PSD of near-end and residual echo
503 // - sxd : cross-PSD of near-end and far-end 503 // - sxd : cross-PSD of near-end and far-end
504 // 504 //
505 // In addition to updating the PSDs, also the filter diverge state is determined 505 // In addition to updating the PSDs, also the filter diverge state is determined
506 // upon actions are taken. 506 // upon actions are taken.
507 static void SmoothedPSD(int mult, 507 static void UpdateCoherenceSpectraNEON(int mult,
508 bool extended_filter_enabled, 508 bool extended_filter_enabled,
509 float efw[2][PART_LEN1], 509 float efw[2][PART_LEN1],
510 float dfw[2][PART_LEN1], 510 float dfw[2][PART_LEN1],
511 float xfw[2][PART_LEN1], 511 float xfw[2][PART_LEN1],
512 CoherenceState* coherence_state, 512 CoherenceState* coherence_state,
513 short* filter_divergence_state, 513 short* filter_divergence_state,
514 int* extreme_filter_divergence) { 514 int* extreme_filter_divergence) {
515 // Power estimate smoothing coefficients. 515 // Power estimate smoothing coefficients.
516 const float* ptrGCoh = 516 const float* ptrGCoh =
517 extended_filter_enabled 517 extended_filter_enabled
518 ? WebRtcAec_kExtendedSmoothingCoefficients[mult - 1] 518 ? WebRtcAec_kExtendedSmoothingCoefficients[mult - 1]
519 : WebRtcAec_kNormalSmoothingCoefficients[mult - 1]; 519 : WebRtcAec_kNormalSmoothingCoefficients[mult - 1];
520 int i; 520 int i;
521 float sdSum = 0, seSum = 0; 521 float sdSum = 0, seSum = 0;
522 const float32x4_t vec_15 = vdupq_n_f32(WebRtcAec_kMinFarendPSD); 522 const float32x4_t vec_15 = vdupq_n_f32(WebRtcAec_kMinFarendPSD);
523 float32x4_t vec_sdSum = vdupq_n_f32(0.0f); 523 float32x4_t vec_sdSum = vdupq_n_f32(0.0f);
524 float32x4_t vec_seSum = vdupq_n_f32(0.0f); 524 float32x4_t vec_seSum = vdupq_n_f32(0.0f);
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 vst1q_f32(&data_complex[0][i], vec_data.val[0]); 672 vst1q_f32(&data_complex[0][i], vec_data.val[0]);
673 vst1q_f32(&data_complex[1][i], vec_data.val[1]); 673 vst1q_f32(&data_complex[1][i], vec_data.val[1]);
674 } 674 }
675 // fix beginning/end values 675 // fix beginning/end values
676 data_complex[1][0] = 0; 676 data_complex[1][0] = 0;
677 data_complex[1][PART_LEN] = 0; 677 data_complex[1][PART_LEN] = 0;
678 data_complex[0][0] = data[0]; 678 data_complex[0][0] = data[0];
679 data_complex[0][PART_LEN] = data[1]; 679 data_complex[0][PART_LEN] = data[1];
680 } 680 }
681 681
682 static void SubbandCoherenceNEON(int mult, 682 static void ComputeCoherenceNEON(const CoherenceState* coherence_state,
683 bool extended_filter_enabled,
684 float efw[2][PART_LEN1],
685 float dfw[2][PART_LEN1],
686 float xfw[2][PART_LEN1],
687 float* fft,
688 float* cohde, 683 float* cohde,
689 float* cohxd, 684 float* cohxd) {
690 CoherenceState* coherence_state,
691 short* filter_divergence_state,
692 int* extreme_filter_divergence) {
693 int i; 685 int i;
694 686
695 SmoothedPSD(mult, extended_filter_enabled, efw, dfw, xfw, coherence_state,
696 filter_divergence_state, extreme_filter_divergence);
697
698 { 687 {
699 const float32x4_t vec_1eminus10 = vdupq_n_f32(1e-10f); 688 const float32x4_t vec_1eminus10 = vdupq_n_f32(1e-10f);
700 689
701 // Subband coherence 690 // Subband coherence
702 for (i = 0; i + 3 < PART_LEN1; i += 4) { 691 for (i = 0; i + 3 < PART_LEN1; i += 4) {
703 const float32x4_t vec_sd = vld1q_f32(&coherence_state->sd[i]); 692 const float32x4_t vec_sd = vld1q_f32(&coherence_state->sd[i]);
704 const float32x4_t vec_se = vld1q_f32(&coherence_state->se[i]); 693 const float32x4_t vec_se = vld1q_f32(&coherence_state->se[i]);
705 const float32x4_t vec_sx = vld1q_f32(&coherence_state->sx[i]); 694 const float32x4_t vec_sx = vld1q_f32(&coherence_state->sx[i]);
706 const float32x4_t vec_sdse = vmlaq_f32(vec_1eminus10, vec_sd, vec_se); 695 const float32x4_t vec_sdse = vmlaq_f32(vec_1eminus10, vec_sd, vec_se);
707 const float32x4_t vec_sdsx = vmlaq_f32(vec_1eminus10, vec_sd, vec_sx); 696 const float32x4_t vec_sdsx = vmlaq_f32(vec_1eminus10, vec_sd, vec_sx);
(...skipping 19 matching lines...) Expand all
727 coherence_state->sxd[i][1] * coherence_state->sxd[i][1]) / 716 coherence_state->sxd[i][1] * coherence_state->sxd[i][1]) /
728 (coherence_state->sx[i] * coherence_state->sd[i] + 1e-10f); 717 (coherence_state->sx[i] * coherence_state->sd[i] + 1e-10f);
729 } 718 }
730 } 719 }
731 720
732 void WebRtcAec_InitAec_neon(void) { 721 void WebRtcAec_InitAec_neon(void) {
733 WebRtcAec_FilterFar = FilterFarNEON; 722 WebRtcAec_FilterFar = FilterFarNEON;
734 WebRtcAec_ScaleErrorSignal = ScaleErrorSignalNEON; 723 WebRtcAec_ScaleErrorSignal = ScaleErrorSignalNEON;
735 WebRtcAec_FilterAdaptation = FilterAdaptationNEON; 724 WebRtcAec_FilterAdaptation = FilterAdaptationNEON;
736 WebRtcAec_OverdriveAndSuppress = OverdriveAndSuppressNEON; 725 WebRtcAec_OverdriveAndSuppress = OverdriveAndSuppressNEON;
737 WebRtcAec_SubbandCoherence = SubbandCoherenceNEON; 726 WebRtcAec_ComputeCoherence = ComputeCoherenceNEON;
727 WebRtcAec_UpdateCoherenceSpectra = UpdateCoherenceSpectraNEON;
738 WebRtcAec_StoreAsComplex = StoreAsComplexNEON; 728 WebRtcAec_StoreAsComplex = StoreAsComplexNEON;
739 WebRtcAec_PartitionDelay = PartitionDelayNEON; 729 WebRtcAec_PartitionDelay = PartitionDelayNEON;
740 WebRtcAec_WindowData = WindowDataNEON; 730 WebRtcAec_WindowData = WindowDataNEON;
741 } 731 }
742 } // namespace webrtc 732 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/audio_processing/aec/aec_core_internal.h ('k') | webrtc/modules/audio_processing/aec/aec_core_sse2.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698