Coverage Report

Created: 2024-03-26 07:25

/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
19.6M
{
135
19.6M
    opus_int            i, k, lag, start_idx, LSF_interpolation_flag, Winner_ind, subfr;
136
19.6M
    opus_int            last_smple_idx, smpl_buf_idx, decisionDelay;
137
19.6M
    const opus_int16    *A_Q12, *B_Q14, *AR_shp_Q13;
138
19.6M
    opus_int16          *pxq;
139
19.6M
    VARDECL( opus_int32, sLTP_Q15 );
140
19.6M
    VARDECL( opus_int16, sLTP );
141
19.6M
    opus_int32          HarmShapeFIRPacked_Q14;
142
19.6M
    opus_int            offset_Q10;
143
19.6M
    opus_int32          RDmin_Q10, Gain_Q10;
144
19.6M
    VARDECL( opus_int32, x_sc_Q10 );
145
19.6M
    VARDECL( opus_int32, delayedGain_Q10 );
146
19.6M
    VARDECL( NSQ_del_dec_struct, psDelDec );
147
19.6M
    NSQ_del_dec_struct  *psDD;
148
19.6M
    SAVE_STACK;
149
150
    /* Set unvoiced lag to the previous one, overwrite later for voiced */
151
19.6M
    lag = NSQ->lagPrev;
152
153
19.6M
    silk_assert( NSQ->prev_gain_Q16 != 0 );
154
155
    /* Initialize delayed decision states */
156
19.6M
    ALLOC( psDelDec, psEncC->nStatesDelayedDecision, NSQ_del_dec_struct );
157
19.6M
    silk_memset( psDelDec, 0, psEncC->nStatesDelayedDecision * sizeof( NSQ_del_dec_struct ) );
158
67.7M
    for( k = 0; k < psEncC->nStatesDelayedDecision; k++ ) {
159
48.0M
        psDD                 = &psDelDec[ k ];
160
48.0M
        psDD->Seed           = ( k + psIndices->Seed ) & 3;
161
48.0M
        psDD->SeedInit       = psDD->Seed;
162
48.0M
        psDD->RD_Q10         = 0;
163
48.0M
        psDD->LF_AR_Q14      = NSQ->sLF_AR_shp_Q14;
164
48.0M
        psDD->Diff_Q14       = NSQ->sDiff_shp_Q14;
165
48.0M
        psDD->Shape_Q14[ 0 ] = NSQ->sLTP_shp_Q14[ psEncC->ltp_mem_length - 1 ];
166
48.0M
        silk_memcpy( psDD->sLPC_Q14, NSQ->sLPC_Q14, NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) );
167
48.0M
        silk_memcpy( psDD->sAR2_Q14, NSQ->sAR2_Q14, sizeof( NSQ->sAR2_Q14 ) );
168
48.0M
    }
169
170
19.6M
    offset_Q10   = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ psIndices->quantOffsetType ];
171
19.6M
    smpl_buf_idx = 0; /* index of oldest samples */
172
173
19.6M
    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
19.6M
    if( psIndices->signalType == TYPE_VOICED ) {
177
2.27M
        for( k = 0; k < psEncC->nb_subfr; k++ ) {
178
1.75M
            decisionDelay = silk_min_int( decisionDelay, pitchL[ k ] - LTP_ORDER / 2 - 1 );
179
1.75M
        }
180
19.1M
    } else {
181
19.1M
        if( lag > 0 ) {
182
283k
            decisionDelay = silk_min_int( decisionDelay, lag - LTP_ORDER / 2 - 1 );
183
283k
        }
184
19.1M
    }
185
186
19.6M
    if( psIndices->NLSFInterpCoef_Q2 == 4 ) {
187
19.5M
        LSF_interpolation_flag = 0;
188
19.5M
    } else {
189
177k
        LSF_interpolation_flag = 1;
190
177k
    }
191
192
19.6M
    ALLOC( sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 );
193
19.6M
    ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 );
194
19.6M
    ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 );
195
19.6M
    ALLOC( delayedGain_Q10, DECISION_DELAY, opus_int32 );
196
    /* Set up pointers to start of sub frame */
197
19.6M
    pxq                   = &NSQ->xq[ psEncC->ltp_mem_length ];
198
19.6M
    NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length;
199
19.6M
    NSQ->sLTP_buf_idx     = psEncC->ltp_mem_length;
