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

Side by Side Diff: third_party/opus/src/silk/NSQ.c

Issue 2962373002: [Opus] Update to v1.2.1 (Closed)
Patch Set: Pre-increment instead of post-increment Created 3 years, 5 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 unified diff | Download patch
« no previous file with comments | « third_party/opus/src/silk/NLSF_encode.c ('k') | third_party/opus/src/silk/NSQ_del_dec.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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 = &LTPCoef_Q14[ k * LTP_ORDER ]; 129 B_Q14 = &LTPCoef_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
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
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 }
OLDNEW
« no previous file with comments | « third_party/opus/src/silk/NLSF_encode.c ('k') | third_party/opus/src/silk/NSQ_del_dec.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698