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