Index: third_party/opus/src/silk/fixed/pitch_analysis_core_FIX.c |
diff --git a/third_party/opus/src/silk/fixed/pitch_analysis_core_FIX.c b/third_party/opus/src/silk/fixed/pitch_analysis_core_FIX.c |
index 01bb9fc0a837b6c34933fcb066a791873540dea3..8df109e6cf51107e4776c703e2a562d89b826fef 100644 |
--- a/third_party/opus/src/silk/fixed/pitch_analysis_core_FIX.c |
+++ b/third_party/opus/src/silk/fixed/pitch_analysis_core_FIX.c |
@@ -80,7 +80,7 @@ static void silk_P_Ana_calc_energy_st3( |
/* FIXED POINT CORE PITCH ANALYSIS FUNCTION */ |
/*************************************************************/ |
opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 voiced, 1 unvoiced */ |
- const opus_int16 *frame, /* I Signal of length PE_FRAME_LENGTH_MS*Fs_kHz */ |
+ const opus_int16 *frame_unscaled, /* I Signal of length PE_FRAME_LENGTH_MS*Fs_kHz */ |
opus_int *pitch_out, /* O 4 pitch lag values */ |
opus_int16 *lagIndex, /* O Lag Index */ |
opus_int8 *contourIndex, /* O Pitch contour Index */ |
@@ -94,16 +94,17 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 |
int arch /* I Run-time architecture */ |
) |
{ |
- VARDECL( opus_int16, frame_8kHz ); |
+ VARDECL( opus_int16, frame_8kHz_buf ); |
VARDECL( opus_int16, frame_4kHz ); |
+ VARDECL( opus_int16, frame_scaled ); |
opus_int32 filt_state[ 6 ]; |
- const opus_int16 *input_frame_ptr; |
+ const opus_int16 *frame, *frame_8kHz; |
opus_int i, k, d, j; |
VARDECL( opus_int16, C ); |
VARDECL( opus_int32, xcorr32 ); |
const opus_int16 *target_ptr, *basis_ptr; |
- opus_int32 cross_corr, normalizer, energy, shift, energy_basis, energy_target; |
- opus_int d_srch[ PE_D_SRCH_LENGTH ], Cmax, length_d_srch, length_d_comp; |
+ opus_int32 cross_corr, normalizer, energy, energy_basis, energy_target; |
+ opus_int d_srch[ PE_D_SRCH_LENGTH ], Cmax, length_d_srch, length_d_comp, shift; |
VARDECL( opus_int16, d_comp ); |
opus_int32 sum, threshold, lag_counter; |
opus_int CBimax, CBimax_new, CBimax_old, lag, start_lag, end_lag, lag_new; |
@@ -119,6 +120,7 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 |
opus_int32 delta_lag_log2_sqr_Q7, lag_log2_Q7, prevLag_log2_Q7, prev_lag_bias_Q13; |
const opus_int8 *Lag_CB_ptr; |
SAVE_STACK; |
+ |
/* Check for valid sampling frequency */ |
silk_assert( Fs_kHz == 8 || Fs_kHz == 12 || Fs_kHz == 16 ); |
@@ -137,17 +139,33 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 |
min_lag = PE_MIN_LAG_MS * Fs_kHz; |
max_lag = PE_MAX_LAG_MS * Fs_kHz - 1; |
+ /* Downscale input if necessary */ |
+ silk_sum_sqr_shift( &energy, &shift, frame_unscaled, frame_length ); |
+ shift += 3 - silk_CLZ32( energy ); /* at least two bits headroom */ |
+ ALLOC( frame_scaled, frame_length, opus_int16 ); |
+ if( shift > 0 ) { |
+ shift = silk_RSHIFT( shift + 1, 1 ); |
+ for( i = 0; i < frame_length; i++ ) { |
+ frame_scaled[ i ] = silk_RSHIFT( frame_unscaled[ i ], shift ); |
+ } |
+ frame = frame_scaled; |
+ } else { |
+ frame = frame_unscaled; |
+ } |
+ |
+ ALLOC( frame_8kHz_buf, ( Fs_kHz == 8 ) ? 1 : frame_length_8kHz, opus_int16 ); |
/* Resample from input sampled at Fs_kHz to 8 kHz */ |
- ALLOC( frame_8kHz, frame_length_8kHz, opus_int16 ); |
if( Fs_kHz == 16 ) { |
silk_memset( filt_state, 0, 2 * sizeof( opus_int32 ) ); |
- silk_resampler_down2( filt_state, frame_8kHz, frame, frame_length ); |
+ silk_resampler_down2( filt_state, frame_8kHz_buf, frame, frame_length ); |
+ frame_8kHz = frame_8kHz_buf; |
} else if( Fs_kHz == 12 ) { |
silk_memset( filt_state, 0, 6 * sizeof( opus_int32 ) ); |
- silk_resampler_down2_3( filt_state, frame_8kHz, frame, frame_length ); |
+ silk_resampler_down2_3( filt_state, frame_8kHz_buf, frame, frame_length ); |
+ frame_8kHz = frame_8kHz_buf; |
} else { |
silk_assert( Fs_kHz == 8 ); |
- silk_memcpy( frame_8kHz, frame, frame_length_8kHz * sizeof(opus_int16) ); |
+ frame_8kHz = frame; |
} |
/* Decimate again to 4 kHz */ |
@@ -160,19 +178,6 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 |
frame_4kHz[ i ] = silk_ADD_SAT16( frame_4kHz[ i ], frame_4kHz[ i - 1 ] ); |
} |
- /******************************************************************************* |
- ** Scale 4 kHz signal down to prevent correlations measures from overflowing |
- ** find scaling as max scaling for each 8kHz(?) subframe |
- *******************************************************************************/ |
- |
- /* Inner product is calculated with different lengths, so scale for the worst case */ |
- silk_sum_sqr_shift( &energy, &shift, frame_4kHz, frame_length_4kHz ); |
- if( shift > 0 ) { |
- shift = silk_RSHIFT( shift, 1 ); |
- for( i = 0; i < frame_length_4kHz; i++ ) { |
- frame_4kHz[ i ] = silk_RSHIFT( frame_4kHz[ i ], shift ); |
- } |
- } |
/****************************************************************************** |
* FIRST STAGE, operating in 4 khz |
@@ -311,18 +316,6 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 |
** SECOND STAGE, operating at 8 kHz, on lag sections with high correlation |
*************************************************************************************/ |
- /****************************************************************************** |
- ** Scale signal down to avoid correlations measures from overflowing |
- *******************************************************************************/ |
- /* find scaling as max scaling for each subframe */ |
- silk_sum_sqr_shift( &energy, &shift, frame_8kHz, frame_length_8kHz ); |
- if( shift > 0 ) { |
- shift = silk_RSHIFT( shift, 1 ); |
- for( i = 0; i < frame_length_8kHz; i++ ) { |
- frame_8kHz[ i ] = silk_RSHIFT( frame_8kHz[ i ], shift ); |
- } |
- } |
- |
/********************************************************************************* |
* Find energy of each subframe projected onto its history, for a range of delays |
*********************************************************************************/ |
@@ -462,24 +455,6 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 |
silk_assert( *LTPCorr_Q15 >= 0 ); |
if( Fs_kHz > 8 ) { |
- VARDECL( opus_int16, scratch_mem ); |
- /***************************************************************************/ |
- /* Scale input signal down to avoid correlations measures from overflowing */ |
- /***************************************************************************/ |
- /* find scaling as max scaling for each subframe */ |
- silk_sum_sqr_shift( &energy, &shift, frame, frame_length ); |
- ALLOC( scratch_mem, shift > 0 ? frame_length : ALLOC_NONE, opus_int16 ); |
- if( shift > 0 ) { |
- /* Move signal to scratch mem because the input signal should be unchanged */ |
- shift = silk_RSHIFT( shift, 1 ); |
- for( i = 0; i < frame_length; i++ ) { |
- scratch_mem[ i ] = silk_RSHIFT( frame[ i ], shift ); |
- } |
- input_frame_ptr = scratch_mem; |
- } else { |
- input_frame_ptr = frame; |
- } |
- |
/* Search in original signal */ |
CBimax_old = CBimax; |
@@ -519,14 +494,14 @@ opus_int silk_pitch_analysis_core( /* O Voicing estimate: 0 |
/* Calculate the correlations and energies needed in stage 3 */ |
ALLOC( energies_st3, nb_subfr * nb_cbk_search, silk_pe_stage3_vals ); |
ALLOC( cross_corr_st3, nb_subfr * nb_cbk_search, silk_pe_stage3_vals ); |
- silk_P_Ana_calc_corr_st3( cross_corr_st3, input_frame_ptr, start_lag, sf_length, nb_subfr, complexity, arch ); |
- silk_P_Ana_calc_energy_st3( energies_st3, input_frame_ptr, start_lag, sf_length, nb_subfr, complexity, arch ); |
+ silk_P_Ana_calc_corr_st3( cross_corr_st3, frame, start_lag, sf_length, nb_subfr, complexity, arch ); |
+ silk_P_Ana_calc_energy_st3( energies_st3, frame, start_lag, sf_length, nb_subfr, complexity, arch ); |
lag_counter = 0; |
silk_assert( lag == silk_SAT16( lag ) ); |
contour_bias_Q15 = silk_DIV32_16( SILK_FIX_CONST( PE_FLATCONTOUR_BIAS, 15 ), lag ); |
- target_ptr = &input_frame_ptr[ PE_LTP_MEM_LENGTH_MS * Fs_kHz ]; |
+ target_ptr = &frame[ PE_LTP_MEM_LENGTH_MS * Fs_kHz ]; |
energy_target = silk_ADD32( silk_inner_prod_aligned( target_ptr, target_ptr, nb_subfr * sf_length, arch ), 1 ); |
for( d = start_lag; d <= end_lag; d++ ) { |
for( j = 0; j < nb_cbk_search; j++ ) { |