200
19.6M
    subfr = 0;
201
84.3M
    for( k = 0; k < psEncC->nb_subfr; k++ ) {
202
64.6M
        A_Q12      = &PredCoef_Q12[ ( ( k >> 1 ) | ( 1 - LSF_interpolation_flag ) ) * MAX_LPC_ORDER ];
203
64.6M
        B_Q14      = &LTPCoef_Q14[ k * LTP_ORDER           ];
204
64.6M
        AR_shp_Q13 = &AR_Q13[     k * MAX_SHAPE_LPC_ORDER ];
205
206
        /* Noise shape parameters */
207
64.6M
        silk_assert( HarmShapeGain_Q14[ k ] >= 0 );
208
64.6M
        HarmShapeFIRPacked_Q14  =                          silk_RSHIFT( HarmShapeGain_Q14[ k ], 2 );
209
64.6M
        HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 );
210
211
64.6M
        NSQ->rewhite_flag = 0;
212
64.6M
        if( psIndices->signalType == TYPE_VOICED ) {
213
            /* Voiced */
214
1.75M
            lag = pitchL[ k ];
215
216
            /* Re-whitening */
217
1.75M
            if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) {
218
573k
                if( k == 2 ) {
219
                    /* RESET DELAYED DECISIONS */
220
                    /* Find winner */
221
56.8k
                    RDmin_Q10 = psDelDec[ 0 ].RD_Q10;
222
56.8k
                    Winner_ind = 0;
223
165k
                    for( i = 1; i < psEncC->nStatesDelayedDecision; i++ ) {
224
108k
                        if( psDelDec[ i ].RD_Q10 < RDmin_Q10 ) {
225
43.8k
                            RDmin_Q10 = psDelDec[ i ].RD_Q10;
226
43.8k
                            Winner_ind = i;
227
43.8k
                        }
228
108k
                    }
229
222k
                    for( i = 0; i < psEncC->nStatesDelayedDecision; i++ ) {
230
165k
                        if( i != Winner_ind ) {
231
108k
                            psDelDec[ i ].RD_Q10 += ( silk_int32_MAX >> 4 );
232
108k
                            silk_assert( psDelDec[ i ].RD_Q10 >= 0 );
233
108k
                        }
234
165k
                    }
235
236
                    /* Copy final part of signals from winner state to output and long-term filter states */
237
56.8k
                    psDD = &psDelDec[ Winner_ind ];
238
56.8k
                    last_smple_idx = smpl_buf_idx + decisionDelay;
239
1.67M
                    for( i = 0; i < decisionDelay; i++ ) {
240
1.61M
                        last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY;
241
1.61M
                        if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY;
242
1.61M
                        pulses[   i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 );
243
1.61M
                        pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND(
244
1.61M
                            silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gains_Q16[ 1 ] ), 14 ) );
245
1.61M
                        NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->Shape_Q14[ last_smple_idx ];
246
1.61M
                    }
247
248
56.8k
                    subfr = 0;
249
56.8k
                }
250
251
                /* Rewhiten with new A coefs */
252
573k
                start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2;
253
573k
                celt_assert( start_idx > 0 );
254
255
573k
                silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ],
256
573k
                    A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch );
257
258
573k
                NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
259
573k
                NSQ->rewhite_flag = 1;
260
573k
            }
261
1.75M
        }
262
263
64.6M
        silk_nsq_del_dec_scale_states( psEncC, NSQ, psDelDec, x16, x_sc_Q10, sLTP, sLTP_Q15, k,
264
64.6M
            psEncC->nStatesDelayedDecision, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType, decisionDelay );
265
266
64.6M
        silk_noise_shape_quantizer_del_dec( NSQ, psDelDec, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15,
267
64.6M
            delayedGain_Q10, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ],
268
64.6M
            Gains_Q16[ k ], Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr++, psEncC->shapingLPCOrder,
269
64.6M
            psEncC->predictLPCOrder, psEncC->warping_Q16, psEncC->nStatesDelayedDecision, &smpl_buf_idx, decisionDelay, psEncC->arch );
270
271
64.6M
        x16    += psEncC->subfr_length;
272
64.6M
        pulses += psEncC->subfr_length;
273
64.6M
        pxq    += psEncC->subfr_length;
274
64.6M
    }
275
276
    /* Find winner */
277
19.6M
    RDmin_Q10 = psDelDec[ 0 ].RD_Q10;
