1 /***********************************************************************
2 Copyright (c) 2006-2011, Skype Limited. All rights reserved.
3 Redistribution and use in source and binary forms, with or without
4 modification, are permitted provided that the following conditions
5 are met:
6 - Redistributions of source code must retain the above copyright notice,
7 this list of conditions and the following disclaimer.
8 - Redistributions in binary form must reproduce the above copyright
9 notice, this list of conditions and the following disclaimer in the
10 documentation and/or other materials provided with the distribution.
11 - Neither the name of Internet Society, IETF or IETF Trust, nor the
12 names of specific contributors, may be used to endorse or promote
13 products derived from this software without specific prior written
14 permission.
15 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 POSSIBILITY OF SUCH DAMAGE.
26 ***********************************************************************/
27
28 #ifdef HAVE_CONFIG_H
29 #include "config.h"
30 #endif
31
32 #include "main.h"
33 #include "stack_alloc.h"
34 #include "NSQ.h"
35
36
37 typedef struct {
38 opus_int32 sLPC_Q14[ MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH ];
39 opus_int32 RandState[ DECISION_DELAY ];
40 opus_int32 Q_Q10[ DECISION_DELAY ];
41 opus_int32 Xq_Q14[ DECISION_DELAY ];
42 opus_int32 Pred_Q15[ DECISION_DELAY ];
43 opus_int32 Shape_Q14[ DECISION_DELAY ];
44 opus_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ];
45 opus_int32 LF_AR_Q14;
46 opus_int32 Diff_Q14;
47 opus_int32 Seed;
48 opus_int32 SeedInit;
49 opus_int32 RD_Q10;
50 } NSQ_del_dec_struct;
51
52 typedef struct {
53 opus_int32 Q_Q10;
54 opus_int32 RD_Q10;
55 opus_int32 xq_Q14;
56 opus_int32 LF_AR_Q14;
57 opus_int32 Diff_Q14;
58 opus_int32 sLTP_shp_Q14;
59 opus_int32 LPC_exc_Q14;
60 } NSQ_sample_struct;
61
62 typedef NSQ_sample_struct NSQ_sample_pair[ 2 ];
63
64 #if defined(MIPSr1_ASM)
65 #include "mips/NSQ_del_dec_mipsr1.h"
66 #endif
67 static OPUS_INLINE void silk_nsq_del_dec_scale_states(
68 const silk_encoder_state *psEncC, /* I Encoder State */
69 silk_nsq_state *NSQ, /* I/O NSQ state */
70 NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */
71 const opus_int16 x16[], /* I Input */
72 opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */
73 const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */
74 opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */
75 opus_int subfr, /* I Subframe number */
76 opus_int nStatesDelayedDecision, /* I Number of del dec states */
77 const opus_int LTP_scale_Q14, /* I LTP state scaling */
78 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */
79 const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */
80 const opus_int signal_type, /* I Signal type */
81 const opus_int decisionDelay /* I Decision delay */
82 );
83
84 /******************************************/
85 /* Noise shape quantizer for one subframe */
86 /******************************************/
87 static OPUS_INLINE void silk_noise_shape_quantizer_del_dec(
88 silk_nsq_state *NSQ, /* I/O NSQ state */
89 NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */
90 opus_int signalType, /* I Signal type */
91 const opus_int32 x_Q10[], /* I */
92 opus_int8 pulses[], /* O */
93 opus_int16 xq[], /* O */
94 opus_int32 sLTP_Q15[], /* I/O LTP filter state */
95 opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */
96 const opus_int16 a_Q12[], /* I Short term prediction coefs */
97 const opus_int16 b_Q14[], /* I Long term prediction coefs */
98 const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */
99 opus_int lag, /* I Pitch lag */
100 opus_int32 HarmShapeFIRPacked_Q14, /* I */
101 opus_int Tilt_Q14, /* I Spectral tilt */
102 opus_int32 LF_shp_Q14, /* I */
103 opus_int32 Gain_Q16, /* I */
104 opus_int Lambda_Q10, /* I */
105 opus_int offset_Q10, /* I */
106 opus_int length, /* I Input length */
107 opus_int subfr, /* I Subframe number */
108 opus_int shapingLPCOrder, /* I Shaping LPC filter order */
109 opus_int predictLPCOrder, /* I Prediction filter order */
110 opus_int warping_Q16, /* I */
111 opus_int nStatesDelayedDecision, /* I Number of states in decision tree */
112 opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */
113 opus_int decisionDelay, /* I */
114 int arch /* I */
115 );
116
silk_NSQ_del_dec_c(const silk_encoder_state * psEncC,silk_nsq_state * NSQ,SideInfoIndices * psIndices,const opus_int16 x16[],opus_int8 pulses[],const opus_int16 PredCoef_Q12[2* MAX_LPC_ORDER],const opus_int16 LTPCoef_Q14[LTP_ORDER * MAX_NB_SUBFR],const opus_int16 AR_Q13[MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER],const opus_int HarmShapeGain_Q14[MAX_NB_SUBFR],const opus_int Tilt_Q14[MAX_NB_SUBFR],const opus_int32 LF_shp_Q14[MAX_NB_SUBFR],const opus_int32 Gains_Q16[MAX_NB_SUBFR],const opus_int pitchL[MAX_NB_SUBFR],const opus_int Lambda_Q10,const opus_int LTP_scale_Q14)117 void silk_NSQ_del_dec_c(
118 const silk_encoder_state *psEncC, /* I Encoder State */
119 silk_nsq_state *NSQ, /* I/O NSQ state */
120 SideInfoIndices *psIndices, /* I/O Quantization Indices */
121 const opus_int16 x16[], /* I Input */
122 opus_int8 pulses[], /* O Quantized pulse signal */
123 const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */
124 const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */
125 const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */
126 const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */
127 const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */
128 const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */
129 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */
130 const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */
131 const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */
132 const opus_int LTP_scale_Q14 /* I LTP state scaling */
133 )
134 {
135 opus_int i, k, lag, start_idx, LSF_interpolation_flag, Winner_ind, subfr;
136 opus_int last_smple_idx, smpl_buf_idx, decisionDelay;
137 const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13;
138 opus_int16 *pxq;
139 VARDECL( opus_int32, sLTP_Q15 );
140 VARDECL( opus_int16, sLTP );
141 opus_int32 HarmShapeFIRPacked_Q14;
142 opus_int offset_Q10;
143 opus_int32 RDmin_Q10, Gain_Q10;
144 VARDECL( opus_int32, x_sc_Q10 );
145 VARDECL( opus_int32, delayedGain_Q10 );
146 VARDECL( NSQ_del_dec_struct, psDelDec );
147 NSQ_del_dec_struct *psDD;
148 SAVE_STACK;
149
150 /* Set unvoiced lag to the previous one, overwrite later for voiced */
151 lag = NSQ->lagPrev;
152
153 silk_assert( NSQ->prev_gain_Q16 != 0 );
154
155 /* Initialize delayed decision states */
156 ALLOC( psDelDec, psEncC->nStatesDelayedDecision, NSQ_del_dec_struct );
157 silk_memset( psDelDec, 0, psEncC->nStatesDelayedDecision * sizeof( NSQ_del_dec_struct ) );
158 for( k = 0; k < psEncC->nStatesDelayedDecision; k++ ) {
159 psDD = &psDelDec[ k ];
160 psDD->Seed = ( k + psIndices->Seed ) & 3;
161 psDD->SeedInit = psDD->Seed;
162 psDD->RD_Q10 = 0;
163 psDD->LF_AR_Q14 = NSQ->sLF_AR_shp_Q14;
164 psDD->Diff_Q14 = NSQ->sDiff_shp_Q14;
165 psDD->Shape_Q14[ 0 ] = NSQ->sLTP_shp_Q14[ psEncC->ltp_mem_length - 1 ];
166 silk_memcpy( psDD->sLPC_Q14, NSQ->sLPC_Q14, NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) );
167 silk_memcpy( psDD->sAR2_Q14, NSQ->sAR2_Q14, sizeof( NSQ->sAR2_Q14 ) );
168 }
169
170 offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ psIndices->quantOffsetType ];
171 smpl_buf_idx = 0; /* index of oldest samples */
172
173 decisionDelay = silk_min_int( DECISION_DELAY, psEncC->subfr_length );
174
175 /* For voiced frames limit the decision delay to lower than the pitch lag */
176 if( psIndices->signalType == TYPE_VOICED ) {
177 for( k = 0; k < psEncC->nb_subfr; k++ ) {
178 decisionDelay = silk_min_int( decisionDelay, pitchL[ k ] - LTP_ORDER / 2 - 1 );
179 }
180 } else {
181 if( lag > 0 ) {
182 decisionDelay = silk_min_int( decisionDelay, lag - LTP_ORDER / 2 - 1 );
183 }
184 }
185
186 if( psIndices->NLSFInterpCoef_Q2 == 4 ) {
187 LSF_interpolation_flag = 0;
188 } else {
189 LSF_interpolation_flag = 1;
190 }
191
192 ALLOC( sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 );
193 ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 );
194 ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 );
195 ALLOC( delayedGain_Q10, DECISION_DELAY, opus_int32 );
196 /* Set up pointers to start of sub frame */
197 pxq = &NSQ->xq[ psEncC->ltp_mem_length ];
198 NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length;
199 NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
200 subfr = 0;
201 for( k = 0; k < psEncC->nb_subfr; k++ ) {
202 A_Q12 = &PredCoef_Q12[ ( ( k >> 1 ) | ( 1 - LSF_interpolation_flag ) ) * MAX_LPC_ORDER ];
203 B_Q14 = <PCoef_Q14[ k * LTP_ORDER ];
204 AR_shp_Q13 = &AR_Q13[ k * MAX_SHAPE_LPC_ORDER ];
205
206 /* Noise shape parameters */
207 silk_assert( HarmShapeGain_Q14[ k ] >= 0 );
208 HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShapeGain_Q14[ k ], 2 );
209 HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 );
210
211 NSQ->rewhite_flag = 0;
212 if( psIndices->signalType == TYPE_VOICED ) {
213 /* Voiced */
214 lag = pitchL[ k ];
215
216 /* Re-whitening */
217 if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) {
218 if( k == 2 ) {
219 /* RESET DELAYED DECISIONS */
220 /* Find winner */
221 RDmin_Q10 = psDelDec[ 0 ].RD_Q10;
222 Winner_ind = 0;
223 for( i = 1; i < psEncC->nStatesDelayedDecision; i++ ) {
224 if( psDelDec[ i ].RD_Q10 < RDmin_Q10 ) {
225 RDmin_Q10 = psDelDec[ i ].RD_Q10;
226 Winner_ind = i;
227 }
228 }
229 for( i = 0; i < psEncC->nStatesDelayedDecision; i++ ) {
230 if( i != Winner_ind ) {
231 psDelDec[ i ].RD_Q10 += ( silk_int32_MAX >> 4 );
232 silk_assert( psDelDec[ i ].RD_Q10 >= 0 );
233 }
234 }
235
236 /* Copy final part of signals from winner state to output and long-term filter states */
237 psDD = &psDelDec[ Winner_ind ];
238 last_smple_idx = smpl_buf_idx + decisionDelay;
239 for( i = 0; i < decisionDelay; i++ ) {
240 last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY;
241 if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY;
242 pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 );
243 pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND(
244 silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gains_Q16[ 1 ] ), 14 ) );
245 NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->Shape_Q14[ last_smple_idx ];
246 }
247
248 subfr = 0;
249 }
250
251 /* Rewhiten with new A coefs */
252 start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2;
253 celt_assert( start_idx > 0 );
254
255 silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ],
256 A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch );
257
258 NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
259 NSQ->rewhite_flag = 1;
260 }
261 }
262
263 silk_nsq_del_dec_scale_states( psEncC, NSQ, psDelDec, x16, x_sc_Q10, sLTP, sLTP_Q15, k,
264 psEncC->nStatesDelayedDecision, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType, decisionDelay );
265
266 silk_noise_shape_quantizer_del_dec( NSQ, psDelDec, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15,
267 delayedGain_Q10, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ],
268 Gains_Q16[ k ], Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr++, psEncC->shapingLPCOrder,
269 psEncC->predictLPCOrder, psEncC->warping_Q16, psEncC->nStatesDelayedDecision, &smpl_buf_idx, decisionDelay, psEncC->arch );
270
271 x16 += psEncC->subfr_length;
272 pulses += psEncC->subfr_length;
273 pxq += psEncC->subfr_length;
274 }
275
276 /* Find winner */
277 RDmin_Q10 = psDelDec[ 0 ].RD_Q10;
278 Winner_ind = 0;
279 for( k = 1; k < psEncC->nStatesDelayedDecision; k++ ) {
280 if( psDelDec[ k ].RD_Q10 < RDmin_Q10 ) {
281 RDmin_Q10 = psDelDec[ k ].RD_Q10;
282 Winner_ind = k;
283 }
284 }
285
286 /* Copy final part of signals from winner state to output and long-term filter states */
287 psDD = &psDelDec[ Winner_ind ];
288 psIndices->Seed = psDD->SeedInit;
289 last_smple_idx = smpl_buf_idx + decisionDelay;
290 Gain_Q10 = silk_RSHIFT32( Gains_Q16[ psEncC->nb_subfr - 1 ], 6 );
291 for( i = 0; i < decisionDelay; i++ ) {
292 last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY;
293 if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY;
294
295 pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 );
296 pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND(
297 silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gain_Q10 ), 8 ) );
298 NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->Shape_Q14[ last_smple_idx ];
299 }
300 silk_memcpy( NSQ->sLPC_Q14, &psDD->sLPC_Q14[ psEncC->subfr_length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) );
301 silk_memcpy( NSQ->sAR2_Q14, psDD->sAR2_Q14, sizeof( psDD->sAR2_Q14 ) );
302
303 /* Update states */
304 NSQ->sLF_AR_shp_Q14 = psDD->LF_AR_Q14;
305 NSQ->sDiff_shp_Q14 = psDD->Diff_Q14;
306 NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ];
307
308 /* Save quantized speech signal */
309 silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) );
310 silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) );
311 RESTORE_STACK;
312 }
313
314 /******************************************/
315 /* Noise shape quantizer for one subframe */
316 /******************************************/
317 #ifndef OVERRIDE_silk_noise_shape_quantizer_del_dec
silk_noise_shape_quantizer_del_dec(silk_nsq_state * NSQ,NSQ_del_dec_struct psDelDec[],opus_int signalType,const opus_int32 x_Q10[],opus_int8 pulses[],opus_int16 xq[],opus_int32 sLTP_Q15[],opus_int32 delayedGain_Q10[],const opus_int16 a_Q12[],const opus_int16 b_Q14[],const opus_int16 AR_shp_Q13[],opus_int lag,opus_int32 HarmShapeFIRPacked_Q14,opus_int Tilt_Q14,opus_int32 LF_shp_Q14,opus_int32 Gain_Q16,opus_int Lambda_Q10,opus_int offset_Q10,opus_int length,opus_int subfr,opus_int shapingLPCOrder,opus_int predictLPCOrder,opus_int warping_Q16,opus_int nStatesDelayedDecision,opus_int * smpl_buf_idx,opus_int decisionDelay,int arch)318 static OPUS_INLINE void silk_noise_shape_quantizer_del_dec(
319 silk_nsq_state *NSQ, /* I/O NSQ state */
320 NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */
321 opus_int signalType, /* I Signal type */
322 const opus_int32 x_Q10[], /* I */
323 opus_int8 pulses[], /* O */
324 opus_int16 xq[], /* O */
325 opus_int32 sLTP_Q15[], /* I/O LTP filter state */
326 opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */
327 const opus_int16 a_Q12[], /* I Short term prediction coefs */
328 const opus_int16 b_Q14[], /* I Long term prediction coefs */
329 const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */
330 opus_int lag, /* I Pitch lag */
331 opus_int32 HarmShapeFIRPacked_Q14, /* I */
332 opus_int Tilt_Q14, /* I Spectral tilt */
333 opus_int32 LF_shp_Q14, /* I */
334 opus_int32 Gain_Q16, /* I */
335 opus_int Lambda_Q10, /* I */
336 opus_int offset_Q10, /* I */
337 opus_int length, /* I Input length */
338 opus_int subfr, /* I Subframe number */
339 opus_int shapingLPCOrder, /* I Shaping LPC filter order */
340 opus_int predictLPCOrder, /* I Prediction filter order */
341 opus_int warping_Q16, /* I */
342 opus_int nStatesDelayedDecision, /* I Number of states in decision tree */
343 opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */
344 opus_int decisionDelay, /* I */
345 int arch /* I */
346 )
347 {
348 opus_int i, j, k, Winner_ind, RDmin_ind, RDmax_ind, last_smple_idx;
349 opus_int32 Winner_rand_state;
350 opus_int32 LTP_pred_Q14, LPC_pred_Q14, n_AR_Q14, n_LTP_Q14;
351 opus_int32 n_LF_Q14, r_Q10, rr_Q10, rd1_Q10, rd2_Q10, RDmin_Q10, RDmax_Q10;
352 opus_int32 q1_Q0, q1_Q10, q2_Q10, exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10;
353 opus_int32 tmp1, tmp2, sLF_AR_shp_Q14;
354 opus_int32 *pred_lag_ptr, *shp_lag_ptr, *psLPC_Q14;
355 #ifdef silk_short_prediction_create_arch_coef
356 opus_int32 a_Q12_arch[MAX_LPC_ORDER];
357 #endif
358
359 VARDECL( NSQ_sample_pair, psSampleState );
360 NSQ_del_dec_struct *psDD;
361 NSQ_sample_struct *psSS;
362 SAVE_STACK;
363
364 celt_assert( nStatesDelayedDecision > 0 );
365 ALLOC( psSampleState, nStatesDelayedDecision, NSQ_sample_pair );
366
367 shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ];
368 pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ];
369 Gain_Q10 = silk_RSHIFT( Gain_Q16, 6 );
370
371 #ifdef silk_short_prediction_create_arch_coef
372 silk_short_prediction_create_arch_coef(a_Q12_arch, a_Q12, predictLPCOrder);
373 #endif
374
375 for( i = 0; i < length; i++ ) {
376 /* Perform common calculations used in all states */
377
378 /* Long-term prediction */
379 if( signalType == TYPE_VOICED ) {
380 /* Unrolled loop */
381 /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */
382 LTP_pred_Q14 = 2;
383 LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ 0 ], b_Q14[ 0 ] );
384 LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -1 ], b_Q14[ 1 ] );
385 LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -2 ], b_Q14[ 2 ] );
386 LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -3 ], b_Q14[ 3 ] );
387 LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], b_Q14[ 4 ] );
388 LTP_pred_Q14 = silk_LSHIFT( LTP_pred_Q14, 1 ); /* Q13 -> Q14 */
389 pred_lag_ptr++;
390 } else {
391 LTP_pred_Q14 = 0;
392 }
393
394 /* Long-term shaping */
395 if( lag > 0 ) {
396 /* Symmetric, packed FIR coefficients */
397 n_LTP_Q14 = silk_SMULWB( silk_ADD_SAT32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 );
398 n_LTP_Q14 = silk_SMLAWT( n_LTP_Q14, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 );
399 n_LTP_Q14 = silk_SUB_LSHIFT32( LTP_pred_Q14, n_LTP_Q14, 2 ); /* Q12 -> Q14 */
400 shp_lag_ptr++;
401 } else {
402 n_LTP_Q14 = 0;
403 }
404
405 for( k = 0; k < nStatesDelayedDecision; k++ ) {
406 /* Delayed decision state */
407 psDD = &psDelDec[ k ];
408
409 /* Sample state */
410 psSS = psSampleState[ k ];
411
412 /* Generate dither */
413 psDD->Seed = silk_RAND( psDD->Seed );
414
415 /* Pointer used in short term prediction and shaping */
416 psLPC_Q14 = &psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 + i ];
417 /* Short-term prediction */
418 LPC_pred_Q14 = silk_noise_shape_quantizer_short_prediction(psLPC_Q14, a_Q12, a_Q12_arch, predictLPCOrder, arch);
419 LPC_pred_Q14 = silk_LSHIFT( LPC_pred_Q14, 4 ); /* Q10 -> Q14 */
420
421 /* Noise shape feedback */
422 celt_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */
423 /* Output of lowpass section */
424 tmp2 = silk_SMLAWB( psDD->Diff_Q14, psDD->sAR2_Q14[ 0 ], warping_Q16 );
425 /* Output of allpass section */
426 tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ 0 ], psDD->sAR2_Q14[ 1 ] - tmp2, warping_Q16 );
427 psDD->sAR2_Q14[ 0 ] = tmp2;
428 n_AR_Q14 = silk_RSHIFT( shapingLPCOrder, 1 );
429 n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp2, AR_shp_Q13[ 0 ] );
430 /* Loop over allpass sections */
431 for( j = 2; j < shapingLPCOrder; j += 2 ) {
432 /* Output of allpass section */
433 tmp2 = silk_SMLAWB( psDD->sAR2_Q14[ j - 1 ], psDD->sAR2_Q14[ j + 0 ] - tmp1, warping_Q16 );
434 psDD->sAR2_Q14[ j - 1 ] = tmp1;
435 n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp1, AR_shp_Q13[ j - 1 ] );
436 /* Output of allpass section */
437 tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ j + 0 ], psDD->sAR2_Q14[ j + 1 ] - tmp2, warping_Q16 );
438 psDD->sAR2_Q14[ j + 0 ] = tmp2;
439 n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp2, AR_shp_Q13[ j ] );
440 }
441 psDD->sAR2_Q14[ shapingLPCOrder - 1 ] = tmp1;
442 n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp1, AR_shp_Q13[ shapingLPCOrder - 1 ] );
443
444 n_AR_Q14 = silk_LSHIFT( n_AR_Q14, 1 ); /* Q11 -> Q12 */
445 n_AR_Q14 = silk_SMLAWB( n_AR_Q14, psDD->LF_AR_Q14, Tilt_Q14 ); /* Q12 */
446 n_AR_Q14 = silk_LSHIFT( n_AR_Q14, 2 ); /* Q12 -> Q14 */
447
448 n_LF_Q14 = silk_SMULWB( psDD->Shape_Q14[ *smpl_buf_idx ], LF_shp_Q14 ); /* Q12 */
449 n_LF_Q14 = silk_SMLAWT( n_LF_Q14, psDD->LF_AR_Q14, LF_shp_Q14 ); /* Q12 */
450 n_LF_Q14 = silk_LSHIFT( n_LF_Q14, 2 ); /* Q12 -> Q14 */
451
452 /* Input minus prediction plus noise feedback */
453 /* r = x[ i ] - LTP_pred - LPC_pred + n_AR + n_Tilt + n_LF + n_LTP */
454 tmp1 = silk_ADD_SAT32( n_AR_Q14, n_LF_Q14 ); /* Q14 */
455 tmp2 = silk_ADD32( n_LTP_Q14, LPC_pred_Q14 ); /* Q13 */
456 tmp1 = silk_SUB_SAT32( tmp2, tmp1 ); /* Q13 */
457 tmp1 = silk_RSHIFT_ROUND( tmp1, 4 ); /* Q10 */
458
459 r_Q10 = silk_SUB32( x_Q10[ i ], tmp1 ); /* residual error Q10 */
460
461 /* Flip sign depending on dither */
462 if ( psDD->Seed < 0 ) {
463 r_Q10 = -r_Q10;
464 }
465 r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 );
466
467 /* Find two quantization level candidates and measure their rate-distortion */
468 q1_Q10 = silk_SUB32( r_Q10, offset_Q10 );
469 q1_Q0 = silk_RSHIFT( q1_Q10, 10 );
470 if (Lambda_Q10 > 2048) {
471 /* For aggressive RDO, the bias becomes more than one pulse. */
472 int rdo_offset = Lambda_Q10/2 - 512;
473 if (q1_Q10 > rdo_offset) {
474 q1_Q0 = silk_RSHIFT( q1_Q10 - rdo_offset, 10 );
475 } else if (q1_Q10 < -rdo_offset) {
476 q1_Q0 = silk_RSHIFT( q1_Q10 + rdo_offset, 10 );
477 } else if (q1_Q10 < 0) {
478 q1_Q0 = -1;
479 } else {
480 q1_Q0 = 0;
481 }
482 }
483 if( q1_Q0 > 0 ) {
484 q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 );
485 q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 );
486 q2_Q10 = silk_ADD32( q1_Q10, 1024 );
487 rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 );
488 rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 );
489 } else if( q1_Q0 == 0 ) {
490 q1_Q10 = offset_Q10;
491 q2_Q10 = silk_ADD32( q1_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 );
492 rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 );
493 rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 );
494 } else if( q1_Q0 == -1 ) {
495 q2_Q10 = offset_Q10;
496 q1_Q10 = silk_SUB32( q2_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 );
497 rd1_Q10 = silk_SMULBB( -q1_Q10, Lambda_Q10 );
498 rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 );
499 } else { /* q1_Q0 < -1 */
500 q1_Q10 = silk_ADD32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 );
501 q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 );
502 q2_Q10 = silk_ADD32( q1_Q10, 1024 );
503 rd1_Q10 = silk_SMULBB( -q1_Q10, Lambda_Q10 );
504 rd2_Q10 = silk_SMULBB( -q2_Q10, Lambda_Q10 );
505 }
506 rr_Q10 = silk_SUB32( r_Q10, q1_Q10 );
507 rd1_Q10 = silk_RSHIFT( silk_SMLABB( rd1_Q10, rr_Q10, rr_Q10 ), 10 );
508 rr_Q10 = silk_SUB32( r_Q10, q2_Q10 );
509 rd2_Q10 = silk_RSHIFT( silk_SMLABB( rd2_Q10, rr_Q10, rr_Q10 ), 10 );
510
511 if( rd1_Q10 < rd2_Q10 ) {
512 psSS[ 0 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd1_Q10 );
513 psSS[ 1 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd2_Q10 );
514 psSS[ 0 ].Q_Q10 = q1_Q10;
515 psSS[ 1 ].Q_Q10 = q2_Q10;
516 } else {
517 psSS[ 0 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd2_Q10 );
518 psSS[ 1 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd1_Q10 );
519 psSS[ 0 ].Q_Q10 = q2_Q10;
520 psSS[ 1 ].Q_Q10 = q1_Q10;
521 }
522
523 /* Update states for best quantization */
524
525 /* Quantized excitation */
526 exc_Q14 = silk_LSHIFT32( psSS[ 0 ].Q_Q10, 4 );
527 if ( psDD->Seed < 0 ) {
528 exc_Q14 = -exc_Q14;
529 }
530
531 /* Add predictions */
532 LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 );
533 xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 );
534
535 /* Update states */
536 psSS[ 0 ].Diff_Q14 = silk_SUB_LSHIFT32( xq_Q14, x_Q10[ i ], 4 );
537 sLF_AR_shp_Q14 = silk_SUB32( psSS[ 0 ].Diff_Q14, n_AR_Q14 );
538 psSS[ 0 ].sLTP_shp_Q14 = silk_SUB_SAT32( sLF_AR_shp_Q14, n_LF_Q14 );
539 psSS[ 0 ].LF_AR_Q14 = sLF_AR_shp_Q14;
540 psSS[ 0 ].LPC_exc_Q14 = LPC_exc_Q14;
541 psSS[ 0 ].xq_Q14 = xq_Q14;
542
543 /* Update states for second best quantization */
544
545 /* Quantized excitation */
546 exc_Q14 = silk_LSHIFT32( psSS[ 1 ].Q_Q10, 4 );
547 if ( psDD->Seed < 0 ) {
548 exc_Q14 = -exc_Q14;
549 }
550
551 /* Add predictions */
552 LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 );
553 xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 );
554
555 /* Update states */
556 psSS[ 1 ].Diff_Q14 = silk_SUB_LSHIFT32( xq_Q14, x_Q10[ i ], 4 );
557 sLF_AR_shp_Q14 = silk_SUB32( psSS[ 1 ].Diff_Q14, n_AR_Q14 );
558 psSS[ 1 ].sLTP_shp_Q14 = silk_SUB_SAT32( sLF_AR_shp_Q14, n_LF_Q14 );
559 psSS[ 1 ].LF_AR_Q14 = sLF_AR_shp_Q14;
560 psSS[ 1 ].LPC_exc_Q14 = LPC_exc_Q14;
561 psSS[ 1 ].xq_Q14 = xq_Q14;
562 }
563
564 *smpl_buf_idx = ( *smpl_buf_idx - 1 ) % DECISION_DELAY;
565 if( *smpl_buf_idx < 0 ) *smpl_buf_idx += DECISION_DELAY;
566 last_smple_idx = ( *smpl_buf_idx + decisionDelay ) % DECISION_DELAY;
567
568 /* Find winner */
569 RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10;
570 Winner_ind = 0;
571 for( k = 1; k < nStatesDelayedDecision; k++ ) {
572 if( psSampleState[ k ][ 0 ].RD_Q10 < RDmin_Q10 ) {
573 RDmin_Q10 = psSampleState[ k ][ 0 ].RD_Q10;
574 Winner_ind = k;
575 }
576 }
577
578 /* Increase RD values of expired states */
579 Winner_rand_state = psDelDec[ Winner_ind ].RandState[ last_smple_idx ];
580 for( k = 0; k < nStatesDelayedDecision; k++ ) {
581 if( psDelDec[ k ].RandState[ last_smple_idx ] != Winner_rand_state ) {
582 psSampleState[ k ][ 0 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 0 ].RD_Q10, silk_int32_MAX >> 4 );
583 psSampleState[ k ][ 1 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 1 ].RD_Q10, silk_int32_MAX >> 4 );
584 silk_assert( psSampleState[ k ][ 0 ].RD_Q10 >= 0 );
585 }
586 }
587
588 /* Find worst in first set and best in second set */
589 RDmax_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10;
590 RDmin_Q10 = psSampleState[ 0 ][ 1 ].RD_Q10;
591 RDmax_ind = 0;
592 RDmin_ind = 0;
593 for( k = 1; k < nStatesDelayedDecision; k++ ) {
594 /* find worst in first set */
595 if( psSampleState[ k ][ 0 ].RD_Q10 > RDmax_Q10 ) {
596 RDmax_Q10 = psSampleState[ k ][ 0 ].RD_Q10;
597 RDmax_ind = k;
598 }
599 /* find best in second set */
600 if( psSampleState[ k ][ 1 ].RD_Q10 < RDmin_Q10 ) {
601 RDmin_Q10 = psSampleState[ k ][ 1 ].RD_Q10;
602 RDmin_ind = k;
603 }
604 }
605
606 /* Replace a state if best from second set outperforms worst in first set */
607 if( RDmin_Q10 < RDmax_Q10 ) {
608 silk_memcpy( ( (opus_int32 *)&psDelDec[ RDmax_ind ] ) + i,
609 ( (opus_int32 *)&psDelDec[ RDmin_ind ] ) + i, sizeof( NSQ_del_dec_struct ) - i * sizeof( opus_int32) );
610 silk_memcpy( &psSampleState[ RDmax_ind ][ 0 ], &psSampleState[ RDmin_ind ][ 1 ], sizeof( NSQ_sample_struct ) );
611 }
612
613 /* Write samples from winner to output and long-term filter states */
614 psDD = &psDelDec[ Winner_ind ];
615 if( subfr > 0 || i >= decisionDelay ) {
616 pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 );
617 xq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND(
618 silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], delayedGain_Q10[ last_smple_idx ] ), 8 ) );
619 NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay ] = psDD->Shape_Q14[ last_smple_idx ];
620 sLTP_Q15[ NSQ->sLTP_buf_idx - decisionDelay ] = psDD->Pred_Q15[ last_smple_idx ];
621 }
622 NSQ->sLTP_shp_buf_idx++;
623 NSQ->sLTP_buf_idx++;
624
625 /* Update states */
626 for( k = 0; k < nStatesDelayedDecision; k++ ) {
627 psDD = &psDelDec[ k ];
628 psSS = &psSampleState[ k ][ 0 ];
629 psDD->LF_AR_Q14 = psSS->LF_AR_Q14;
630 psDD->Diff_Q14 = psSS->Diff_Q14;
631 psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ] = psSS->xq_Q14;
632 psDD->Xq_Q14[ *smpl_buf_idx ] = psSS->xq_Q14;
633 psDD->Q_Q10[ *smpl_buf_idx ] = psSS->Q_Q10;
634 psDD->Pred_Q15[ *smpl_buf_idx ] = silk_LSHIFT32( psSS->LPC_exc_Q14, 1 );
635 psDD->Shape_Q14[ *smpl_buf_idx ] = psSS->sLTP_shp_Q14;
636 psDD->Seed = silk_ADD32_ovflw( psDD->Seed, silk_RSHIFT_ROUND( psSS->Q_Q10, 10 ) );
637 psDD->RandState[ *smpl_buf_idx ] = psDD->Seed;
638 psDD->RD_Q10 = psSS->RD_Q10;
639 }
640 delayedGain_Q10[ *smpl_buf_idx ] = Gain_Q10;
641 }
642 /* Update LPC states */
643 for( k = 0; k < nStatesDelayedDecision; k++ ) {
644 psDD = &psDelDec[ k ];
645 silk_memcpy( psDD->sLPC_Q14, &psDD->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) );
646 }
647 RESTORE_STACK;
648 }
649 #endif /* OVERRIDE_silk_noise_shape_quantizer_del_dec */
650
silk_nsq_del_dec_scale_states(const silk_encoder_state * psEncC,silk_nsq_state * NSQ,NSQ_del_dec_struct psDelDec[],const opus_int16 x16[],opus_int32 x_sc_Q10[],const opus_int16 sLTP[],opus_int32 sLTP_Q15[],opus_int subfr,opus_int nStatesDelayedDecision,const opus_int LTP_scale_Q14,const opus_int32 Gains_Q16[MAX_NB_SUBFR],const opus_int pitchL[MAX_NB_SUBFR],const opus_int signal_type,const opus_int decisionDelay)651 static OPUS_INLINE void silk_nsq_del_dec_scale_states(
652 const silk_encoder_state *psEncC, /* I Encoder State */
653 silk_nsq_state *NSQ, /* I/O NSQ state */
654 NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */
655 const opus_int16 x16[], /* I Input */
656 opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */
657 const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */
658 opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */
659 opus_int subfr, /* I Subframe number */
660 opus_int nStatesDelayedDecision, /* I Number of del dec states */
661 const opus_int LTP_scale_Q14, /* I LTP state scaling */
662 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */
663 const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */
664 const opus_int signal_type, /* I Signal type */
665 const opus_int decisionDelay /* I Decision delay */
666 )
667 {
668 opus_int i, k, lag;
669 opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q26;
670 NSQ_del_dec_struct *psDD;
671
672 lag = pitchL[ subfr ];
673 inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 );
674 silk_assert( inv_gain_Q31 != 0 );
675
676 /* Scale input */
677 inv_gain_Q26 = silk_RSHIFT_ROUND( inv_gain_Q31, 5 );
678 for( i = 0; i < psEncC->subfr_length; i++ ) {
679 x_sc_Q10[ i ] = silk_SMULWW( x16[ i ], inv_gain_Q26 );
680 }
681
682 /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */
683 if( NSQ->rewhite_flag ) {
684 if( subfr == 0 ) {
685 /* Do LTP downscaling */
686 inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14 ), 2 );
687 }
688 for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) {
689 silk_assert( i < MAX_FRAME_LENGTH );
690 sLTP_Q15[ i ] = silk_SMULWB( inv_gain_Q31, sLTP[ i ] );
691 }
692 }
693
694 /* Adjust for changing gain */
695 if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) {
696 gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 );
697
698 /* Scale long-term shaping state */
699 for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx; i++ ) {
700 NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] );
701 }
702
703 /* Scale long-term prediction state */
704 if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) {
705 for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx - decisionDelay; i++ ) {
706 sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] );
707 }
708 }
709
710 for( k = 0; k < nStatesDelayedDecision; k++ ) {
711 psDD = &psDelDec[ k ];
712
713 /* Scale scalar states */
714 psDD->LF_AR_Q14 = silk_SMULWW( gain_adj_Q16, psDD->LF_AR_Q14 );
715 psDD->Diff_Q14 = silk_SMULWW( gain_adj_Q16, psDD->Diff_Q14 );
716
717 /* Scale short-term prediction and shaping states */
718 for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) {
719 psDD->sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->sLPC_Q14[ i ] );
720 }
721 for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) {
722 psDD->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->sAR2_Q14[ i ] );
723 }
724 for( i = 0; i < DECISION_DELAY; i++ ) {
725 psDD->Pred_Q15[ i ] = silk_SMULWW( gain_adj_Q16, psDD->Pred_Q15[ i ] );
726 psDD->Shape_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->Shape_Q14[ i ] );
727 }
728 }
729
730 /* Save inverse gain */
731 NSQ->prev_gain_Q16 = Gains_Q16[ subfr ];
732 }
733 }
734