Coverage Report

Created: 2025-07-23 07:59

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