| OLD | NEW |
| 1 /*********************************************************************** | 1 /*********************************************************************** |
| 2 Copyright (c) 2006-2011, Skype Limited. All rights reserved. | 2 Copyright (c) 2006-2011, Skype Limited. All rights reserved. |
| 3 Redistribution and use in source and binary forms, with or without | 3 Redistribution and use in source and binary forms, with or without |
| 4 modification, are permitted provided that the following conditions | 4 modification, are permitted provided that the following conditions |
| 5 are met: | 5 are met: |
| 6 - Redistributions of source code must retain the above copyright notice, | 6 - Redistributions of source code must retain the above copyright notice, |
| 7 this list of conditions and the following disclaimer. | 7 this list of conditions and the following disclaimer. |
| 8 - Redistributions in binary form must reproduce the above copyright | 8 - Redistributions in binary form must reproduce the above copyright |
| 9 notice, this list of conditions and the following disclaimer in the | 9 notice, this list of conditions and the following disclaimer in the |
| 10 documentation and/or other materials provided with the distribution. | 10 documentation and/or other materials provided with the distribution. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 #endif | 30 #endif |
| 31 | 31 |
| 32 #include "main.h" | 32 #include "main.h" |
| 33 #include "stack_alloc.h" | 33 #include "stack_alloc.h" |
| 34 #include "NSQ.h" | 34 #include "NSQ.h" |
| 35 | 35 |
| 36 | 36 |
| 37 static OPUS_INLINE void silk_nsq_scale_states( | 37 static OPUS_INLINE void silk_nsq_scale_states( |
| 38 const silk_encoder_state *psEncC, /* I Encoder State
*/ | 38 const silk_encoder_state *psEncC, /* I Encoder State
*/ |
| 39 silk_nsq_state *NSQ, /* I/O NSQ state
*/ | 39 silk_nsq_state *NSQ, /* I/O NSQ state
*/ |
| 40 const opus_int32 x_Q3[], /* I input in Q3
*/ | 40 const opus_int16 x16[], /* I input
*/ |
| 41 opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain
*/ | 41 opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain
*/ |
| 42 const opus_int16 sLTP[], /* I re-whitened LTP state in
Q0 */ | 42 const opus_int16 sLTP[], /* I re-whitened LTP state in
Q0 */ |
| 43 opus_int32 sLTP_Q15[], /* O LTP state matching scale
d input */ | 43 opus_int32 sLTP_Q15[], /* O LTP state matching scale
d input */ |
| 44 opus_int subfr, /* I subframe number
*/ | 44 opus_int subfr, /* I subframe number
*/ |
| 45 const opus_int LTP_scale_Q14, /* I
*/ | 45 const opus_int LTP_scale_Q14, /* I
*/ |
| 46 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I
*/ | 46 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I
*/ |
| 47 const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag
*/ | 47 const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag
*/ |
| 48 const opus_int signal_type /* I Signal type
*/ | 48 const opus_int signal_type /* I Signal type
*/ |
| 49 ); | 49 ); |
| 50 | 50 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 68 opus_int offset_Q10, /* I
*/ | 68 opus_int offset_Q10, /* I
*/ |
| 69 opus_int length, /* I Input length
*/ | 69 opus_int length, /* I Input length
*/ |
| 70 opus_int shapingLPCOrder, /* I Noise shaping AR filter
order */ | 70 opus_int shapingLPCOrder, /* I Noise shaping AR filter
order */ |
| 71 opus_int predictLPCOrder, /* I Prediction filter order
*/ | 71 opus_int predictLPCOrder, /* I Prediction filter order
*/ |
| 72 int arch /* I Architecture
*/ | 72 int arch /* I Architecture
*/ |
| 73 ); | 73 ); |
| 74 #endif | 74 #endif |
| 75 | 75 |
| 76 void silk_NSQ_c | 76 void silk_NSQ_c |
| 77 ( | 77 ( |
| 78 const silk_encoder_state *psEncC, /* I
/O Encoder State */ | 78 const silk_encoder_state *psEncC, /* I
Encoder State */ |
| 79 silk_nsq_state *NSQ, /* I
/O NSQ state */ | 79 silk_nsq_state *NSQ, /* I
/O NSQ state */ |
| 80 SideInfoIndices *psIndices, /* I
/O Quantization Indices */ | 80 SideInfoIndices *psIndices, /* I
/O Quantization Indices */ |
| 81 const opus_int32 x_Q3[], /* I
Prefiltered input signal */ | 81 const opus_int16 x16[], /*
I Input */ |
| 82 opus_int8 pulses[], /* O
Quantized pulse signal */ | 82 opus_int8 pulses[], /* O
Quantized pulse signal */ |
| 83 const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I
Short term prediction coefs */ | 83 const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I
Short term prediction coefs */ |
| 84 const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I
Long term prediction coefs */ | 84 const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I
Long term prediction coefs */ |
| 85 const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /
* I Noise shaping coefs */ | 85 const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /*
I Noise shaping coefs */ |
| 86 const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I
Long term shaping coefs */ | 86 const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I
Long term shaping coefs */ |
| 87 const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I
Spectral tilt */ | 87 const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I
Spectral tilt */ |
| 88 const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I
Low frequency shaping coefs */ | 88 const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I
Low frequency shaping coefs */ |
| 89 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I
Quantization step sizes */ | 89 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I
Quantization step sizes */ |
| 90 const opus_int pitchL[ MAX_NB_SUBFR ], /* I
Pitch lags */ | 90 const opus_int pitchL[ MAX_NB_SUBFR ], /* I
Pitch lags */ |
| 91 const opus_int Lambda_Q10, /* I
Rate/distortion tradeoff */ | 91 const opus_int Lambda_Q10, /* I
Rate/distortion tradeoff */ |
| 92 const opus_int LTP_scale_Q14 /* I
LTP state scaling */ | 92 const opus_int LTP_scale_Q14 /* I
LTP state scaling */ |
| 93 ) | 93 ) |
| 94 { | 94 { |
| 95 opus_int k, lag, start_idx, LSF_interpolation_flag; | 95 opus_int k, lag, start_idx, LSF_interpolation_flag; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 110 silk_assert( NSQ->prev_gain_Q16 != 0 ); | 110 silk_assert( NSQ->prev_gain_Q16 != 0 ); |
| 111 | 111 |
| 112 offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ ps
Indices->quantOffsetType ]; | 112 offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ ps
Indices->quantOffsetType ]; |
| 113 | 113 |
| 114 if( psIndices->NLSFInterpCoef_Q2 == 4 ) { | 114 if( psIndices->NLSFInterpCoef_Q2 == 4 ) { |
| 115 LSF_interpolation_flag = 0; | 115 LSF_interpolation_flag = 0; |
| 116 } else { | 116 } else { |
| 117 LSF_interpolation_flag = 1; | 117 LSF_interpolation_flag = 1; |
| 118 } | 118 } |
| 119 | 119 |
| 120 ALLOC( sLTP_Q15, | 120 ALLOC( sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 )
; |
| 121 psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 ); | |
| 122 ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); | 121 ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); |
| 123 ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); | 122 ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); |
| 124 /* Set up pointers to start of sub frame */ | 123 /* Set up pointers to start of sub frame */ |
| 125 NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length; | 124 NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length; |
| 126 NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; | 125 NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; |
| 127 pxq = &NSQ->xq[ psEncC->ltp_mem_length ]; | 126 pxq = &NSQ->xq[ psEncC->ltp_mem_length ]; |
| 128 for( k = 0; k < psEncC->nb_subfr; k++ ) { | 127 for( k = 0; k < psEncC->nb_subfr; k++ ) { |
| 129 A_Q12 = &PredCoef_Q12[ (( k >> 1 ) | ( 1 - LSF_interpolation_flag )
) * MAX_LPC_ORDER ]; | 128 A_Q12 = &PredCoef_Q12[ (( k >> 1 ) | ( 1 - LSF_interpolation_flag )
) * MAX_LPC_ORDER ]; |
| 130 B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; | 129 B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; |
| 131 AR_shp_Q13 = &AR2_Q13[ k * MAX_SHAPE_LPC_ORDER ]; | 130 AR_shp_Q13 = &AR_Q13[ k * MAX_SHAPE_LPC_ORDER ]; |
| 132 | 131 |
| 133 /* Noise shape parameters */ | 132 /* Noise shape parameters */ |
| 134 silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); | 133 silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); |
| 135 HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShap
eGain_Q14[ k ], 2 ); | 134 HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShap
eGain_Q14[ k ], 2 ); |
| 136 HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShap
eGain_Q14[ k ], 1 ), 16 ); | 135 HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShap
eGain_Q14[ k ], 1 ), 16 ); |
| 137 | 136 |
| 138 NSQ->rewhite_flag = 0; | 137 NSQ->rewhite_flag = 0; |
| 139 if( psIndices->signalType == TYPE_VOICED ) { | 138 if( psIndices->signalType == TYPE_VOICED ) { |
| 140 /* Voiced */ | 139 /* Voiced */ |
| 141 lag = pitchL[ k ]; | 140 lag = pitchL[ k ]; |
| 142 | 141 |
| 143 /* Re-whitening */ | 142 /* Re-whitening */ |
| 144 if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 )
{ | 143 if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 )
{ |
| 145 /* Rewhiten with new A coefs */ | 144 /* Rewhiten with new A coefs */ |
| 146 start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrd
er - LTP_ORDER / 2; | 145 start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrd
er - LTP_ORDER / 2; |
| 147 silk_assert( start_idx > 0 ); | 146 silk_assert( start_idx > 0 ); |
| 148 | 147 |
| 149 silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_id
x + k * psEncC->subfr_length ], | 148 silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_id
x + k * psEncC->subfr_length ], |
| 150 A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLP
COrder, psEncC->arch ); | 149 A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLP
COrder, psEncC->arch ); |
| 151 | 150 |
| 152 NSQ->rewhite_flag = 1; | 151 NSQ->rewhite_flag = 1; |
| 153 NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; | 152 NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; |
| 154 } | 153 } |
| 155 } | 154 } |
| 156 | 155 |
| 157 silk_nsq_scale_states( psEncC, NSQ, x_Q3, x_sc_Q10, sLTP, sLTP_Q15, k, L
TP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType ); | 156 silk_nsq_scale_states( psEncC, NSQ, x16, x_sc_Q10, sLTP, sLTP_Q15, k, LT
P_scale_Q14, Gains_Q16, pitchL, psIndices->signalType ); |
| 158 | 157 |
| 159 silk_noise_shape_quantizer( NSQ, psIndices->signalType, x_sc_Q10, pulses
, pxq, sLTP_Q15, A_Q12, B_Q14, | 158 silk_noise_shape_quantizer( NSQ, psIndices->signalType, x_sc_Q10, pulses
, pxq, sLTP_Q15, A_Q12, B_Q14, |
| 160 AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[
k ], Gains_Q16[ k ], Lambda_Q10, | 159 AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[
k ], Gains_Q16[ k ], Lambda_Q10, |
| 161 offset_Q10, psEncC->subfr_length, psEncC->shapingLPCOrder, psEncC->p
redictLPCOrder, psEncC->arch ); | 160 offset_Q10, psEncC->subfr_length, psEncC->shapingLPCOrder, psEncC->p
redictLPCOrder, psEncC->arch ); |
| 162 | 161 |
| 163 x_Q3 += psEncC->subfr_length; | 162 x16 += psEncC->subfr_length; |
| 164 pulses += psEncC->subfr_length; | 163 pulses += psEncC->subfr_length; |
| 165 pxq += psEncC->subfr_length; | 164 pxq += psEncC->subfr_length; |
| 166 } | 165 } |
| 167 | 166 |
| 168 /* Update lagPrev for next frame */ | 167 /* Update lagPrev for next frame */ |
| 169 NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; | 168 NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; |
| 170 | 169 |
| 171 /* Save quantized speech and noise shaping signals */ | 170 /* Save quantized speech and noise shaping signals */ |
| 172 /* DEBUG_STORE_DATA( enc.pcm, &NSQ->xq[ psEncC->ltp_mem_length ], psEncC->fr
ame_length * sizeof( opus_int16 ) ) */ | |
| 173 silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ],
psEncC->ltp_mem_length * sizeof( opus_int16 ) ); | 171 silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ],
psEncC->ltp_mem_length * sizeof( opus_int16 ) ); |
| 174 silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ],
psEncC->ltp_mem_length * sizeof( opus_int32 ) ); | 172 silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ],
psEncC->ltp_mem_length * sizeof( opus_int32 ) ); |
| 175 RESTORE_STACK; | 173 RESTORE_STACK; |
| 176 } | 174 } |
| 177 | 175 |
| 178 /***********************************/ | 176 /***********************************/ |
| 179 /* silk_noise_shape_quantizer */ | 177 /* silk_noise_shape_quantizer */ |
| 180 /***********************************/ | 178 /***********************************/ |
| 181 | 179 |
| 182 #if !defined(OPUS_X86_MAY_HAVE_SSE4_1) | 180 #if !defined(OPUS_X86_MAY_HAVE_SSE4_1) |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -2 ], b_Q14[
2 ] ); | 241 LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -2 ], b_Q14[
2 ] ); |
| 244 LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -3 ], b_Q14[
3 ] ); | 242 LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -3 ], b_Q14[
3 ] ); |
| 245 LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -4 ], b_Q14[
4 ] ); | 243 LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -4 ], b_Q14[
4 ] ); |
| 246 pred_lag_ptr++; | 244 pred_lag_ptr++; |
| 247 } else { | 245 } else { |
| 248 LTP_pred_Q13 = 0; | 246 LTP_pred_Q13 = 0; |
| 249 } | 247 } |
| 250 | 248 |
| 251 /* Noise shape feedback */ | 249 /* Noise shape feedback */ |
| 252 silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is ev
en */ | 250 silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is ev
en */ |
| 253 n_AR_Q12 = silk_NSQ_noise_shape_feedback_loop(psLPC_Q14, NSQ->sAR2_Q14,
AR_shp_Q13, shapingLPCOrder, arch); | 251 n_AR_Q12 = silk_NSQ_noise_shape_feedback_loop(&NSQ->sDiff_shp_Q14, NSQ->
sAR2_Q14, AR_shp_Q13, shapingLPCOrder, arch); |
| 254 | 252 |
| 255 n_AR_Q12 = silk_SMLAWB( n_AR_Q12, NSQ->sLF_AR_shp_Q14, Tilt_Q14 ); | 253 n_AR_Q12 = silk_SMLAWB( n_AR_Q12, NSQ->sLF_AR_shp_Q14, Tilt_Q14 ); |
| 256 | 254 |
| 257 n_LF_Q12 = silk_SMULWB( NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - 1 ],
LF_shp_Q14 ); | 255 n_LF_Q12 = silk_SMULWB( NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - 1 ],
LF_shp_Q14 ); |
| 258 n_LF_Q12 = silk_SMLAWT( n_LF_Q12, NSQ->sLF_AR_shp_Q14, LF_shp_Q14 ); | 256 n_LF_Q12 = silk_SMLAWT( n_LF_Q12, NSQ->sLF_AR_shp_Q14, LF_shp_Q14 ); |
| 259 | 257 |
| 260 silk_assert( lag > 0 || signalType != TYPE_VOICED ); | 258 silk_assert( lag > 0 || signalType != TYPE_VOICED ); |
| 261 | 259 |
| 262 /* Combine prediction and noise shaping signals */ | 260 /* Combine prediction and noise shaping signals */ |
| 263 tmp1 = silk_SUB32( silk_LSHIFT32( LPC_pred_Q10, 2 ), n_AR_Q12 );
/* Q12 */ | 261 tmp1 = silk_SUB32( silk_LSHIFT32( LPC_pred_Q10, 2 ), n_AR_Q12 );
/* Q12 */ |
| 264 tmp1 = silk_SUB32( tmp1, n_LF_Q12 );
/* Q12 */ | 262 tmp1 = silk_SUB32( tmp1, n_LF_Q12 );
/* Q12 */ |
| 265 if( lag > 0 ) { | 263 if( lag > 0 ) { |
| 266 /* Symmetric, packed FIR coefficients */ | 264 /* Symmetric, packed FIR coefficients */ |
| 267 n_LTP_Q13 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[
-2 ] ), HarmShapeFIRPacked_Q14 ); | 265 n_LTP_Q13 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[
-2 ] ), HarmShapeFIRPacked_Q14 ); |
| 268 n_LTP_Q13 = silk_SMLAWT( n_LTP_Q13, shp_lag_ptr[ -1 ],
HarmShapeFIRPacked_Q14 ); | 266 n_LTP_Q13 = silk_SMLAWT( n_LTP_Q13, shp_lag_ptr[ -1 ],
HarmShapeFIRPacked_Q14 ); |
| 269 n_LTP_Q13 = silk_LSHIFT( n_LTP_Q13, 1 ); | 267 n_LTP_Q13 = silk_LSHIFT( n_LTP_Q13, 1 ); |
| 270 shp_lag_ptr++; | 268 shp_lag_ptr++; |
| 271 | 269 |
| 272 tmp2 = silk_SUB32( LTP_pred_Q13, n_LTP_Q13 );
/* Q13 */ | 270 tmp2 = silk_SUB32( LTP_pred_Q13, n_LTP_Q13 );
/* Q13 */ |
| 273 tmp1 = silk_ADD_LSHIFT32( tmp2, tmp1, 1 );
/* Q13 */ | 271 tmp1 = silk_ADD_LSHIFT32( tmp2, tmp1, 1 );
/* Q13 */ |
| 274 tmp1 = silk_RSHIFT_ROUND( tmp1, 3 );
/* Q10 */ | 272 tmp1 = silk_RSHIFT_ROUND( tmp1, 3 );
/* Q10 */ |
| 275 } else { | 273 } else { |
| 276 tmp1 = silk_RSHIFT_ROUND( tmp1, 2 );
/* Q10 */ | 274 tmp1 = silk_RSHIFT_ROUND( tmp1, 2 );
/* Q10 */ |
| 277 } | 275 } |
| 278 | 276 |
| 279 r_Q10 = silk_SUB32( x_sc_Q10[ i ], tmp1 );
/* residual error Q10 */ | 277 r_Q10 = silk_SUB32( x_sc_Q10[ i ], tmp1 );
/* residual error Q10 */ |
| 280 | 278 |
| 281 /* Flip sign depending on dither */ | 279 /* Flip sign depending on dither */ |
| 282 if ( NSQ->rand_seed < 0 ) { | 280 if( NSQ->rand_seed < 0 ) { |
| 283 r_Q10 = -r_Q10; | 281 r_Q10 = -r_Q10; |
| 284 } | 282 } |
| 285 r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 ); | 283 r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 ); |
| 286 | 284 |
| 287 /* Find two quantization level candidates and measure their rate-distort
ion */ | 285 /* Find two quantization level candidates and measure their rate-distort
ion */ |
| 288 q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); | 286 q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); |
| 289 q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); | 287 q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); |
| 288 if (Lambda_Q10 > 2048) { |
| 289 /* For aggressive RDO, the bias becomes more than one pulse. */ |
| 290 int rdo_offset = Lambda_Q10/2 - 512; |
| 291 if (q1_Q10 > rdo_offset) { |
| 292 q1_Q0 = silk_RSHIFT( q1_Q10 - rdo_offset, 10 ); |
| 293 } else if (q1_Q10 < -rdo_offset) { |
| 294 q1_Q0 = silk_RSHIFT( q1_Q10 + rdo_offset, 10 ); |
| 295 } else if (q1_Q10 < 0) { |
| 296 q1_Q0 = -1; |
| 297 } else { |
| 298 q1_Q0 = 0; |
| 299 } |
| 300 } |
| 290 if( q1_Q0 > 0 ) { | 301 if( q1_Q0 > 0 ) { |
| 291 q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q
10 ); | 302 q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q
10 ); |
| 292 q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); | 303 q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); |
| 293 q2_Q10 = silk_ADD32( q1_Q10, 1024 ); | 304 q2_Q10 = silk_ADD32( q1_Q10, 1024 ); |
| 294 rd1_Q20 = silk_SMULBB( q1_Q10, Lambda_Q10 ); | 305 rd1_Q20 = silk_SMULBB( q1_Q10, Lambda_Q10 ); |
| 295 rd2_Q20 = silk_SMULBB( q2_Q10, Lambda_Q10 ); | 306 rd2_Q20 = silk_SMULBB( q2_Q10, Lambda_Q10 ); |
| 296 } else if( q1_Q0 == 0 ) { | 307 } else if( q1_Q0 == 0 ) { |
| 297 q1_Q10 = offset_Q10; | 308 q1_Q10 = offset_Q10; |
| 298 q2_Q10 = silk_ADD32( q1_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 ); | 309 q2_Q10 = silk_ADD32( q1_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 ); |
| 299 rd1_Q20 = silk_SMULBB( q1_Q10, Lambda_Q10 ); | 310 rd1_Q20 = silk_SMULBB( q1_Q10, Lambda_Q10 ); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 330 /* Add predictions */ | 341 /* Add predictions */ |
| 331 LPC_exc_Q14 = silk_ADD_LSHIFT32( exc_Q14, LTP_pred_Q13, 1 ); | 342 LPC_exc_Q14 = silk_ADD_LSHIFT32( exc_Q14, LTP_pred_Q13, 1 ); |
| 332 xq_Q14 = silk_ADD_LSHIFT32( LPC_exc_Q14, LPC_pred_Q10, 4 ); | 343 xq_Q14 = silk_ADD_LSHIFT32( LPC_exc_Q14, LPC_pred_Q10, 4 ); |
| 333 | 344 |
| 334 /* Scale XQ back to normal level before saving */ | 345 /* Scale XQ back to normal level before saving */ |
| 335 xq[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( xq_Q14
, Gain_Q10 ), 8 ) ); | 346 xq[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( xq_Q14
, Gain_Q10 ), 8 ) ); |
| 336 | 347 |
| 337 /* Update states */ | 348 /* Update states */ |
| 338 psLPC_Q14++; | 349 psLPC_Q14++; |
| 339 *psLPC_Q14 = xq_Q14; | 350 *psLPC_Q14 = xq_Q14; |
| 340 sLF_AR_shp_Q14 = silk_SUB_LSHIFT32( xq_Q14, n_AR_Q12, 2 ); | 351 NSQ->sDiff_shp_Q14 = silk_SUB_LSHIFT32( xq_Q14, x_sc_Q10[ i ], 4 ); |
| 352 sLF_AR_shp_Q14 = silk_SUB_LSHIFT32( NSQ->sDiff_shp_Q14, n_AR_Q12, 2 ); |
| 341 NSQ->sLF_AR_shp_Q14 = sLF_AR_shp_Q14; | 353 NSQ->sLF_AR_shp_Q14 = sLF_AR_shp_Q14; |
| 342 | 354 |
| 343 NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx ] = silk_SUB_LSHIFT32( sLF_AR_s
hp_Q14, n_LF_Q12, 2 ); | 355 NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx ] = silk_SUB_LSHIFT32( sLF_AR_s
hp_Q14, n_LF_Q12, 2 ); |
| 344 sLTP_Q15[ NSQ->sLTP_buf_idx ] = silk_LSHIFT( LPC_exc_Q14, 1 ); | 356 sLTP_Q15[ NSQ->sLTP_buf_idx ] = silk_LSHIFT( LPC_exc_Q14, 1 ); |
| 345 NSQ->sLTP_shp_buf_idx++; | 357 NSQ->sLTP_shp_buf_idx++; |
| 346 NSQ->sLTP_buf_idx++; | 358 NSQ->sLTP_buf_idx++; |
| 347 | 359 |
| 348 /* Make dither dependent on quantized signal */ | 360 /* Make dither dependent on quantized signal */ |
| 349 NSQ->rand_seed = silk_ADD32_ovflw( NSQ->rand_seed, pulses[ i ] ); | 361 NSQ->rand_seed = silk_ADD32_ovflw( NSQ->rand_seed, pulses[ i ] ); |
| 350 } | 362 } |
| 351 | 363 |
| 352 /* Update LPC synth buffer */ | 364 /* Update LPC synth buffer */ |
| 353 silk_memcpy( NSQ->sLPC_Q14, &NSQ->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * s
izeof( opus_int32 ) ); | 365 silk_memcpy( NSQ->sLPC_Q14, &NSQ->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * s
izeof( opus_int32 ) ); |
| 354 } | 366 } |
| 355 | 367 |
| 356 static OPUS_INLINE void silk_nsq_scale_states( | 368 static OPUS_INLINE void silk_nsq_scale_states( |
| 357 const silk_encoder_state *psEncC, /* I Encoder State
*/ | 369 const silk_encoder_state *psEncC, /* I Encoder State
*/ |
| 358 silk_nsq_state *NSQ, /* I/O NSQ state
*/ | 370 silk_nsq_state *NSQ, /* I/O NSQ state
*/ |
| 359 const opus_int32 x_Q3[], /* I input in Q3
*/ | 371 const opus_int16 x16[], /* I input
*/ |
| 360 opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain
*/ | 372 opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain
*/ |
| 361 const opus_int16 sLTP[], /* I re-whitened LTP state in
Q0 */ | 373 const opus_int16 sLTP[], /* I re-whitened LTP state in
Q0 */ |
| 362 opus_int32 sLTP_Q15[], /* O LTP state matching scale
d input */ | 374 opus_int32 sLTP_Q15[], /* O LTP state matching scale
d input */ |
| 363 opus_int subfr, /* I subframe number
*/ | 375 opus_int subfr, /* I subframe number
*/ |
| 364 const opus_int LTP_scale_Q14, /* I
*/ | 376 const opus_int LTP_scale_Q14, /* I
*/ |
| 365 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I
*/ | 377 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I
*/ |
| 366 const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag
*/ | 378 const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag
*/ |
| 367 const opus_int signal_type /* I Signal type
*/ | 379 const opus_int signal_type /* I Signal type
*/ |
| 368 ) | 380 ) |
| 369 { | 381 { |
| 370 opus_int i, lag; | 382 opus_int i, lag; |
| 371 opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q23; | 383 opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q26; |
| 372 | 384 |
| 373 lag = pitchL[ subfr ]; | 385 lag = pitchL[ subfr ]; |
| 374 inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); | 386 inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); |
| 375 silk_assert( inv_gain_Q31 != 0 ); | 387 silk_assert( inv_gain_Q31 != 0 ); |
| 376 | 388 |
| 377 /* Calculate gain adjustment factor */ | 389 /* Scale input */ |
| 378 if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { | 390 inv_gain_Q26 = silk_RSHIFT_ROUND( inv_gain_Q31, 5 ); |
| 379 gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ],
16 ); | 391 for( i = 0; i < psEncC->subfr_length; i++ ) { |
| 380 } else { | 392 x_sc_Q10[ i ] = silk_SMULWW( x16[ i ], inv_gain_Q26 ); |
| 381 gain_adj_Q16 = (opus_int32)1 << 16; | |
| 382 } | 393 } |
| 383 | 394 |
| 384 /* Scale input */ | |
| 385 inv_gain_Q23 = silk_RSHIFT_ROUND( inv_gain_Q31, 8 ); | |
| 386 for( i = 0; i < psEncC->subfr_length; i++ ) { | |
| 387 x_sc_Q10[ i ] = silk_SMULWW( x_Q3[ i ], inv_gain_Q23 ); | |
| 388 } | |
| 389 | |
| 390 /* Save inverse gain */ | |
| 391 NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; | |
| 392 | |
| 393 /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16
*/ | 395 /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16
*/ |
| 394 if( NSQ->rewhite_flag ) { | 396 if( NSQ->rewhite_flag ) { |
| 395 if( subfr == 0 ) { | 397 if( subfr == 0 ) { |
| 396 /* Do LTP downscaling */ | 398 /* Do LTP downscaling */ |
| 397 inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14
), 2 ); | 399 inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14
), 2 ); |
| 398 } | 400 } |
| 399 for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx;
i++ ) { | 401 for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx;
i++ ) { |
| 400 silk_assert( i < MAX_FRAME_LENGTH ); | 402 silk_assert( i < MAX_FRAME_LENGTH ); |
| 401 sLTP_Q15[ i ] = silk_SMULWB( inv_gain_Q31, sLTP[ i ] ); | 403 sLTP_Q15[ i ] = silk_SMULWB( inv_gain_Q31, sLTP[ i ] ); |
| 402 } | 404 } |
| 403 } | 405 } |
| 404 | 406 |
| 405 /* Adjust for changing gain */ | 407 /* Adjust for changing gain */ |
| 406 if( gain_adj_Q16 != (opus_int32)1 << 16 ) { | 408 if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { |
| 409 gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ],
16 ); |
| 410 |
| 407 /* Scale long-term shaping state */ | 411 /* Scale long-term shaping state */ |
| 408 for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_s
hp_buf_idx; i++ ) { | 412 for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_s
hp_buf_idx; i++ ) { |
| 409 NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q1
4[ i ] ); | 413 NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q1
4[ i ] ); |
| 410 } | 414 } |
| 411 | 415 |
| 412 /* Scale long-term prediction state */ | 416 /* Scale long-term prediction state */ |
| 413 if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) { | 417 if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) { |
| 414 for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_
idx; i++ ) { | 418 for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_
idx; i++ ) { |
| 415 sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] ); | 419 sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] ); |
| 416 } | 420 } |
| 417 } | 421 } |
| 418 | 422 |
| 419 NSQ->sLF_AR_shp_Q14 = silk_SMULWW( gain_adj_Q16, NSQ->sLF_AR_shp_Q14 ); | 423 NSQ->sLF_AR_shp_Q14 = silk_SMULWW( gain_adj_Q16, NSQ->sLF_AR_shp_Q14 ); |
| 424 NSQ->sDiff_shp_Q14 = silk_SMULWW( gain_adj_Q16, NSQ->sDiff_shp_Q14 ); |
| 420 | 425 |
| 421 /* Scale short-term prediction and shaping states */ | 426 /* Scale short-term prediction and shaping states */ |
| 422 for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { | 427 for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { |
| 423 NSQ->sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLPC_Q14[ i ] )
; | 428 NSQ->sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLPC_Q14[ i ] )
; |
| 424 } | 429 } |
| 425 for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { | 430 for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { |
| 426 NSQ->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sAR2_Q14[ i ] )
; | 431 NSQ->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sAR2_Q14[ i ] )
; |
| 427 } | 432 } |
| 433 |
| 434 /* Save inverse gain */ |
| 435 NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; |
| 428 } | 436 } |
| 429 } | 437 } |
| OLD | NEW |