diff --git a/webrtc/common_audio/signal_processing/cross_correlation.c b/webrtc/common_audio/signal_processing/cross_correlation.c index 42000d608d..6c8f22c415 100644 --- a/webrtc/common_audio/signal_processing/cross_correlation.c +++ b/webrtc/common_audio/signal_processing/cross_correlation.c @@ -16,16 +16,18 @@ void WebRtcSpl_CrossCorrelationC(int32_t* cross_correlation, const int16_t* seq2, int16_t dim_seq, int16_t dim_cross_correlation, - int16_t right_shifts, - int16_t step_seq2) { + int right_shifts, + int step_seq2) { int i = 0, j = 0; for (i = 0; i < dim_cross_correlation; i++) { - *cross_correlation = 0; + int32_t corr = 0; /* Unrolling doesn't seem to improve performance. */ for (j = 0; j < dim_seq; j++) { - *cross_correlation += (seq1[j] * seq2[step_seq2 * i + j]) >> right_shifts; + // It's not clear why casting |right_shifts| here helps performance. + corr += (seq1[j] * seq2[j]) >> (int16_t)right_shifts; } - cross_correlation++; + seq2 += step_seq2; + *cross_correlation++ = corr; } } diff --git a/webrtc/common_audio/signal_processing/cross_correlation_mips.c b/webrtc/common_audio/signal_processing/cross_correlation_mips.c index 7d9a6c6442..ac3df6d0a1 100644 --- a/webrtc/common_audio/signal_processing/cross_correlation_mips.c +++ b/webrtc/common_audio/signal_processing/cross_correlation_mips.c @@ -15,8 +15,8 @@ void WebRtcSpl_CrossCorrelation_mips(int32_t* cross_correlation, const int16_t* seq2, int16_t dim_seq, int16_t dim_cross_correlation, - int16_t right_shifts, - int16_t step_seq2) { + int right_shifts, + int step_seq2) { int32_t t0 = 0, t1 = 0, t2 = 0, t3 = 0, sum = 0; int16_t *pseq2 = NULL; diff --git a/webrtc/common_audio/signal_processing/cross_correlation_neon.c b/webrtc/common_audio/signal_processing/cross_correlation_neon.c index c358c701af..9bf16cfb6b 100644 --- a/webrtc/common_audio/signal_processing/cross_correlation_neon.c +++ b/webrtc/common_audio/signal_processing/cross_correlation_neon.c @@ -74,8 +74,8 @@ void WebRtcSpl_CrossCorrelationNeon(int32_t* cross_correlation, const int16_t* seq2, int16_t dim_seq, int16_t dim_cross_correlation, - int16_t right_shifts, - int16_t step_seq2) { + int right_shifts, + int step_seq2) { int i = 0; for (i = 0; i < dim_cross_correlation; i++) { diff --git a/webrtc/common_audio/signal_processing/include/signal_processing_library.h b/webrtc/common_audio/signal_processing/include/signal_processing_library.h index f6ab352d85..24656b749f 100644 --- a/webrtc/common_audio/signal_processing/include/signal_processing_library.h +++ b/webrtc/common_audio/signal_processing/include/signal_processing_library.h @@ -542,24 +542,24 @@ typedef void (*CrossCorrelation)(int32_t* cross_correlation, const int16_t* seq2, int16_t dim_seq, int16_t dim_cross_correlation, - int16_t right_shifts, - int16_t step_seq2); + int right_shifts, + int step_seq2); extern CrossCorrelation WebRtcSpl_CrossCorrelation; void WebRtcSpl_CrossCorrelationC(int32_t* cross_correlation, const int16_t* seq1, const int16_t* seq2, int16_t dim_seq, int16_t dim_cross_correlation, - int16_t right_shifts, - int16_t step_seq2); + int right_shifts, + int step_seq2); #if (defined WEBRTC_DETECT_NEON) || (defined WEBRTC_HAS_NEON) void WebRtcSpl_CrossCorrelationNeon(int32_t* cross_correlation, const int16_t* seq1, const int16_t* seq2, int16_t dim_seq, int16_t dim_cross_correlation, - int16_t right_shifts, - int16_t step_seq2); + int right_shifts, + int step_seq2); #endif #if defined(MIPS32_LE) void WebRtcSpl_CrossCorrelation_mips(int32_t* cross_correlation, @@ -567,8 +567,8 @@ void WebRtcSpl_CrossCorrelation_mips(int32_t* cross_correlation, const int16_t* seq2, int16_t dim_seq, int16_t dim_cross_correlation, - int16_t right_shifts, - int16_t step_seq2); + int right_shifts, + int step_seq2); #endif // Creates (the first half of) a Hanning window. Size must be at least 1 and