278
19.6M
    Winner_ind = 0;
279
48.0M
    for( k = 1; k < psEncC->nStatesDelayedDecision; k++ ) {
280
28.3M
        if( psDelDec[ k ].RD_Q10 < RDmin_Q10 ) {
281
13.6M
            RDmin_Q10 = psDelDec[ k ].RD_Q10;
282
13.6M
            Winner_ind = k;
283
13.6M
        }
284
28.3M
    }
285
286
    /* Copy final part of signals from winner state to output and long-term filter states */
287
19.6M
    psDD = &psDelDec[ Winner_ind ];
288
19.6M
    psIndices->Seed = psDD->SeedInit;
289
19.6M
    last_smple_idx = smpl_buf_idx + decisionDelay;
290
19.6M
    Gain_Q10 = silk_RSHIFT32( Gains_Q16[ psEncC->nb_subfr - 1 ], 6 );
291
803M
    for( i = 0; i < decisionDelay; i++ ) {
292
783M
        last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY;
293
783M
        if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY;
294
295
783M
        pulses[   i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 );
296
783M
        pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND(
297
783M
            silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gain_Q10 ), 8 ) );
298
783M
        NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->Shape_Q14[ last_smple_idx ];
299
783M
    }
300
19.6M
    silk_memcpy( NSQ->sLPC_Q14, &psDD->sLPC_Q14[ psEncC->subfr_length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) );
301
19.6M
    silk_memcpy( NSQ->sAR2_Q14, psDD->sAR2_Q14, sizeof( psDD->sAR2_Q14 ) );
302
303
    /* Update states */
304
19.6M
    NSQ->sLF_AR_shp_Q14 = psDD->LF_AR_Q14;
305
19.6M
    NSQ->sDiff_shp_Q14  = psDD->Diff_Q14;
306
19.6M
    NSQ->lagPrev        = pitchL[ psEncC->nb_subfr - 1 ];
307
308
    /* Save quantized speech signal */
309
19.6M
    silk_memmove( NSQ->xq,           &NSQ->xq[           psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) );
310
19.6M
    silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) );
311
19.6M
    RESTORE_STACK;
312
19.6M
}
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
64.6M
{
348
64.6M
    opus_int     i, j, k, Winner_ind, RDmin_ind, RDmax_ind, last_smple_idx;
349
64.6M
    opus_int32   Winner_rand_state;
350
64.6M
    opus_int32   LTP_pred_Q14, LPC_pred_Q14, n_AR_Q14, n_LTP_Q14;
351
64.6M
    opus_int32   n_LF_Q14, r_Q10, rr_Q10, rd1_Q10, rd2_Q10, RDmin_Q10, RDmax_Q10;
352
64.6M
    opus_int32   q1_Q0, q1_Q10, q2_Q10, exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10;
353
64.6M
    opus_int32   tmp1, tmp2, sLF_AR_shp_Q14;
354
64.6M
    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
64.6M
    VARDECL( NSQ_sample_pair, psSampleState );
360
64.6M
    NSQ_del_dec_struct *psDD;
361
64.6M
    NSQ_sample_struct  *psSS;
362
64.6M
    SAVE_STACK;
363
364
64.6M
    celt_assert( nStatesDelayedDecision > 0 );
365
64.6M
    ALLOC( psSampleState, nStatesDelayedDecision, NSQ_sample_pair );
366
367
64.6M
    shp_lag_ptr  = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ];
368
64.6M
    pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ];
369
64.6M
    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
3.48G
    for( i = 0; i < length; i++ ) {
376
        /* Perform common calculations used in all states */
377
378
        /* Long-term prediction */
379
3.41G
        if( signalType == TYPE_VOICED ) {
380
            /* Unrolled loop */
381
            /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */
382
82.9M
            LTP_pred_Q14 = 2;
383
82.9M
            LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[  0 ], b_Q14[ 0 ] );
384
82.9M
            LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -1 ], b_Q14[ 1 ] );
385
82.9M
            LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -2 ], b_Q14[ 2 ] );
386
82.9M
            LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -3 ], b_Q14[ 3 ] );
387
82.9M
            LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], b_Q14[ 4 ] );
388
82.9M
            LTP_pred_Q14 = silk_LSHIFT( LTP_pred_Q14, 1 );                          /* Q13 -> Q14 */
