Coverage Report

Created: 2026-02-26 07:37

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