blob: ad1cfe2a9b0841012701b1fe77d7da2f044d0b26 [file] [log] [blame]
flimc91ee5b2016-01-26 14:33:44 +01001/***********************************************************************
2Copyright (c) 2006-2011, Skype Limited. All rights reserved.
3Redistribution and use in source and binary forms, with or without
4modification, are permitted provided that the following conditions
5are met:
6- Redistributions of source code must retain the above copyright notice,
7this list of conditions and the following disclaimer.
8- Redistributions in binary form must reproduce the above copyright
9notice, this list of conditions and the following disclaimer in the
10documentation and/or other materials provided with the distribution.
11- Neither the name of Internet Society, IETF or IETF Trust, nor the
12names of specific contributors, may be used to endorse or promote
13products derived from this software without specific prior written
14permission.
15THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25POSSIBILITY OF SUCH DAMAGE.
26***********************************************************************/
27
28#ifndef __NSQ_DEL_DEC_MIPSR1_H__
29#define __NSQ_DEL_DEC_MIPSR1_H__
30
31#ifdef HAVE_CONFIG_H
32#include "config.h"
33#endif
34
35#include "main.h"
36#include "stack_alloc.h"
37
38#define OVERRIDE_silk_noise_shape_quantizer_del_dec
39static inline void silk_noise_shape_quantizer_del_dec(
40 silk_nsq_state *NSQ, /* I/O NSQ state */
41 NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */
42 opus_int signalType, /* I Signal type */
43 const opus_int32 x_Q10[], /* I */
44 opus_int8 pulses[], /* O */
45 opus_int16 xq[], /* O */
46 opus_int32 sLTP_Q15[], /* I/O LTP filter state */
47 opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */
48 const opus_int16 a_Q12[], /* I Short term prediction coefs */
49 const opus_int16 b_Q14[], /* I Long term prediction coefs */
50 const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */
51 opus_int lag, /* I Pitch lag */
52 opus_int32 HarmShapeFIRPacked_Q14, /* I */
53 opus_int Tilt_Q14, /* I Spectral tilt */
54 opus_int32 LF_shp_Q14, /* I */
55 opus_int32 Gain_Q16, /* I */
56 opus_int Lambda_Q10, /* I */
57 opus_int offset_Q10, /* I */
58 opus_int length, /* I Input length */
59 opus_int subfr, /* I Subframe number */
60 opus_int shapingLPCOrder, /* I Shaping LPC filter order */
61 opus_int predictLPCOrder, /* I Prediction filter order */
62 opus_int warping_Q16, /* I */
63 opus_int nStatesDelayedDecision, /* I Number of states in decision tree */
64 opus_int *smpl_buf_idx, /* I Index to newest samples in buffers */
Felicia Limd03c3732016-07-25 20:28:37 +020065 opus_int decisionDelay, /* I */
66 int arch /* I */
flimc91ee5b2016-01-26 14:33:44 +010067)
68{
69 opus_int i, j, k, Winner_ind, RDmin_ind, RDmax_ind, last_smple_idx;
70 opus_int32 Winner_rand_state;
71 opus_int32 LTP_pred_Q14, LPC_pred_Q14, n_AR_Q14, n_LTP_Q14;
72 opus_int32 n_LF_Q14, r_Q10, rr_Q10, rd1_Q10, rd2_Q10, RDmin_Q10, RDmax_Q10;
73 opus_int32 q1_Q0, q1_Q10, q2_Q10, exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10;
74 opus_int32 tmp1, tmp2, sLF_AR_shp_Q14;
75 opus_int32 *pred_lag_ptr, *shp_lag_ptr, *psLPC_Q14;
76 NSQ_sample_struct psSampleState[ MAX_DEL_DEC_STATES ][ 2 ];
77 NSQ_del_dec_struct *psDD;
78 NSQ_sample_struct *psSS;
79 opus_int16 b_Q14_0, b_Q14_1, b_Q14_2, b_Q14_3, b_Q14_4;
80 opus_int16 a_Q12_0, a_Q12_1, a_Q12_2, a_Q12_3, a_Q12_4, a_Q12_5, a_Q12_6;
81 opus_int16 a_Q12_7, a_Q12_8, a_Q12_9, a_Q12_10, a_Q12_11, a_Q12_12, a_Q12_13;
82 opus_int16 a_Q12_14, a_Q12_15;
83
84 opus_int32 cur, prev, next;
85
Felicia Limd03c3732016-07-25 20:28:37 +020086 /*Unused.*/
87 (void)arch;
88
flimc91ee5b2016-01-26 14:33:44 +010089 //Intialize b_Q14 variables
90 b_Q14_0 = b_Q14[ 0 ];
91 b_Q14_1 = b_Q14[ 1 ];
92 b_Q14_2 = b_Q14[ 2 ];
93 b_Q14_3 = b_Q14[ 3 ];
94 b_Q14_4 = b_Q14[ 4 ];
95
96 //Intialize a_Q12 variables
97 a_Q12_0 = a_Q12[0];
98 a_Q12_1 = a_Q12[1];
99 a_Q12_2 = a_Q12[2];
100 a_Q12_3 = a_Q12[3];
101 a_Q12_4 = a_Q12[4];
102 a_Q12_5 = a_Q12[5];
103 a_Q12_6 = a_Q12[6];
104 a_Q12_7 = a_Q12[7];
105 a_Q12_8 = a_Q12[8];
106 a_Q12_9 = a_Q12[9];
107 a_Q12_10 = a_Q12[10];
108 a_Q12_11 = a_Q12[11];
109 a_Q12_12 = a_Q12[12];
110 a_Q12_13 = a_Q12[13];
111 a_Q12_14 = a_Q12[14];
112 a_Q12_15 = a_Q12[15];
113
114 long long temp64;
115
116 silk_assert( nStatesDelayedDecision > 0 );
117
118 shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ];
119 pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ];
120 Gain_Q10 = silk_RSHIFT( Gain_Q16, 6 );
121
122 for( i = 0; i < length; i++ ) {
123 /* Perform common calculations used in all states */
124
125 /* Long-term prediction */
126 if( signalType == TYPE_VOICED ) {
127 /* Unrolled loop */
128 /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */
129 temp64 = __builtin_mips_mult(pred_lag_ptr[ 0 ], b_Q14_0 );
130 temp64 = __builtin_mips_madd( temp64, pred_lag_ptr[ -1 ], b_Q14_1 );
131 temp64 = __builtin_mips_madd( temp64, pred_lag_ptr[ -2 ], b_Q14_2 );
132 temp64 = __builtin_mips_madd( temp64, pred_lag_ptr[ -3 ], b_Q14_3 );
133 temp64 = __builtin_mips_madd( temp64, pred_lag_ptr[ -4 ], b_Q14_4 );
134 temp64 += 32768;
135 LTP_pred_Q14 = __builtin_mips_extr_w(temp64, 16);
136 LTP_pred_Q14 = silk_LSHIFT( LTP_pred_Q14, 1 ); /* Q13 -> Q14 */
137 pred_lag_ptr++;
138 } else {
139 LTP_pred_Q14 = 0;
140 }
141
142 /* Long-term shaping */
143 if( lag > 0 ) {
144 /* Symmetric, packed FIR coefficients */
145 n_LTP_Q14 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 );
146 n_LTP_Q14 = silk_SMLAWT( n_LTP_Q14, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 );
147 n_LTP_Q14 = silk_SUB_LSHIFT32( LTP_pred_Q14, n_LTP_Q14, 2 ); /* Q12 -> Q14 */
148 shp_lag_ptr++;
149 } else {
150 n_LTP_Q14 = 0;
151 }
152
153 for( k = 0; k < nStatesDelayedDecision; k++ ) {
154 /* Delayed decision state */
155 psDD = &psDelDec[ k ];
156
157 /* Sample state */
158 psSS = psSampleState[ k ];
159
160 /* Generate dither */
161 psDD->Seed = silk_RAND( psDD->Seed );
162
163 /* Pointer used in short term prediction and shaping */
164 psLPC_Q14 = &psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 + i ];
165 /* Short-term prediction */
166 silk_assert( predictLPCOrder == 10 || predictLPCOrder == 16 );
167 temp64 = __builtin_mips_mult(psLPC_Q14[ 0 ], a_Q12_0 );
168 temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -1 ], a_Q12_1 );
169 temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -2 ], a_Q12_2 );
170 temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -3 ], a_Q12_3 );
171 temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -4 ], a_Q12_4 );
172 temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -5 ], a_Q12_5 );
173 temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -6 ], a_Q12_6 );
174 temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -7 ], a_Q12_7 );
175 temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -8 ], a_Q12_8 );
176 temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -9 ], a_Q12_9 );
177 if( predictLPCOrder == 16 ) {
178 temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -10 ], a_Q12_10 );
179 temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -11 ], a_Q12_11 );
180 temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -12 ], a_Q12_12 );
181 temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -13 ], a_Q12_13 );
182 temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -14 ], a_Q12_14 );
183 temp64 = __builtin_mips_madd( temp64, psLPC_Q14[ -15 ], a_Q12_15 );
184 }
185 temp64 += 32768;
186 LPC_pred_Q14 = __builtin_mips_extr_w(temp64, 16);
187
188 LPC_pred_Q14 = silk_LSHIFT( LPC_pred_Q14, 4 ); /* Q10 -> Q14 */
189
190 /* Noise shape feedback */
191 silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */
192 /* Output of lowpass section */
193 tmp2 = silk_SMLAWB( psLPC_Q14[ 0 ], psDD->sAR2_Q14[ 0 ], warping_Q16 );
194 /* Output of allpass section */
195 tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ 0 ], psDD->sAR2_Q14[ 1 ] - tmp2, warping_Q16 );
196 psDD->sAR2_Q14[ 0 ] = tmp2;
197
198 temp64 = __builtin_mips_mult(tmp2, AR_shp_Q13[ 0 ] );
199
200 prev = psDD->sAR2_Q14[ 1 ];
201
202 /* Loop over allpass sections */
203 for( j = 2; j < shapingLPCOrder; j += 2 ) {
204 cur = psDD->sAR2_Q14[ j ];
205 next = psDD->sAR2_Q14[ j+1 ];
206 /* Output of allpass section */
207 tmp2 = silk_SMLAWB( prev, cur - tmp1, warping_Q16 );
208 psDD->sAR2_Q14[ j - 1 ] = tmp1;
209 temp64 = __builtin_mips_madd( temp64, tmp1, AR_shp_Q13[ j - 1 ] );
210 temp64 = __builtin_mips_madd( temp64, tmp2, AR_shp_Q13[ j ] );
211 /* Output of allpass section */
212 tmp1 = silk_SMLAWB( cur, next - tmp2, warping_Q16 );
213 psDD->sAR2_Q14[ j + 0 ] = tmp2;
214 prev = next;
215 }
216 psDD->sAR2_Q14[ shapingLPCOrder - 1 ] = tmp1;
217 temp64 = __builtin_mips_madd( temp64, tmp1, AR_shp_Q13[ shapingLPCOrder - 1 ] );
218 temp64 += 32768;
219 n_AR_Q14 = __builtin_mips_extr_w(temp64, 16);
220 n_AR_Q14 = silk_LSHIFT( n_AR_Q14, 1 ); /* Q11 -> Q12 */
221 n_AR_Q14 = silk_SMLAWB( n_AR_Q14, psDD->LF_AR_Q14, Tilt_Q14 ); /* Q12 */
222 n_AR_Q14 = silk_LSHIFT( n_AR_Q14, 2 ); /* Q12 -> Q14 */
223
224 n_LF_Q14 = silk_SMULWB( psDD->Shape_Q14[ *smpl_buf_idx ], LF_shp_Q14 ); /* Q12 */
225 n_LF_Q14 = silk_SMLAWT( n_LF_Q14, psDD->LF_AR_Q14, LF_shp_Q14 ); /* Q12 */
226 n_LF_Q14 = silk_LSHIFT( n_LF_Q14, 2 ); /* Q12 -> Q14 */
227
228 /* Input minus prediction plus noise feedback */
229 /* r = x[ i ] - LTP_pred - LPC_pred + n_AR + n_Tilt + n_LF + n_LTP */
230 tmp1 = silk_ADD32( n_AR_Q14, n_LF_Q14 ); /* Q14 */
231 tmp2 = silk_ADD32( n_LTP_Q14, LPC_pred_Q14 ); /* Q13 */
232 tmp1 = silk_SUB32( tmp2, tmp1 ); /* Q13 */
233 tmp1 = silk_RSHIFT_ROUND( tmp1, 4 ); /* Q10 */
234
235 r_Q10 = silk_SUB32( x_Q10[ i ], tmp1 ); /* residual error Q10 */
236
237 /* Flip sign depending on dither */
238 if ( psDD->Seed < 0 ) {
239 r_Q10 = -r_Q10;
240 }
241 r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 );
242
243 /* Find two quantization level candidates and measure their rate-distortion */
244 q1_Q10 = silk_SUB32( r_Q10, offset_Q10 );
245 q1_Q0 = silk_RSHIFT( q1_Q10, 10 );
246 if( q1_Q0 > 0 ) {
247 q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 );
248 q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 );
249 q2_Q10 = silk_ADD32( q1_Q10, 1024 );
250 rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 );
251 rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 );
252 } else if( q1_Q0 == 0 ) {
253 q1_Q10 = offset_Q10;
254 q2_Q10 = silk_ADD32( q1_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 );
255 rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 );
256 rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 );
257 } else if( q1_Q0 == -1 ) {
258 q2_Q10 = offset_Q10;
259 q1_Q10 = silk_SUB32( q2_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 );
260 rd1_Q10 = silk_SMULBB( -q1_Q10, Lambda_Q10 );
261 rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 );
262 } else { /* q1_Q0 < -1 */
263 q1_Q10 = silk_ADD32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 );
264 q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 );
265 q2_Q10 = silk_ADD32( q1_Q10, 1024 );
266 rd1_Q10 = silk_SMULBB( -q1_Q10, Lambda_Q10 );
267 rd2_Q10 = silk_SMULBB( -q2_Q10, Lambda_Q10 );
268 }
269 rr_Q10 = silk_SUB32( r_Q10, q1_Q10 );
270 rd1_Q10 = silk_RSHIFT( silk_SMLABB( rd1_Q10, rr_Q10, rr_Q10 ), 10 );
271 rr_Q10 = silk_SUB32( r_Q10, q2_Q10 );
272 rd2_Q10 = silk_RSHIFT( silk_SMLABB( rd2_Q10, rr_Q10, rr_Q10 ), 10 );
273
274 if( rd1_Q10 < rd2_Q10 ) {
275 psSS[ 0 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd1_Q10 );
276 psSS[ 1 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd2_Q10 );
277 psSS[ 0 ].Q_Q10 = q1_Q10;
278 psSS[ 1 ].Q_Q10 = q2_Q10;
279 } else {
280 psSS[ 0 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd2_Q10 );
281 psSS[ 1 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd1_Q10 );
282 psSS[ 0 ].Q_Q10 = q2_Q10;
283 psSS[ 1 ].Q_Q10 = q1_Q10;
284 }
285
286 /* Update states for best quantization */
287
288 /* Quantized excitation */
289 exc_Q14 = silk_LSHIFT32( psSS[ 0 ].Q_Q10, 4 );
290 if ( psDD->Seed < 0 ) {
291 exc_Q14 = -exc_Q14;
292 }
293
294 /* Add predictions */
295 LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 );
296 xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 );
297
298 /* Update states */
299 sLF_AR_shp_Q14 = silk_SUB32( xq_Q14, n_AR_Q14 );
300 psSS[ 0 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 );
301 psSS[ 0 ].LF_AR_Q14 = sLF_AR_shp_Q14;
302 psSS[ 0 ].LPC_exc_Q14 = LPC_exc_Q14;
303 psSS[ 0 ].xq_Q14 = xq_Q14;
304
305 /* Update states for second best quantization */
306
307 /* Quantized excitation */
308 exc_Q14 = silk_LSHIFT32( psSS[ 1 ].Q_Q10, 4 );
309 if ( psDD->Seed < 0 ) {
310 exc_Q14 = -exc_Q14;
311 }
312
313
314 /* Add predictions */
315 LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 );
316 xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 );
317
318 /* Update states */
319 sLF_AR_shp_Q14 = silk_SUB32( xq_Q14, n_AR_Q14 );
320 psSS[ 1 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 );
321 psSS[ 1 ].LF_AR_Q14 = sLF_AR_shp_Q14;
322 psSS[ 1 ].LPC_exc_Q14 = LPC_exc_Q14;
323 psSS[ 1 ].xq_Q14 = xq_Q14;
324 }
325
326 *smpl_buf_idx = ( *smpl_buf_idx - 1 ) & DECISION_DELAY_MASK; /* Index to newest samples */
327 last_smple_idx = ( *smpl_buf_idx + decisionDelay ) & DECISION_DELAY_MASK; /* Index to decisionDelay old samples */
328
329 /* Find winner */
330 RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10;
331 Winner_ind = 0;
332 for( k = 1; k < nStatesDelayedDecision; k++ ) {
333 if( psSampleState[ k ][ 0 ].RD_Q10 < RDmin_Q10 ) {
334 RDmin_Q10 = psSampleState[ k ][ 0 ].RD_Q10;
335 Winner_ind = k;
336 }
337 }
338
339 /* Increase RD values of expired states */
340 Winner_rand_state = psDelDec[ Winner_ind ].RandState[ last_smple_idx ];
341 for( k = 0; k < nStatesDelayedDecision; k++ ) {
342 if( psDelDec[ k ].RandState[ last_smple_idx ] != Winner_rand_state ) {
343 psSampleState[ k ][ 0 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 0 ].RD_Q10, silk_int32_MAX >> 4 );
344 psSampleState[ k ][ 1 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 1 ].RD_Q10, silk_int32_MAX >> 4 );
345 silk_assert( psSampleState[ k ][ 0 ].RD_Q10 >= 0 );
346 }
347 }
348
349 /* Find worst in first set and best in second set */
350 RDmax_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10;
351 RDmin_Q10 = psSampleState[ 0 ][ 1 ].RD_Q10;
352 RDmax_ind = 0;
353 RDmin_ind = 0;
354 for( k = 1; k < nStatesDelayedDecision; k++ ) {
355 /* find worst in first set */
356 if( psSampleState[ k ][ 0 ].RD_Q10 > RDmax_Q10 ) {
357 RDmax_Q10 = psSampleState[ k ][ 0 ].RD_Q10;
358 RDmax_ind = k;
359 }
360 /* find best in second set */
361 if( psSampleState[ k ][ 1 ].RD_Q10 < RDmin_Q10 ) {
362 RDmin_Q10 = psSampleState[ k ][ 1 ].RD_Q10;
363 RDmin_ind = k;
364 }
365 }
366
367 /* Replace a state if best from second set outperforms worst in first set */
368 if( RDmin_Q10 < RDmax_Q10 ) {
369 silk_memcpy( ( (opus_int32 *)&psDelDec[ RDmax_ind ] ) + i,
370 ( (opus_int32 *)&psDelDec[ RDmin_ind ] ) + i, sizeof( NSQ_del_dec_struct ) - i * sizeof( opus_int32) );
371 silk_memcpy( &psSampleState[ RDmax_ind ][ 0 ], &psSampleState[ RDmin_ind ][ 1 ], sizeof( NSQ_sample_struct ) );
372 }
373
374 /* Write samples from winner to output and long-term filter states */
375 psDD = &psDelDec[ Winner_ind ];
376 if( subfr > 0 || i >= decisionDelay ) {
377 pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 );
378 xq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND(
379 silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], delayedGain_Q10[ last_smple_idx ] ), 8 ) );
380 NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay ] = psDD->Shape_Q14[ last_smple_idx ];
381 sLTP_Q15[ NSQ->sLTP_buf_idx - decisionDelay ] = psDD->Pred_Q15[ last_smple_idx ];
382 }
383 NSQ->sLTP_shp_buf_idx++;
384 NSQ->sLTP_buf_idx++;
385
386 /* Update states */
387 for( k = 0; k < nStatesDelayedDecision; k++ ) {
388 psDD = &psDelDec[ k ];
389 psSS = &psSampleState[ k ][ 0 ];
390 psDD->LF_AR_Q14 = psSS->LF_AR_Q14;
391 psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ] = psSS->xq_Q14;
392 psDD->Xq_Q14[ *smpl_buf_idx ] = psSS->xq_Q14;
393 psDD->Q_Q10[ *smpl_buf_idx ] = psSS->Q_Q10;
394 psDD->Pred_Q15[ *smpl_buf_idx ] = silk_LSHIFT32( psSS->LPC_exc_Q14, 1 );
395 psDD->Shape_Q14[ *smpl_buf_idx ] = psSS->sLTP_shp_Q14;
396 psDD->Seed = silk_ADD32_ovflw( psDD->Seed, silk_RSHIFT_ROUND( psSS->Q_Q10, 10 ) );
397 psDD->RandState[ *smpl_buf_idx ] = psDD->Seed;
398 psDD->RD_Q10 = psSS->RD_Q10;
399 }
400 delayedGain_Q10[ *smpl_buf_idx ] = Gain_Q10;
401 }
402 /* Update LPC states */
403 for( k = 0; k < nStatesDelayedDecision; k++ ) {
404 psDD = &psDelDec[ k ];
405 silk_memcpy( psDD->sLPC_Q14, &psDD->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) );
406 }
407}
408
409#endif /* __NSQ_DEL_DEC_MIPSR1_H__ */