389
82.9M
            pred_lag_ptr++;
390
3.33G
        } else {
391
3.33G
            LTP_pred_Q14 = 0;
392
3.33G
        }
393
394
        /* Long-term shaping */
395
3.41G
        if( lag > 0 ) {
396
            /* Symmetric, packed FIR coefficients */
397
123M
            n_LTP_Q14 = silk_SMULWB( silk_ADD_SAT32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 );
398
123M
            n_LTP_Q14 = silk_SMLAWT( n_LTP_Q14, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 );
399
123M
            n_LTP_Q14 = silk_SUB_LSHIFT32( LTP_pred_Q14, n_LTP_Q14, 2 );            /* Q12 -> Q14 */
400
123M
            shp_lag_ptr++;
401
3.29G
        } else {
402
3.29G
            n_LTP_Q14 = 0;
403
3.29G
        }
404
405
11.6G
        for( k = 0; k < nStatesDelayedDecision; k++ ) {
406
            /* Delayed decision state */
407
8.23G
            psDD = &psDelDec[ k ];
408
409
            /* Sample state */
410
8.23G
            psSS = psSampleState[ k ];
411
412
            /* Generate dither */
413
8.23G
            psDD->Seed = silk_RAND( psDD->Seed );
414
415
            /* Pointer used in short term prediction and shaping */
416
8.23G
            psLPC_Q14 = &psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 + i ];
417
            /* Short-term prediction */
418
8.23G
            LPC_pred_Q14 = silk_noise_shape_quantizer_short_prediction(psLPC_Q14, a_Q12, a_Q12_arch, predictLPCOrder, arch);
419
8.23G
            LPC_pred_Q14 = silk_LSHIFT( LPC_pred_Q14, 4 );                              /* Q10 -> Q14 */
420
421
            /* Noise shape feedback */
422
8.23G
            celt_assert( ( shapingLPCOrder & 1 ) == 0 );   /* check that order is even */
423
            /* Output of lowpass section */
424
8.23G
            tmp2 = silk_SMLAWB( psDD->Diff_Q14, psDD->sAR2_Q14[ 0 ], warping_Q16 );
425
            /* Output of allpass section */
426
8.23G
            tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ 0 ], silk_SUB32_ovflw(psDD->sAR2_Q14[ 1 ], tmp2), warping_Q16 );
427
8.23G
            psDD->sAR2_Q14[ 0 ] = tmp2;
428
8.23G
            n_AR_Q14 = silk_RSHIFT( shapingLPCOrder, 1 );
429
8.23G
            n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp2, AR_shp_Q13[ 0 ] );
430
            /* Loop over allpass sections */
431
71.5G
            for( j = 2; j < shapingLPCOrder; j += 2 ) {
432
                /* Output of allpass section */
433
63.3G
                tmp2 = silk_SMLAWB( psDD->sAR2_Q14[ j - 1 ], silk_SUB32_ovflw(psDD->sAR2_Q14[ j + 0 ], tmp1), warping_Q16 );
434
63.3G
                psDD->sAR2_Q14[ j - 1 ] = tmp1;
435
63.3G
                n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp1, AR_shp_Q13[ j - 1 ] );
436
                /* Output of allpass section */
437
63.3G
                tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ j + 0 ], silk_SUB32_ovflw(psDD->sAR2_Q14[ j + 1 ], tmp2), warping_Q16 );
438
63.3G
                psDD->sAR2_Q14[ j + 0 ] = tmp2;
439
63.3G
                n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp2, AR_shp_Q13[ j ] );
440
63.3G
            }
441
8.23G
            psDD->sAR2_Q14[ shapingLPCOrder - 1 ] = tmp1;
442
8.23G
            n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp1, AR_shp_Q13[ shapingLPCOrder - 1 ] );
443
444
8.23G
            n_AR_Q14 = silk_LSHIFT( n_AR_Q14, 1 );                                      /* Q11 -> Q12 */
445
8.23G
            n_AR_Q14 = silk_SMLAWB( n_AR_Q14, psDD->LF_AR_Q14, Tilt_Q14 );              /* Q12 */
446
8.23G
            n_AR_Q14 = silk_LSHIFT( n_AR_Q14, 2 );                                      /* Q12 -> Q14 */
447
448
8.23G
            n_LF_Q14 = silk_SMULWB( psDD->Shape_Q14[ *smpl_buf_idx ], LF_shp_Q14 );     /* Q12 */
