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

Unified Diff: webrtc/modules/audio_coding/neteq/expand.cc

Issue 1925053002: Revert of Avoiding overflow in cross correlation in NetEq. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/modules/audio_coding/neteq/expand.h ('k') | webrtc/modules/audio_coding/neteq/merge.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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() {
« no previous file with comments | « webrtc/modules/audio_coding/neteq/expand.h ('k') | webrtc/modules/audio_coding/neteq/merge.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698