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 #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
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)39 static 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/O Index to newest samples in buffers */
65 opus_int decisionDelay, /* I */
66 int arch /* I */
67 )
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
86 /*Unused.*/
87 (void)arch;
88
89 //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;
327 if( *smpl_buf_idx < 0 ) *smpl_buf_idx += DECISION_DELAY;
328 last_smple_idx = ( *smpl_buf_idx + decisionDelay ) % DECISION_DELAY;
329
330 /* Find winner */
331 RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10;
332 Winner_ind = 0;
333 for( k = 1; k < nStatesDelayedDecision; k++ ) {
334 if( psSampleState[ k ][ 0 ].RD_Q10 < RDmin_Q10 ) {
335 RDmin_Q10 = psSampleState[ k ][ 0 ].RD_Q10;
336 Winner_ind = k;
337 }
338 }
339
340 /* Increase RD values of expired states */
341 Winner_rand_state = psDelDec[ Winner_ind ].RandState[ last_smple_idx ];
342 for( k = 0; k < nStatesDelayedDecision; k++ ) {
343 if( psDelDec[ k ].RandState[ last_smple_idx ] != Winner_rand_state ) {
344 psSampleState[ k ][ 0 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 0 ].RD_Q10, silk_int32_MAX >> 4 );
345 psSampleState[ k ][ 1 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 1 ].RD_Q10, silk_int32_MAX >> 4 );
346 silk_assert( psSampleState[ k ][ 0 ].RD_Q10 >= 0 );
347 }
348 }
349
350 /* Find worst in first set and best in second set */
351 RDmax_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10;
352 RDmin_Q10 = psSampleState[ 0 ][ 1 ].RD_Q10;
353 RDmax_ind = 0;
354 RDmin_ind = 0;
355 for( k = 1; k < nStatesDelayedDecision; k++ ) {
356 /* find worst in first set */
357 if( psSampleState[ k ][ 0 ].RD_Q10 > RDmax_Q10 ) {
358 RDmax_Q10 = psSampleState[ k ][ 0 ].RD_Q10;
359 RDmax_ind = k;
360 }
361 /* find best in second set */
362 if( psSampleState[ k ][ 1 ].RD_Q10 < RDmin_Q10 ) {
363 RDmin_Q10 = psSampleState[ k ][ 1 ].RD_Q10;
364 RDmin_ind = k;
365 }
366 }
367
368 /* Replace a state if best from second set outperforms worst in first set */
369 if( RDmin_Q10 < RDmax_Q10 ) {
370 silk_memcpy( ( (opus_int32 *)&psDelDec[ RDmax_ind ] ) + i,
371 ( (opus_int32 *)&psDelDec[ RDmin_ind ] ) + i, sizeof( NSQ_del_dec_struct ) - i * sizeof( opus_int32) );
372 silk_memcpy( &psSampleState[ RDmax_ind ][ 0 ], &psSampleState[ RDmin_ind ][ 1 ], sizeof( NSQ_sample_struct ) );
373 }
374
375 /* Write samples from winner to output and long-term filter states */
376 psDD = &psDelDec[ Winner_ind ];
377 if( subfr > 0 || i >= decisionDelay ) {
378 pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 );
379 xq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND(
380 silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], delayedGain_Q10[ last_smple_idx ] ), 8 ) );
381 NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay ] = psDD->Shape_Q14[ last_smple_idx ];
382 sLTP_Q15[ NSQ->sLTP_buf_idx - decisionDelay ] = psDD->Pred_Q15[ last_smple_idx ];
383 }
384 NSQ->sLTP_shp_buf_idx++;
385 NSQ->sLTP_buf_idx++;
386
387 /* Update states */
388 for( k = 0; k < nStatesDelayedDecision; k++ ) {
389 psDD = &psDelDec[ k ];
390 psSS = &psSampleState[ k ][ 0 ];
391 psDD->LF_AR_Q14 = psSS->LF_AR_Q14;
392 psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ] = psSS->xq_Q14;
393 psDD->Xq_Q14[ *smpl_buf_idx ] = psSS->xq_Q14;
394 psDD->Q_Q10[ *smpl_buf_idx ] = psSS->Q_Q10;
395 psDD->Pred_Q15[ *smpl_buf_idx ] = silk_LSHIFT32( psSS->LPC_exc_Q14, 1 );
396 psDD->Shape_Q14[ *smpl_buf_idx ] = psSS->sLTP_shp_Q14;
397 psDD->Seed = silk_ADD32_ovflw( psDD->Seed, silk_RSHIFT_ROUND( psSS->Q_Q10, 10 ) );
398 psDD->RandState[ *smpl_buf_idx ] = psDD->Seed;
399 psDD->RD_Q10 = psSS->RD_Q10;
400 }
401 delayedGain_Q10[ *smpl_buf_idx ] = Gain_Q10;
402 }
403 /* Update LPC states */
404 for( k = 0; k < nStatesDelayedDecision; k++ ) {
405 psDD = &psDelDec[ k ];
406 silk_memcpy( psDD->sLPC_Q14, &psDD->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) );
407 }
408 }
409
410 #endif /* __NSQ_DEL_DEC_MIPSR1_H__ */
411