449
8.23G
            n_LF_Q14 = silk_SMLAWT( n_LF_Q14, psDD->LF_AR_Q14, LF_shp_Q14 );            /* Q12 */
450
8.23G
            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
8.23G
            tmp1 = silk_ADD_SAT32( n_AR_Q14, n_LF_Q14 );                                /* Q14 */
455
8.23G
            tmp2 = silk_ADD32_ovflw( n_LTP_Q14, LPC_pred_Q14 );                         /* Q13 */
456
8.23G
            tmp1 = silk_SUB_SAT32( tmp2, tmp1 );                                        /* Q13 */
457
8.23G
            tmp1 = silk_RSHIFT_ROUND( tmp1, 4 );                                        /* Q10 */
458
459
8.23G
            r_Q10 = silk_SUB32( x_Q10[ i ], tmp1 );                                     /* residual error Q10 */
460
461
            /* Flip sign depending on dither */
462
8.23G
            if ( psDD->Seed < 0 ) {
463
4.05G
                r_Q10 = -r_Q10;
464
4.05G
            }
465
8.23G
            r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 );
466
467
            /* Find two quantization level candidates and measure their rate-distortion */
468
8.23G
            q1_Q10 = silk_SUB32( r_Q10, offset_Q10 );
469
8.23G
            q1_Q0 = silk_RSHIFT( q1_Q10, 10 );
470
8.23G
            if (Lambda_Q10 > 2048) {
471
                /* For aggressive RDO, the bias becomes more than one pulse. */
472
21.3M
                int rdo_offset = Lambda_Q10/2 - 512;
473
21.3M
                if (q1_Q10 > rdo_offset) {
474
2.79M
                    q1_Q0 = silk_RSHIFT( q1_Q10 - rdo_offset, 10 );
475
18.5M
                } else if (q1_Q10 < -rdo_offset) {
476
3.85M
                    q1_Q0 = silk_RSHIFT( q1_Q10 + rdo_offset, 10 );
477
14.7M
                } else if (q1_Q10 < 0) {
478
8.29M
                    q1_Q0 = -1;
479
8.29M
                } else {
480
6.44M
                    q1_Q0 = 0;
481
6.44M
                }
482
21.3M
            }
483
8.23G
            if( q1_Q0 > 0 ) {
484
67.2M
                q1_Q10  = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 );
485
67.2M
                q1_Q10  = silk_ADD32( q1_Q10, offset_Q10 );
486
67.2M
                q2_Q10  = silk_ADD32( q1_Q10, 1024 );
487
67.2M
                rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 );
488
67.2M
                rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 );
489
8.16G
            } else if( q1_Q0 == 0 ) {
490
487M
                q1_Q10  = offset_Q10;
491
487M
                q2_Q10  = silk_ADD32( q1_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 );
492
487M
                rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 );
493
487M
                rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 );
494
7.67G
            } else if( q1_Q0 == -1 ) {
495
7.58G
                q2_Q10  = offset_Q10;
496
7.58G
                q1_Q10  = silk_SUB32( q2_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 );
497
7.58G
                rd1_Q10 = silk_SMULBB( -q1_Q10, Lambda_Q10 );
498
7.58G
                rd2_Q10 = silk_SMULBB(  q2_Q10, Lambda_Q10 );
499
7.58G
            } else {            /* q1_Q0 < -1 */
500
90.1M
                q1_Q10  = silk_ADD32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 );
501
90.1M
                q1_Q10  = silk_ADD32( q1_Q10, offset_Q10 );
502
90.1M
                q2_Q10  = silk_ADD32( q1_Q10, 1024 );
503
90.1M
                rd1_Q10 = silk_SMULBB( -q1_Q10, Lambda_Q10 );
504
90.1M
                rd2_Q10 = silk_SMULBB( -q2_Q10, Lambda_Q10 );
505
90.1M
            }
506
8.23G
            rr_Q10  = silk_SUB32( r_Q10, q1_Q10 );
507
8.23G
            rd1_Q10 = silk_RSHIFT( silk_SMLABB( rd1_Q10, rr_Q10, rr_Q10 ), 10 );
508
8.23G
            rr_Q10  = silk_SUB32( r_Q10, q2_Q10 );
509
8.23G
            rd2_Q10 = silk_RSHIFT( silk_SMLABB( rd2_Q10, rr_Q10, rr_Q10 ), 10 );
