Index: webrtc/modules/audio_coding/neteq/expand.cc |
diff --git a/webrtc/modules/audio_coding/neteq/expand.cc b/webrtc/modules/audio_coding/neteq/expand.cc |
index 94f6a8fdfebf4e274b94365e0b44f455ff43c39b..ef7af46597e4344156dc48b553d467934622f4b2 100644 |
--- a/webrtc/modules/audio_coding/neteq/expand.cc |
+++ b/webrtc/modules/audio_coding/neteq/expand.cc |
@@ -19,7 +19,6 @@ |
#include "webrtc/base/safe_conversions.h" |
#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h" |
#include "webrtc/modules/audio_coding/neteq/background_noise.h" |
-#include "webrtc/modules/audio_coding/neteq/cross_correlation.h" |
#include "webrtc/modules/audio_coding/neteq/dsp_helper.h" |
#include "webrtc/modules/audio_coding/neteq/random_vector.h" |
#include "webrtc/modules/audio_coding/neteq/statistics_calculator.h" |
@@ -380,10 +379,12 @@ |
InitializeForAnExpandPeriod(); |
// Calculate correlation in downsampled domain (4 kHz sample rate). |
+ int correlation_scale; |
size_t correlation_length = 51; // TODO(hlundin): Legacy bit-exactness. |
// If it is decided to break bit-exactness |correlation_length| should be |
// initialized to the return value of Correlation(). |
- Correlation(audio_history, signal_length, correlation_vector); |
+ Correlation(audio_history, signal_length, correlation_vector, |
+ &correlation_scale); |
// Find peaks in correlation vector. |
DspHelper::PeakDetection(correlation_vector, correlation_length, |
@@ -449,12 +450,21 @@ |
for (size_t channel_ix = 0; channel_ix < num_channels_; ++channel_ix) { |
ChannelParameters& parameters = channel_parameters_[channel_ix]; |
+ // Calculate suitable scaling. |
+ int16_t signal_max = WebRtcSpl_MaxAbsValueW16( |
+ &audio_history[signal_length - correlation_length - start_index |
+ - correlation_lags], |
+ correlation_length + start_index + correlation_lags - 1); |
+ correlation_scale = (31 - WebRtcSpl_NormW32(signal_max * signal_max)) + |
+ (31 - WebRtcSpl_NormW32(static_cast<int32_t>(correlation_length))) - 31; |
+ correlation_scale = std::max(0, correlation_scale); |
// Calculate the correlation, store in |correlation_vector2|. |
- int correlation_scale = CrossCorrelationWithAutoShift( |
+ WebRtcSpl_CrossCorrelation( |
+ correlation_vector2, |
&(audio_history[signal_length - correlation_length]), |
&(audio_history[signal_length - correlation_length - start_index]), |
- correlation_length, correlation_lags, -1, correlation_vector2); |
+ correlation_length, correlation_lags, correlation_scale, -1); |
// Find maximizing index. |
best_index = WebRtcSpl_MaxIndexW32(correlation_vector2, correlation_lags); |
@@ -572,6 +582,13 @@ |
} |
// Calculate the LPC and the gain of the filters. |
+ // Calculate scale value needed for auto-correlation. |
+ correlation_scale = WebRtcSpl_MaxAbsValueW16( |
+ &(audio_history[signal_length - fs_mult_lpc_analysis_len]), |
+ fs_mult_lpc_analysis_len); |
+ |
+ correlation_scale = std::min(16 - WebRtcSpl_NormW32(correlation_scale), 0); |
+ correlation_scale = std::max(correlation_scale * 2 + 7, 0); |
// Calculate kUnvoicedLpcOrder + 1 lags of the auto-correlation function. |
size_t temp_index = signal_length - fs_mult_lpc_analysis_len - |
@@ -584,9 +601,11 @@ |
memcpy(&temp_signal[kUnvoicedLpcOrder], |
&audio_history[temp_index + kUnvoicedLpcOrder], |
sizeof(int16_t) * fs_mult_lpc_analysis_len); |
- correlation_scale = CrossCorrelationWithAutoShift( |
- &temp_signal[kUnvoicedLpcOrder], &temp_signal[kUnvoicedLpcOrder], |
- fs_mult_lpc_analysis_len, kUnvoicedLpcOrder + 1, -1, auto_correlation); |
+ WebRtcSpl_CrossCorrelation(auto_correlation, |
+ &temp_signal[kUnvoicedLpcOrder], |
+ &temp_signal[kUnvoicedLpcOrder], |
+ fs_mult_lpc_analysis_len, kUnvoicedLpcOrder + 1, |
+ correlation_scale, -1); |
delete [] temp_signal; |
// Verify that variance is positive. |
@@ -747,7 +766,8 @@ |
void Expand::Correlation(const int16_t* input, |
size_t input_length, |
- int16_t* output) const { |
+ int16_t* output, |
+ int* output_scale) const { |
// Set parameters depending on sample rate. |
const int16_t* filter_coefficients; |
size_t num_coefficients; |
@@ -794,11 +814,13 @@ |
downsampled_input, norm_shift); |
int32_t correlation[kNumCorrelationLags]; |
- CrossCorrelationWithAutoShift( |
+ static const int kCorrelationShift = 6; |
+ WebRtcSpl_CrossCorrelation( |
+ correlation, |
&downsampled_input[kDownsampledLength - kCorrelationLength], |
&downsampled_input[kDownsampledLength - kCorrelationLength |
- kCorrelationStartLag], |
- kCorrelationLength, kNumCorrelationLags, -1, correlation); |
+ kCorrelationLength, kNumCorrelationLags, kCorrelationShift, -1); |
// Normalize and move data from 32-bit to 16-bit vector. |
int32_t max_correlation = WebRtcSpl_MaxAbsValueW32(correlation, |
@@ -807,6 +829,8 @@ |
std::max(18 - WebRtcSpl_NormW32(max_correlation), 0)); |
WebRtcSpl_VectorBitShiftW32ToW16(output, kNumCorrelationLags, correlation, |
norm_shift2); |
+ // Total scale factor (right shifts) of correlation value. |
+ *output_scale = 2 * norm_shift + kCorrelationShift + norm_shift2; |
} |
void Expand::UpdateLagIndex() { |