1/***********************************************************************
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#ifdef HAVE_CONFIG_H
29#include "config.h"
30#endif
31
32#include "main.h"
33#include "stack_alloc.h"
34
35static OPUS_INLINE void silk_nsq_scale_states(
36    const silk_encoder_state *psEncC,           /* I    Encoder State                   */
37    silk_nsq_state      *NSQ,                   /* I/O  NSQ state                       */
38    const opus_int32    x_Q3[],                 /* I    input in Q3                     */
39    opus_int32          x_sc_Q10[],             /* O    input scaled with 1/Gain        */
40    const opus_int16    sLTP[],                 /* I    re-whitened LTP state in Q0     */
41    opus_int32          sLTP_Q15[],             /* O    LTP state matching scaled input */
42    opus_int            subfr,                  /* I    subframe number                 */
43    const opus_int      LTP_scale_Q14,          /* I                                    */
44    const opus_int32    Gains_Q16[ MAX_NB_SUBFR ], /* I                                 */
45    const opus_int      pitchL[ MAX_NB_SUBFR ], /* I    Pitch lag                       */
46    const opus_int      signal_type             /* I    Signal type                     */
47);
48
49static OPUS_INLINE void silk_noise_shape_quantizer(
50    silk_nsq_state      *NSQ,                   /* I/O  NSQ state                       */
51    opus_int            signalType,             /* I    Signal type                     */
52    const opus_int32    x_sc_Q10[],             /* I                                    */
53    opus_int8           pulses[],               /* O                                    */
54    opus_int16          xq[],                   /* O                                    */
55    opus_int32          sLTP_Q15[],             /* I/O  LTP state                       */
56    const opus_int16    a_Q12[],                /* I    Short term prediction coefs     */
57    const opus_int16    b_Q14[],                /* I    Long term prediction coefs      */
58    const opus_int16    AR_shp_Q13[],           /* I    Noise shaping AR coefs          */
59    opus_int            lag,                    /* I    Pitch lag                       */
60    opus_int32          HarmShapeFIRPacked_Q14, /* I                                    */
61    opus_int            Tilt_Q14,               /* I    Spectral tilt                   */
62    opus_int32          LF_shp_Q14,             /* I                                    */
63    opus_int32          Gain_Q16,               /* I                                    */
64    opus_int            Lambda_Q10,             /* I                                    */
65    opus_int            offset_Q10,             /* I                                    */
66    opus_int            length,                 /* I    Input length                    */
67    opus_int            shapingLPCOrder,        /* I    Noise shaping AR filter order   */
68    opus_int            predictLPCOrder         /* I    Prediction filter order         */
69);
70
71void silk_NSQ(
72    const silk_encoder_state    *psEncC,                                    /* I/O  Encoder State                   */
73    silk_nsq_state              *NSQ,                                       /* I/O  NSQ state                       */
74    SideInfoIndices             *psIndices,                                 /* I/O  Quantization Indices            */
75    const opus_int32            x_Q3[],                                     /* I    Prefiltered input signal        */
76    opus_int8                   pulses[],                                   /* O    Quantized pulse signal          */
77    const opus_int16            PredCoef_Q12[ 2 * MAX_LPC_ORDER ],          /* I    Short term prediction coefs     */
78    const opus_int16            LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ],    /* I    Long term prediction coefs      */
79    const opus_int16            AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs             */
80    const opus_int              HarmShapeGain_Q14[ MAX_NB_SUBFR ],          /* I    Long term shaping coefs         */
81    const opus_int              Tilt_Q14[ MAX_NB_SUBFR ],                   /* I    Spectral tilt                   */
82    const opus_int32            LF_shp_Q14[ MAX_NB_SUBFR ],                 /* I    Low frequency shaping coefs     */
83    const opus_int32            Gains_Q16[ MAX_NB_SUBFR ],                  /* I    Quantization step sizes         */
84    const opus_int              pitchL[ MAX_NB_SUBFR ],                     /* I    Pitch lags                      */
85    const opus_int              Lambda_Q10,                                 /* I    Rate/distortion tradeoff        */
86    const opus_int              LTP_scale_Q14                               /* I    LTP state scaling               */
87)
88{
89    opus_int            k, lag, start_idx, LSF_interpolation_flag;
90    const opus_int16    *A_Q12, *B_Q14, *AR_shp_Q13;
91    opus_int16          *pxq;
92    VARDECL( opus_int32, sLTP_Q15 );
93    VARDECL( opus_int16, sLTP );
94    opus_int32          HarmShapeFIRPacked_Q14;
95    opus_int            offset_Q10;
96    VARDECL( opus_int32, x_sc_Q10 );
97    SAVE_STACK;
98
99    NSQ->rand_seed = psIndices->Seed;
100
101    /* Set unvoiced lag to the previous one, overwrite later for voiced */
102    lag = NSQ->lagPrev;
103
104    silk_assert( NSQ->prev_gain_Q16 != 0 );
105
106    offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ psIndices->quantOffsetType ];
107
108    if( psIndices->NLSFInterpCoef_Q2 == 4 ) {
109        LSF_interpolation_flag = 0;
110    } else {
111        LSF_interpolation_flag = 1;
112    }
113
114    ALLOC( sLTP_Q15,
115           psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 );
116    ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 );
117    ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 );
118    /* Set up pointers to start of sub frame */
119    NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length;
120    NSQ->sLTP_buf_idx     = psEncC->ltp_mem_length;
121    pxq                   = &NSQ->xq[ psEncC->ltp_mem_length ];
122    for( k = 0; k < psEncC->nb_subfr; k++ ) {
123        A_Q12      = &PredCoef_Q12[ (( k >> 1 ) | ( 1 - LSF_interpolation_flag )) * MAX_LPC_ORDER ];
124        B_Q14      = &LTPCoef_Q14[ k * LTP_ORDER ];
125        AR_shp_Q13 = &AR2_Q13[     k * MAX_SHAPE_LPC_ORDER ];
126
127        /* Noise shape parameters */
128        silk_assert( HarmShapeGain_Q14[ k ] >= 0 );
129        HarmShapeFIRPacked_Q14  =                          silk_RSHIFT( HarmShapeGain_Q14[ k ], 2 );
130        HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 );
131
132        NSQ->rewhite_flag = 0;
133        if( psIndices->signalType == TYPE_VOICED ) {
134            /* Voiced */
135            lag = pitchL[ k ];
136
137            /* Re-whitening */
138            if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) {
139                /* Rewhiten with new A coefs */
140                start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2;
141                silk_assert( start_idx > 0 );
142
143                silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ],
144                    A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder );
145
146                NSQ->rewhite_flag = 1;
147                NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
148            }
149        }
150
151        silk_nsq_scale_states( psEncC, NSQ, x_Q3, x_sc_Q10, sLTP, sLTP_Q15, k, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType );
152
153        silk_noise_shape_quantizer( NSQ, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, A_Q12, B_Q14,
154            AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ], Lambda_Q10,
155            offset_Q10, psEncC->subfr_length, psEncC->shapingLPCOrder, psEncC->predictLPCOrder );
156
157        x_Q3   += psEncC->subfr_length;
158        pulses += psEncC->subfr_length;
159        pxq    += psEncC->subfr_length;
160    }
161
162    /* Update lagPrev for next frame */
163    NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ];
164
165    /* Save quantized speech and noise shaping signals */
166    /* DEBUG_STORE_DATA( enc.pcm, &NSQ->xq[ psEncC->ltp_mem_length ], psEncC->frame_length * sizeof( opus_int16 ) ) */
167    silk_memmove( NSQ->xq,           &NSQ->xq[           psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) );
168    silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) );
169    RESTORE_STACK;
170}
171
172/***********************************/
173/* silk_noise_shape_quantizer  */
174/***********************************/
175static OPUS_INLINE void silk_noise_shape_quantizer(
176    silk_nsq_state      *NSQ,                   /* I/O  NSQ state                       */
177    opus_int            signalType,             /* I    Signal type                     */
178    const opus_int32    x_sc_Q10[],             /* I                                    */
179    opus_int8           pulses[],               /* O                                    */
180    opus_int16          xq[],                   /* O                                    */
181    opus_int32          sLTP_Q15[],             /* I/O  LTP state                       */
182    const opus_int16    a_Q12[],                /* I    Short term prediction coefs     */
183    const opus_int16    b_Q14[],                /* I    Long term prediction coefs      */
184    const opus_int16    AR_shp_Q13[],           /* I    Noise shaping AR coefs          */
185    opus_int            lag,                    /* I    Pitch lag                       */
186    opus_int32          HarmShapeFIRPacked_Q14, /* I                                    */
187    opus_int            Tilt_Q14,               /* I    Spectral tilt                   */
188    opus_int32          LF_shp_Q14,             /* I                                    */
189    opus_int32          Gain_Q16,               /* I                                    */
190    opus_int            Lambda_Q10,             /* I                                    */
191    opus_int            offset_Q10,             /* I                                    */
192    opus_int            length,                 /* I    Input length                    */
193    opus_int            shapingLPCOrder,        /* I    Noise shaping AR filter order   */
194    opus_int            predictLPCOrder         /* I    Prediction filter order         */
195)
196{
197    opus_int     i, j;
198    opus_int32   LTP_pred_Q13, LPC_pred_Q10, n_AR_Q12, n_LTP_Q13;
199    opus_int32   n_LF_Q12, r_Q10, rr_Q10, q1_Q0, q1_Q10, q2_Q10, rd1_Q20, rd2_Q20;
200    opus_int32   exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10;
201    opus_int32   tmp1, tmp2, sLF_AR_shp_Q14;
202    opus_int32   *psLPC_Q14, *shp_lag_ptr, *pred_lag_ptr;
203
204    shp_lag_ptr  = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ];
205    pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ];
206    Gain_Q10     = silk_RSHIFT( Gain_Q16, 6 );
207
208    /* Set up short term AR state */
209    psLPC_Q14 = &NSQ->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 ];
210
211    for( i = 0; i < length; i++ ) {
212        /* Generate dither */
213        NSQ->rand_seed = silk_RAND( NSQ->rand_seed );
214
215        /* Short-term prediction */
216        silk_assert( predictLPCOrder == 10 || predictLPCOrder == 16 );
217        /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */
218        LPC_pred_Q10 = silk_RSHIFT( predictLPCOrder, 1 );
219        LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[  0 ], a_Q12[ 0 ] );
220        LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -1 ], a_Q12[ 1 ] );
221        LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -2 ], a_Q12[ 2 ] );
222        LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -3 ], a_Q12[ 3 ] );
223        LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -4 ], a_Q12[ 4 ] );
224        LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -5 ], a_Q12[ 5 ] );
225        LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -6 ], a_Q12[ 6 ] );
226        LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -7 ], a_Q12[ 7 ] );
227        LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -8 ], a_Q12[ 8 ] );
228        LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -9 ], a_Q12[ 9 ] );
229        if( predictLPCOrder == 16 ) {
230            LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -10 ], a_Q12[ 10 ] );
231            LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -11 ], a_Q12[ 11 ] );
232            LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -12 ], a_Q12[ 12 ] );
233            LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -13 ], a_Q12[ 13 ] );
234            LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -14 ], a_Q12[ 14 ] );
235            LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, psLPC_Q14[ -15 ], a_Q12[ 15 ] );
236        }
237
238        /* Long-term prediction */
239        if( signalType == TYPE_VOICED ) {
240            /* Unrolled loop */
241            /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */
242            LTP_pred_Q13 = 2;
243            LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[  0 ], b_Q14[ 0 ] );
244            LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -1 ], b_Q14[ 1 ] );
245            LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -2 ], b_Q14[ 2 ] );
246            LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -3 ], b_Q14[ 3 ] );
247            LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -4 ], b_Q14[ 4 ] );
248            pred_lag_ptr++;
249        } else {
250            LTP_pred_Q13 = 0;
251        }
252
253        /* Noise shape feedback */
254        silk_assert( ( shapingLPCOrder & 1 ) == 0 );   /* check that order is even */
255        tmp2 = psLPC_Q14[ 0 ];
256        tmp1 = NSQ->sAR2_Q14[ 0 ];
257        NSQ->sAR2_Q14[ 0 ] = tmp2;
258        n_AR_Q12 = silk_RSHIFT( shapingLPCOrder, 1 );
259        n_AR_Q12 = silk_SMLAWB( n_AR_Q12, tmp2, AR_shp_Q13[ 0 ] );
260        for( j = 2; j < shapingLPCOrder; j += 2 ) {
261            tmp2 = NSQ->sAR2_Q14[ j - 1 ];
262            NSQ->sAR2_Q14[ j - 1 ] = tmp1;
263            n_AR_Q12 = silk_SMLAWB( n_AR_Q12, tmp1, AR_shp_Q13[ j - 1 ] );
264            tmp1 = NSQ->sAR2_Q14[ j + 0 ];
265            NSQ->sAR2_Q14[ j + 0 ] = tmp2;
266            n_AR_Q12 = silk_SMLAWB( n_AR_Q12, tmp2, AR_shp_Q13[ j ] );
267        }
268        NSQ->sAR2_Q14[ shapingLPCOrder - 1 ] = tmp1;
269        n_AR_Q12 = silk_SMLAWB( n_AR_Q12, tmp1, AR_shp_Q13[ shapingLPCOrder - 1 ] );
270
271        n_AR_Q12 = silk_LSHIFT32( n_AR_Q12, 1 );                                /* Q11 -> Q12 */
272        n_AR_Q12 = silk_SMLAWB( n_AR_Q12, NSQ->sLF_AR_shp_Q14, Tilt_Q14 );
273
274        n_LF_Q12 = silk_SMULWB( NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - 1 ], LF_shp_Q14 );
275        n_LF_Q12 = silk_SMLAWT( n_LF_Q12, NSQ->sLF_AR_shp_Q14, LF_shp_Q14 );
276
277        silk_assert( lag > 0 || signalType != TYPE_VOICED );
278
279        /* Combine prediction and noise shaping signals */
280        tmp1 = silk_SUB32( silk_LSHIFT32( LPC_pred_Q10, 2 ), n_AR_Q12 );        /* Q12 */
281        tmp1 = silk_SUB32( tmp1, n_LF_Q12 );                                    /* Q12 */
282        if( lag > 0 ) {
283            /* Symmetric, packed FIR coefficients */
284            n_LTP_Q13 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 );
285            n_LTP_Q13 = silk_SMLAWT( n_LTP_Q13, shp_lag_ptr[ -1 ],                      HarmShapeFIRPacked_Q14 );
286            n_LTP_Q13 = silk_LSHIFT( n_LTP_Q13, 1 );
287            shp_lag_ptr++;
288
289            tmp2 = silk_SUB32( LTP_pred_Q13, n_LTP_Q13 );                       /* Q13 */
290            tmp1 = silk_ADD_LSHIFT32( tmp2, tmp1, 1 );                          /* Q13 */
291            tmp1 = silk_RSHIFT_ROUND( tmp1, 3 );                                /* Q10 */
292        } else {
293            tmp1 = silk_RSHIFT_ROUND( tmp1, 2 );                                /* Q10 */
294        }
295
296        r_Q10 = silk_SUB32( x_sc_Q10[ i ], tmp1 );                              /* residual error Q10 */
297
298        /* Flip sign depending on dither */
299        if ( NSQ->rand_seed < 0 ) {
300           r_Q10 = -r_Q10;
301        }
302        r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 );
303
304        /* Find two quantization level candidates and measure their rate-distortion */
305        q1_Q10 = silk_SUB32( r_Q10, offset_Q10 );
306        q1_Q0 = silk_RSHIFT( q1_Q10, 10 );
307        if( q1_Q0 > 0 ) {
308            q1_Q10  = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 );
309            q1_Q10  = silk_ADD32( q1_Q10, offset_Q10 );
310            q2_Q10  = silk_ADD32( q1_Q10, 1024 );
311            rd1_Q20 = silk_SMULBB( q1_Q10, Lambda_Q10 );
312            rd2_Q20 = silk_SMULBB( q2_Q10, Lambda_Q10 );
313        } else if( q1_Q0 == 0 ) {
314            q1_Q10  = offset_Q10;
315            q2_Q10  = silk_ADD32( q1_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 );
316            rd1_Q20 = silk_SMULBB( q1_Q10, Lambda_Q10 );
317            rd2_Q20 = silk_SMULBB( q2_Q10, Lambda_Q10 );
318        } else if( q1_Q0 == -1 ) {
319            q2_Q10  = offset_Q10;
320            q1_Q10  = silk_SUB32( q2_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 );
321            rd1_Q20 = silk_SMULBB( -q1_Q10, Lambda_Q10 );
322            rd2_Q20 = silk_SMULBB(  q2_Q10, Lambda_Q10 );
323        } else {            /* Q1_Q0 < -1 */
324            q1_Q10  = silk_ADD32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 );
325            q1_Q10  = silk_ADD32( q1_Q10, offset_Q10 );
326            q2_Q10  = silk_ADD32( q1_Q10, 1024 );
327            rd1_Q20 = silk_SMULBB( -q1_Q10, Lambda_Q10 );
328            rd2_Q20 = silk_SMULBB( -q2_Q10, Lambda_Q10 );
329        }
330        rr_Q10  = silk_SUB32( r_Q10, q1_Q10 );
331        rd1_Q20 = silk_SMLABB( rd1_Q20, rr_Q10, rr_Q10 );
332        rr_Q10  = silk_SUB32( r_Q10, q2_Q10 );
333        rd2_Q20 = silk_SMLABB( rd2_Q20, rr_Q10, rr_Q10 );
334
335        if( rd2_Q20 < rd1_Q20 ) {
336            q1_Q10 = q2_Q10;
337        }
338
339        pulses[ i ] = (opus_int8)silk_RSHIFT_ROUND( q1_Q10, 10 );
340
341        /* Excitation */
342        exc_Q14 = silk_LSHIFT( q1_Q10, 4 );
343        if ( NSQ->rand_seed < 0 ) {
344           exc_Q14 = -exc_Q14;
345        }
346
347        /* Add predictions */
348        LPC_exc_Q14 = silk_ADD_LSHIFT32( exc_Q14, LTP_pred_Q13, 1 );
349        xq_Q14      = silk_ADD_LSHIFT32( LPC_exc_Q14, LPC_pred_Q10, 4 );
350
351        /* Scale XQ back to normal level before saving */
352        xq[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( xq_Q14, Gain_Q10 ), 8 ) );
353
354        /* Update states */
355        psLPC_Q14++;
356        *psLPC_Q14 = xq_Q14;
357        sLF_AR_shp_Q14 = silk_SUB_LSHIFT32( xq_Q14, n_AR_Q12, 2 );
358        NSQ->sLF_AR_shp_Q14 = sLF_AR_shp_Q14;
359
360        NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx ] = silk_SUB_LSHIFT32( sLF_AR_shp_Q14, n_LF_Q12, 2 );
361        sLTP_Q15[ NSQ->sLTP_buf_idx ] = silk_LSHIFT( LPC_exc_Q14, 1 );
362        NSQ->sLTP_shp_buf_idx++;
363        NSQ->sLTP_buf_idx++;
364
365        /* Make dither dependent on quantized signal */
366        NSQ->rand_seed = silk_ADD32_ovflw( NSQ->rand_seed, pulses[ i ] );
367    }
368
369    /* Update LPC synth buffer */
370    silk_memcpy( NSQ->sLPC_Q14, &NSQ->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) );
371}
372
373static OPUS_INLINE void silk_nsq_scale_states(
374    const silk_encoder_state *psEncC,           /* I    Encoder State                   */
375    silk_nsq_state      *NSQ,                   /* I/O  NSQ state                       */
376    const opus_int32    x_Q3[],                 /* I    input in Q3                     */
377    opus_int32          x_sc_Q10[],             /* O    input scaled with 1/Gain        */
378    const opus_int16    sLTP[],                 /* I    re-whitened LTP state in Q0     */
379    opus_int32          sLTP_Q15[],             /* O    LTP state matching scaled input */
380    opus_int            subfr,                  /* I    subframe number                 */
381    const opus_int      LTP_scale_Q14,          /* I                                    */
382    const opus_int32    Gains_Q16[ MAX_NB_SUBFR ], /* I                                 */
383    const opus_int      pitchL[ MAX_NB_SUBFR ], /* I    Pitch lag                       */
384    const opus_int      signal_type             /* I    Signal type                     */
385)
386{
387    opus_int   i, lag;
388    opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q23;
389
390    lag          = pitchL[ subfr ];
391    inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 );
392    silk_assert( inv_gain_Q31 != 0 );
393
394    /* Calculate gain adjustment factor */
395    if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) {
396        gain_adj_Q16 =  silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 );
397    } else {
398        gain_adj_Q16 = (opus_int32)1 << 16;
399    }
400
401    /* Scale input */
402    inv_gain_Q23 = silk_RSHIFT_ROUND( inv_gain_Q31, 8 );
403    for( i = 0; i < psEncC->subfr_length; i++ ) {
404        x_sc_Q10[ i ] = silk_SMULWW( x_Q3[ i ], inv_gain_Q23 );
405    }
406
407    /* Save inverse gain */
408    NSQ->prev_gain_Q16 = Gains_Q16[ subfr ];
409
410    /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */
411    if( NSQ->rewhite_flag ) {
412        if( subfr == 0 ) {
413            /* Do LTP downscaling */
414            inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14 ), 2 );
415        }
416        for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) {
417            silk_assert( i < MAX_FRAME_LENGTH );
418            sLTP_Q15[ i ] = silk_SMULWB( inv_gain_Q31, sLTP[ i ] );
419        }
420    }
421
422    /* Adjust for changing gain */
423    if( gain_adj_Q16 != (opus_int32)1 << 16 ) {
424        /* Scale long-term shaping state */
425        for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx; i++ ) {
426            NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] );
427        }
428
429        /* Scale long-term prediction state */
430        if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) {
431            for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) {
432                sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] );
433            }
434        }
435
436        NSQ->sLF_AR_shp_Q14 = silk_SMULWW( gain_adj_Q16, NSQ->sLF_AR_shp_Q14 );
437
438        /* Scale short-term prediction and shaping states */
439        for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) {
440            NSQ->sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLPC_Q14[ i ] );
441        }
442        for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) {
443            NSQ->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sAR2_Q14[ i ] );
444        }
445    }
446}
447