510
511
8.23G
            if( rd1_Q10 < rd2_Q10 ) {
512
590M
                psSS[ 0 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd1_Q10 );
513
590M
                psSS[ 1 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd2_Q10 );
514
590M
                psSS[ 0 ].Q_Q10  = q1_Q10;
515
590M
                psSS[ 1 ].Q_Q10  = q2_Q10;
516
7.64G
            } else {
517
7.64G
                psSS[ 0 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd2_Q10 );
518
7.64G
                psSS[ 1 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd1_Q10 );
519
7.64G
                psSS[ 0 ].Q_Q10  = q2_Q10;
520
7.64G
                psSS[ 1 ].Q_Q10  = q1_Q10;
521
7.64G
            }
522
523
            /* Update states for best quantization */
524
525
            /* Quantized excitation */
526
8.23G
            exc_Q14 = silk_LSHIFT32( psSS[ 0 ].Q_Q10, 4 );
527
8.23G
            if ( psDD->Seed < 0 ) {
528
4.05G
                exc_Q14 = -exc_Q14;
529
4.05G
            }
530
531
            /* Add predictions */
532
8.23G
            LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 );
533
8.23G
            xq_Q14      = silk_ADD32_ovflw( LPC_exc_Q14, LPC_pred_Q14 );
534
535
            /* Update states */
536
8.23G
            psSS[ 0 ].Diff_Q14     = silk_SUB32_ovflw( xq_Q14, silk_LSHIFT32( x_Q10[ i ], 4 ) );
537
8.23G
            sLF_AR_shp_Q14         = silk_SUB32_ovflw( psSS[ 0 ].Diff_Q14, n_AR_Q14 );
538
8.23G
            psSS[ 0 ].sLTP_shp_Q14 = silk_SUB_SAT32( sLF_AR_shp_Q14, n_LF_Q14 );
539
8.23G
            psSS[ 0 ].LF_AR_Q14    = sLF_AR_shp_Q14;
540
8.23G
            psSS[ 0 ].LPC_exc_Q14  = LPC_exc_Q14;
541
8.23G
            psSS[ 0 ].xq_Q14       = xq_Q14;
542
543
            /* Update states for second best quantization */
544
545
            /* Quantized excitation */
546
8.23G
            exc_Q14 = silk_LSHIFT32( psSS[ 1 ].Q_Q10, 4 );
547
8.23G
            if ( psDD->Seed < 0 ) {
548
4.05G
                exc_Q14 = -exc_Q14;
549
4.05G
            }
550
551
            /* Add predictions */
552
8.23G
            LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 );
553
8.23G
            xq_Q14      = silk_ADD32_ovflw( LPC_exc_Q14, LPC_pred_Q14 );
554
555
            /* Update states */
556
8.23G
            psSS[ 1 ].Diff_Q14     = silk_SUB32_ovflw( xq_Q14, silk_LSHIFT32( x_Q10[ i ], 4 ) );
557
8.23G
            sLF_AR_shp_Q14         = silk_SUB32_ovflw( psSS[ 1 ].Diff_Q14, n_AR_Q14 );
558
8.23G
            psSS[ 1 ].sLTP_shp_Q14 = silk_SUB_SAT32( sLF_AR_shp_Q14, n_LF_Q14 );
559
8.23G
            psSS[ 1 ].LF_AR_Q14    = sLF_AR_shp_Q14;
560
8.23G
            psSS[ 1 ].LPC_exc_Q14  = LPC_exc_Q14;
561
8.23G
            psSS[ 1 ].xq_Q14       = xq_Q14;
562
8.23G
        }
563
564
3.41G
        *smpl_buf_idx  = ( *smpl_buf_idx - 1 ) % DECISION_DELAY;
565
3.41G
        if( *smpl_buf_idx < 0 ) *smpl_buf_idx += DECISION_DELAY;
566
3.41G
        last_smple_idx = ( *smpl_buf_idx + decisionDelay ) % DECISION_DELAY;
567
568
        /* Find winner */
569
3.41G
        RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10;
570
3.41G
        Winner_ind = 0;
571
8.23G
        for( k = 1; k < nStatesDelayedDecision; k++ ) {
572
4.81G
            if( psSampleState[ k ][ 0 ].RD_Q10 < RDmin_Q10 ) {
573
2.02G
                RDmin_Q10  = psSampleState[ k ][ 0 ].RD_Q10;
574
2.02G
                Winner_ind = k;
575
2.02G
            }
576
4.81G
        }
577
578
        /* Increase RD values of expired states */
579
3.41G
        Winner_rand_state = psDelDec[ Winner_ind ].RandState[ last_smple_idx ];
580
11.6G
        for( k = 0; k < nStatesDelayedDecision; k++ ) {
581
8.23G
            if( psDelDec[ k ].RandState[ last_smple_idx ] != Winner_rand_state ) {
582
70.7M
                psSampleState[ k ][ 0 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 0 ].RD_Q10, silk_int32_MAX >> 4 );
583
70.7M
                psSampleState[ k ][ 1 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 1 ].RD_Q10, silk_int32_MAX >> 4 );
584
70.7M
                silk_assert( psSampleState[ k ][ 0 ].RD_Q10 >= 0 );
585
70.7M
            }
586
8.23G
        }
587
588
        /* Find worst in first set and best in second set */
589
3.41G
        RDmax_Q10  = psSampleState[ 0 ][ 0 ].RD_Q10;
590
3.41G
        RDmin_Q10  = psSampleState[ 0 ][ 1 ].RD_Q10;
591
3.41G
        RDmax_ind = 0;
592
3.41G
        RDmin_ind = 0;
593
8.23G
        for( k = 1; k < nStatesDelayedDecision; k++ ) {
594
            /* find worst in first set */
595
4.81G
            if( psSampleState[ k ][ 0 ].RD_Q10 > RDmax_Q10 ) {
596
2.18G
                RDmax_Q10  = psSampleState[ k ][ 0 ].RD_Q10;
597
2.18G
                RDmax_ind = k;
598
2.18G
            }
599
            /* find best in second set */
600
4.81G
            if( psSampleState[ k ][ 1 ].RD_Q10 < RDmin_Q10 ) {
601
2.03G
                RDmin_Q10  = psSampleState[ k ][ 1 ].RD_Q10;
602
2.03G
                RDmin_ind = k;
603
2.03G
            }
604
4.81G
        }
605
606
        /* Replace a state if best from second set outperforms worst in first set */
607
3.41G
        if( RDmin_Q10 < RDmax_Q10 ) {
608
552M
            silk_memcpy( ( (opus_int32 *)&psDelDec[ RDmax_ind ] ) + i,
609
552M
                         ( (opus_int32 *)&psDelDec[ RDmin_ind ] ) + i, sizeof( NSQ_del_dec_struct ) - i * sizeof( opus_int32) );
610
552M
            silk_memcpy( &psSampleState[ RDmax_ind ][ 0 ], &psSampleState[ RDmin_ind ][ 1 ], sizeof( NSQ_sample_struct ) );
611
552M
        }
612
613
        /* Write samples from winner to output and long-term filter states */
614
3.41G
        psDD = &psDelDec[ Winner_ind ];
615
3.41G
        if( subfr > 0 || i >= decisionDelay ) {
616
2.63G
            pulses[  i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 );
617
2.63G
            xq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND(
618
2.63G
                silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], delayedGain_Q10[ last_smple_idx ] ), 8 ) );
619
2.63G
            NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay ] = psDD->Shape_Q14[ last_smple_idx ];
620
2.63G
            sLTP_Q15[          NSQ->sLTP_buf_idx     - decisionDelay ] = psDD->Pred_Q15[  last_smple_idx ];
621
2.63G
        }
622
3.41G
        NSQ->sLTP_shp_buf_idx++;
623
3.41G
        NSQ->sLTP_buf_idx++;
624
625
        /* Update states */
626
11.6G
        for( k = 0; k < nStatesDelayedDecision; k++ ) {
627
8.23G
            psDD                                     = &psDelDec[ k ];
628
8.23G
            psSS                                     = &psSampleState[ k ][ 0 ];
629
8.23G
            psDD->LF_AR_Q14                          = psSS->LF_AR_Q14;
630
8.23G
            psDD->Diff_Q14                           = psSS->Diff_Q14;
631
8.23G
            psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ] = psSS->xq_Q14;
632
8.23G
            psDD->Xq_Q14[    *smpl_buf_idx ]         = psSS->xq_Q14;
633
8.23G
            psDD->Q_Q10[     *smpl_buf_idx ]         = psSS->Q_Q10;
634
8.23G
            psDD->Pred_Q15[  *smpl_buf_idx ]         = silk_LSHIFT32( psSS->LPC_exc_Q14, 1 );
635
8.23G
            psDD->Shape_Q14[ *smpl_buf_idx ]         = psSS->sLTP_shp_Q14;
636
8.23G
            psDD->Seed                               = silk_ADD32_ovflw( psDD->Seed, silk_RSHIFT_ROUND( psSS->Q_Q10, 10 ) );
637
8.23G
            psDD->RandState[ *smpl_buf_idx ]         = psDD->Seed;
638
8.23G
            psDD->RD_Q10                             = psSS->RD_Q10;
639
8.23G
        }
640
3.41G
        delayedGain_Q10[     *smpl_buf_idx ]         = Gain_Q10;
641
3.41G
    }
642
    /* Update LPC states */
643
222M
    for( k = 0; k < nStatesDelayedDecision; k++ ) {
644
158M
        psDD = &psDelDec[ k ];
645
158M
        silk_memcpy( psDD->sLPC_Q14, &psDD->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) );
646
158M
    }
647
64.6M
    RESTORE_STACK;
648
64.6M
}
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
64.6M
{
668
64.6M
    opus_int            i, k, lag;
669
64.6M
    opus_int32          gain_adj_Q16, inv_gain_Q31, inv_gain_Q26;
670
64.6M
    NSQ_del_dec_struct  *psDD;
671
672
64.6M
    lag          = pitchL[ subfr ];
673
64.6M
    inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 );
674
64.6M
    silk_assert( inv_gain_Q31 != 0 );
675
676
    /* Scale input */
677
64.6M
    inv_gain_Q26 = silk_RSHIFT_ROUND( inv_gain_Q31, 5 );
678
3.48G
    for( i = 0; i < psEncC->subfr_length; i++ ) {
679
3.41G
        x_sc_Q10[ i ] = silk_SMULWW( x16[ i ], inv_gain_Q26 );
680
3.41G
    }
681
682
    /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */
683
64.6M
    if( NSQ->rewhite_flag ) {
684
573k
        if( subfr == 0 ) {
685
            /* Do LTP downscaling */
686
516k
            inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14 ), 2 );
687
516k
        }
688
47.7M
        for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) {
689
47.2M
            silk_assert( i < MAX_FRAME_LENGTH );
690
47.2M
            sLTP_Q15[ i ] = silk_SMULWB( inv_gain_Q31, sLTP[ i ] );
691
47.2M
        }
692
573k
    }
693
694
    /* Adjust for changing gain */
695
64.6M
    if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) {
696
4.25M
        gain_adj_Q16 =  silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 );
697
698
        /* Scale long-term shaping state */
699
839M
        for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx; i++ ) {
700
835M
            NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] );
701
835M
        }
702
703
        /* Scale long-term prediction state */
704
4.25M
        if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) {
705
48.5M
            for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx - decisionDelay; i++ ) {
706
47.6M
                sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] );
707
47.6M
            }
708
873k
        }
709
710
15.0M
        for( k = 0; k < nStatesDelayedDecision; k++ ) {
711
10.7M
            psDD = &psDelDec[ k ];
712
713
            /* Scale scalar states */
714
10.7M
            psDD->LF_AR_Q14 = silk_SMULWW( gain_adj_Q16, psDD->LF_AR_Q14 );
715
10.7M
            psDD->Diff_Q14 = silk_SMULWW( gain_adj_Q16, psDD->Diff_Q14 );
716
717
            /* Scale short-term prediction and shaping states */
718
182M
            for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) {
719
172M
                psDD->sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->sLPC_Q14[ i ] );
720
172M
            }
721
268M
            for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) {
722
258M
                psDD->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->sAR2_Q14[ i ] );
723
258M
            }
724
440M
            for( i = 0; i < DECISION_DELAY; i++ ) {
725
430M
                psDD->Pred_Q15[  i ] = silk_SMULWW( gain_adj_Q16, psDD->Pred_Q15[  i ] );
726
430M
                psDD->Shape_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->Shape_Q14[ i ] );
727
430M
            }
728
10.7M
        }
729
730
        /* Save inverse gain */
731
4.25M
        NSQ->prev_gain_Q16 = Gains_Q16[ subfr ];
732
4.25M
    }
733
64.6M
}