OLD | NEW |
1 /*********************************************************************** | 1 /*********************************************************************** |
2 Copyright (c) 2006-2011, Skype Limited. All rights reserved. | 2 Copyright (c) 2006-2011, Skype Limited. All rights reserved. |
3 Redistribution and use in source and binary forms, with or without | 3 Redistribution and use in source and binary forms, with or without |
4 modification, are permitted provided that the following conditions | 4 modification, are permitted provided that the following conditions |
5 are met: | 5 are met: |
6 - Redistributions of source code must retain the above copyright notice, | 6 - Redistributions of source code must retain the above copyright notice, |
7 this list of conditions and the following disclaimer. | 7 this list of conditions and the following disclaimer. |
8 - Redistributions in binary form must reproduce the above copyright | 8 - Redistributions in binary form must reproduce the above copyright |
9 notice, this list of conditions and the following disclaimer in the | 9 notice, this list of conditions and the following disclaimer in the |
10 documentation and/or other materials provided with the distribution. | 10 documentation and/or other materials provided with the distribution. |
(...skipping 25 matching lines...) Expand all Loading... |
36 | 36 |
37 typedef struct { | 37 typedef struct { |
38 opus_int32 sLPC_Q14[ MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH ]; | 38 opus_int32 sLPC_Q14[ MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH ]; |
39 opus_int32 RandState[ DECISION_DELAY ]; | 39 opus_int32 RandState[ DECISION_DELAY ]; |
40 opus_int32 Q_Q10[ DECISION_DELAY ]; | 40 opus_int32 Q_Q10[ DECISION_DELAY ]; |
41 opus_int32 Xq_Q14[ DECISION_DELAY ]; | 41 opus_int32 Xq_Q14[ DECISION_DELAY ]; |
42 opus_int32 Pred_Q15[ DECISION_DELAY ]; | 42 opus_int32 Pred_Q15[ DECISION_DELAY ]; |
43 opus_int32 Shape_Q14[ DECISION_DELAY ]; | 43 opus_int32 Shape_Q14[ DECISION_DELAY ]; |
44 opus_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ]; | 44 opus_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ]; |
45 opus_int32 LF_AR_Q14; | 45 opus_int32 LF_AR_Q14; |
| 46 opus_int32 Diff_Q14; |
46 opus_int32 Seed; | 47 opus_int32 Seed; |
47 opus_int32 SeedInit; | 48 opus_int32 SeedInit; |
48 opus_int32 RD_Q10; | 49 opus_int32 RD_Q10; |
49 } NSQ_del_dec_struct; | 50 } NSQ_del_dec_struct; |
50 | 51 |
51 typedef struct { | 52 typedef struct { |
52 opus_int32 Q_Q10; | 53 opus_int32 Q_Q10; |
53 opus_int32 RD_Q10; | 54 opus_int32 RD_Q10; |
54 opus_int32 xq_Q14; | 55 opus_int32 xq_Q14; |
55 opus_int32 LF_AR_Q14; | 56 opus_int32 LF_AR_Q14; |
| 57 opus_int32 Diff_Q14; |
56 opus_int32 sLTP_shp_Q14; | 58 opus_int32 sLTP_shp_Q14; |
57 opus_int32 LPC_exc_Q14; | 59 opus_int32 LPC_exc_Q14; |
58 } NSQ_sample_struct; | 60 } NSQ_sample_struct; |
59 | 61 |
60 typedef NSQ_sample_struct NSQ_sample_pair[ 2 ]; | 62 typedef NSQ_sample_struct NSQ_sample_pair[ 2 ]; |
61 | 63 |
62 #if defined(MIPSr1_ASM) | 64 #if defined(MIPSr1_ASM) |
63 #include "mips/NSQ_del_dec_mipsr1.h" | 65 #include "mips/NSQ_del_dec_mipsr1.h" |
64 #endif | 66 #endif |
65 static OPUS_INLINE void silk_nsq_del_dec_scale_states( | 67 static OPUS_INLINE void silk_nsq_del_dec_scale_states( |
66 const silk_encoder_state *psEncC, /* I Encoder State
*/ | 68 const silk_encoder_state *psEncC, /* I Encoder State
*/ |
67 silk_nsq_state *NSQ, /* I/O NSQ state
*/ | 69 silk_nsq_state *NSQ, /* I/O NSQ state
*/ |
68 NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision sta
tes */ | 70 NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision sta
tes */ |
69 const opus_int32 x_Q3[], /* I Input in Q3
*/ | 71 const opus_int16 x16[], /* I Input
*/ |
70 opus_int32 x_sc_Q10[], /* O Input scaled with 1/
Gain in Q10 */ | 72 opus_int32 x_sc_Q10[], /* O Input scaled with 1/
Gain in Q10 */ |
71 const opus_int16 sLTP[], /* I Re-whitened LTP stat
e in Q0 */ | 73 const opus_int16 sLTP[], /* I Re-whitened LTP stat
e in Q0 */ |
72 opus_int32 sLTP_Q15[], /* O LTP state matching s
caled input */ | 74 opus_int32 sLTP_Q15[], /* O LTP state matching s
caled input */ |
73 opus_int subfr, /* I Subframe number
*/ | 75 opus_int subfr, /* I Subframe number
*/ |
74 opus_int nStatesDelayedDecision, /* I Number of del dec st
ates */ | 76 opus_int nStatesDelayedDecision, /* I Number of del dec st
ates */ |
75 const opus_int LTP_scale_Q14, /* I LTP state scaling
*/ | 77 const opus_int LTP_scale_Q14, /* I LTP state scaling
*/ |
76 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I
*/ | 78 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I
*/ |
77 const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag
*/ | 79 const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag
*/ |
78 const opus_int signal_type, /* I Signal type
*/ | 80 const opus_int signal_type, /* I Signal type
*/ |
79 const opus_int decisionDelay /* I Decision delay
*/ | 81 const opus_int decisionDelay /* I Decision delay
*/ |
(...skipping 20 matching lines...) Expand all Loading... |
100 opus_int32 LF_shp_Q14, /* I
*/ | 102 opus_int32 LF_shp_Q14, /* I
*/ |
101 opus_int32 Gain_Q16, /* I
*/ | 103 opus_int32 Gain_Q16, /* I
*/ |
102 opus_int Lambda_Q10, /* I
*/ | 104 opus_int Lambda_Q10, /* I
*/ |
103 opus_int offset_Q10, /* I
*/ | 105 opus_int offset_Q10, /* I
*/ |
104 opus_int length, /* I Input length
*/ | 106 opus_int length, /* I Input length
*/ |
105 opus_int subfr, /* I Subframe number
*/ | 107 opus_int subfr, /* I Subframe number
*/ |
106 opus_int shapingLPCOrder, /* I Shaping LPC filter order
*/ | 108 opus_int shapingLPCOrder, /* I Shaping LPC filter order
*/ |
107 opus_int predictLPCOrder, /* I Prediction filter order
*/ | 109 opus_int predictLPCOrder, /* I Prediction filter order
*/ |
108 opus_int warping_Q16, /* I
*/ | 110 opus_int warping_Q16, /* I
*/ |
109 opus_int nStatesDelayedDecision, /* I Number of states in deci
sion tree */ | 111 opus_int nStatesDelayedDecision, /* I Number of states in deci
sion tree */ |
110 opus_int *smpl_buf_idx, /* I Index to newest samples
in buffers */ | 112 opus_int *smpl_buf_idx, /* I/O Index to newest samples
in buffers */ |
111 opus_int decisionDelay, /* I
*/ | 113 opus_int decisionDelay, /* I
*/ |
112 int arch /* I
*/ | 114 int arch /* I
*/ |
113 ); | 115 ); |
114 | 116 |
115 void silk_NSQ_del_dec_c( | 117 void silk_NSQ_del_dec_c( |
116 const silk_encoder_state *psEncC, /* I
/O Encoder State */ | 118 const silk_encoder_state *psEncC, /* I
Encoder State */ |
117 silk_nsq_state *NSQ, /* I
/O NSQ state */ | 119 silk_nsq_state *NSQ, /* I
/O NSQ state */ |
118 SideInfoIndices *psIndices, /* I
/O Quantization Indices */ | 120 SideInfoIndices *psIndices, /* I
/O Quantization Indices */ |
119 const opus_int32 x_Q3[], /* I
Prefiltered input signal */ | 121 const opus_int16 x16[], /*
I Input */ |
120 opus_int8 pulses[], /* O
Quantized pulse signal */ | 122 opus_int8 pulses[], /* O
Quantized pulse signal */ |
121 const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I
Short term prediction coefs */ | 123 const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I
Short term prediction coefs */ |
122 const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I
Long term prediction coefs */ | 124 const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I
Long term prediction coefs */ |
123 const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /
* I Noise shaping coefs */ | 125 const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /*
I Noise shaping coefs */ |
124 const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I
Long term shaping coefs */ | 126 const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I
Long term shaping coefs */ |
125 const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I
Spectral tilt */ | 127 const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I
Spectral tilt */ |
126 const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I
Low frequency shaping coefs */ | 128 const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I
Low frequency shaping coefs */ |
127 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I
Quantization step sizes */ | 129 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I
Quantization step sizes */ |
128 const opus_int pitchL[ MAX_NB_SUBFR ], /* I
Pitch lags */ | 130 const opus_int pitchL[ MAX_NB_SUBFR ], /* I
Pitch lags */ |
129 const opus_int Lambda_Q10, /* I
Rate/distortion tradeoff */ | 131 const opus_int Lambda_Q10, /* I
Rate/distortion tradeoff */ |
130 const opus_int LTP_scale_Q14 /* I
LTP state scaling */ | 132 const opus_int LTP_scale_Q14 /* I
LTP state scaling */ |
131 ) | 133 ) |
132 { | 134 { |
133 opus_int i, k, lag, start_idx, LSF_interpolation_flag, Winner_ind
, subfr; | 135 opus_int i, k, lag, start_idx, LSF_interpolation_flag, Winner_ind
, subfr; |
(...skipping 18 matching lines...) Expand all Loading... |
152 | 154 |
153 /* Initialize delayed decision states */ | 155 /* Initialize delayed decision states */ |
154 ALLOC( psDelDec, psEncC->nStatesDelayedDecision, NSQ_del_dec_struct ); | 156 ALLOC( psDelDec, psEncC->nStatesDelayedDecision, NSQ_del_dec_struct ); |
155 silk_memset( psDelDec, 0, psEncC->nStatesDelayedDecision * sizeof( NSQ_del_d
ec_struct ) ); | 157 silk_memset( psDelDec, 0, psEncC->nStatesDelayedDecision * sizeof( NSQ_del_d
ec_struct ) ); |
156 for( k = 0; k < psEncC->nStatesDelayedDecision; k++ ) { | 158 for( k = 0; k < psEncC->nStatesDelayedDecision; k++ ) { |
157 psDD = &psDelDec[ k ]; | 159 psDD = &psDelDec[ k ]; |
158 psDD->Seed = ( k + psIndices->Seed ) & 3; | 160 psDD->Seed = ( k + psIndices->Seed ) & 3; |
159 psDD->SeedInit = psDD->Seed; | 161 psDD->SeedInit = psDD->Seed; |
160 psDD->RD_Q10 = 0; | 162 psDD->RD_Q10 = 0; |
161 psDD->LF_AR_Q14 = NSQ->sLF_AR_shp_Q14; | 163 psDD->LF_AR_Q14 = NSQ->sLF_AR_shp_Q14; |
| 164 psDD->Diff_Q14 = NSQ->sDiff_shp_Q14; |
162 psDD->Shape_Q14[ 0 ] = NSQ->sLTP_shp_Q14[ psEncC->ltp_mem_length - 1 ]; | 165 psDD->Shape_Q14[ 0 ] = NSQ->sLTP_shp_Q14[ psEncC->ltp_mem_length - 1 ]; |
163 silk_memcpy( psDD->sLPC_Q14, NSQ->sLPC_Q14, NSQ_LPC_BUF_LENGTH * sizeof(
opus_int32 ) ); | 166 silk_memcpy( psDD->sLPC_Q14, NSQ->sLPC_Q14, NSQ_LPC_BUF_LENGTH * sizeof(
opus_int32 ) ); |
164 silk_memcpy( psDD->sAR2_Q14, NSQ->sAR2_Q14, sizeof( NSQ->sAR2_Q14 ) ); | 167 silk_memcpy( psDD->sAR2_Q14, NSQ->sAR2_Q14, sizeof( NSQ->sAR2_Q14 ) ); |
165 } | 168 } |
166 | 169 |
167 offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][
psIndices->quantOffsetType ]; | 170 offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][
psIndices->quantOffsetType ]; |
168 smpl_buf_idx = 0; /* index of oldest samples */ | 171 smpl_buf_idx = 0; /* index of oldest samples */ |
169 | 172 |
170 decisionDelay = silk_min_int( DECISION_DELAY, psEncC->subfr_length ); | 173 decisionDelay = silk_min_int( DECISION_DELAY, psEncC->subfr_length ); |
171 | 174 |
172 /* For voiced frames limit the decision delay to lower than the pitch lag */ | 175 /* For voiced frames limit the decision delay to lower than the pitch lag */ |
173 if( psIndices->signalType == TYPE_VOICED ) { | 176 if( psIndices->signalType == TYPE_VOICED ) { |
174 for( k = 0; k < psEncC->nb_subfr; k++ ) { | 177 for( k = 0; k < psEncC->nb_subfr; k++ ) { |
175 decisionDelay = silk_min_int( decisionDelay, pitchL[ k ] - LTP_ORDER
/ 2 - 1 ); | 178 decisionDelay = silk_min_int( decisionDelay, pitchL[ k ] - LTP_ORDER
/ 2 - 1 ); |
176 } | 179 } |
177 } else { | 180 } else { |
178 if( lag > 0 ) { | 181 if( lag > 0 ) { |
179 decisionDelay = silk_min_int( decisionDelay, lag - LTP_ORDER / 2 - 1
); | 182 decisionDelay = silk_min_int( decisionDelay, lag - LTP_ORDER / 2 - 1
); |
180 } | 183 } |
181 } | 184 } |
182 | 185 |
183 if( psIndices->NLSFInterpCoef_Q2 == 4 ) { | 186 if( psIndices->NLSFInterpCoef_Q2 == 4 ) { |
184 LSF_interpolation_flag = 0; | 187 LSF_interpolation_flag = 0; |
185 } else { | 188 } else { |
186 LSF_interpolation_flag = 1; | 189 LSF_interpolation_flag = 1; |
187 } | 190 } |
188 | 191 |
189 ALLOC( sLTP_Q15, | 192 ALLOC( sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 )
; |
190 psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 ); | |
191 ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); | 193 ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); |
192 ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); | 194 ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); |
193 ALLOC( delayedGain_Q10, DECISION_DELAY, opus_int32 ); | 195 ALLOC( delayedGain_Q10, DECISION_DELAY, opus_int32 ); |
194 /* Set up pointers to start of sub frame */ | 196 /* Set up pointers to start of sub frame */ |
195 pxq = &NSQ->xq[ psEncC->ltp_mem_length ]; | 197 pxq = &NSQ->xq[ psEncC->ltp_mem_length ]; |
196 NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length; | 198 NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length; |
197 NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; | 199 NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; |
198 subfr = 0; | 200 subfr = 0; |
199 for( k = 0; k < psEncC->nb_subfr; k++ ) { | 201 for( k = 0; k < psEncC->nb_subfr; k++ ) { |
200 A_Q12 = &PredCoef_Q12[ ( ( k >> 1 ) | ( 1 - LSF_interpolation_flag
) ) * MAX_LPC_ORDER ]; | 202 A_Q12 = &PredCoef_Q12[ ( ( k >> 1 ) | ( 1 - LSF_interpolation_flag
) ) * MAX_LPC_ORDER ]; |
201 B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; | 203 B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; |
202 AR_shp_Q13 = &AR2_Q13[ k * MAX_SHAPE_LPC_ORDER ]; | 204 AR_shp_Q13 = &AR_Q13[ k * MAX_SHAPE_LPC_ORDER ]; |
203 | 205 |
204 /* Noise shape parameters */ | 206 /* Noise shape parameters */ |
205 silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); | 207 silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); |
206 HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShap
eGain_Q14[ k ], 2 ); | 208 HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShap
eGain_Q14[ k ], 2 ); |
207 HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShap
eGain_Q14[ k ], 1 ), 16 ); | 209 HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShap
eGain_Q14[ k ], 1 ), 16 ); |
208 | 210 |
209 NSQ->rewhite_flag = 0; | 211 NSQ->rewhite_flag = 0; |
210 if( psIndices->signalType == TYPE_VOICED ) { | 212 if( psIndices->signalType == TYPE_VOICED ) { |
211 /* Voiced */ | 213 /* Voiced */ |
212 lag = pitchL[ k ]; | 214 lag = pitchL[ k ]; |
(...skipping 15 matching lines...) Expand all Loading... |
228 if( i != Winner_ind ) { | 230 if( i != Winner_ind ) { |
229 psDelDec[ i ].RD_Q10 += ( silk_int32_MAX >> 4 ); | 231 psDelDec[ i ].RD_Q10 += ( silk_int32_MAX >> 4 ); |
230 silk_assert( psDelDec[ i ].RD_Q10 >= 0 ); | 232 silk_assert( psDelDec[ i ].RD_Q10 >= 0 ); |
231 } | 233 } |
232 } | 234 } |
233 | 235 |
234 /* Copy final part of signals from winner state to output an
d long-term filter states */ | 236 /* Copy final part of signals from winner state to output an
d long-term filter states */ |
235 psDD = &psDelDec[ Winner_ind ]; | 237 psDD = &psDelDec[ Winner_ind ]; |
236 last_smple_idx = smpl_buf_idx + decisionDelay; | 238 last_smple_idx = smpl_buf_idx + decisionDelay; |
237 for( i = 0; i < decisionDelay; i++ ) { | 239 for( i = 0; i < decisionDelay; i++ ) { |
238 last_smple_idx = ( last_smple_idx - 1 ) & DECISION_DELAY
_MASK; | 240 last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY
; |
| 241 if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELA
Y; |
239 pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_R
OUND( psDD->Q_Q10[ last_smple_idx ], 10 ); | 242 pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_R
OUND( psDD->Q_Q10[ last_smple_idx ], 10 ); |
240 pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_
RSHIFT_ROUND( | 243 pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_
RSHIFT_ROUND( |
241 silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gains_Q
16[ 1 ] ), 14 ) ); | 244 silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gains_Q
16[ 1 ] ), 14 ) ); |
242 NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay
+ i ] = psDD->Shape_Q14[ last_smple_idx ]; | 245 NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay
+ i ] = psDD->Shape_Q14[ last_smple_idx ]; |
243 } | 246 } |
244 | 247 |
245 subfr = 0; | 248 subfr = 0; |
246 } | 249 } |
247 | 250 |
248 /* Rewhiten with new A coefs */ | 251 /* Rewhiten with new A coefs */ |
249 start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrd
er - LTP_ORDER / 2; | 252 start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrd
er - LTP_ORDER / 2; |
250 silk_assert( start_idx > 0 ); | 253 silk_assert( start_idx > 0 ); |
251 | 254 |
252 silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_id
x + k * psEncC->subfr_length ], | 255 silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_id
x + k * psEncC->subfr_length ], |
253 A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLP
COrder, psEncC->arch ); | 256 A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLP
COrder, psEncC->arch ); |
254 | 257 |
255 NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; | 258 NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; |
256 NSQ->rewhite_flag = 1; | 259 NSQ->rewhite_flag = 1; |
257 } | 260 } |
258 } | 261 } |
259 | 262 |
260 silk_nsq_del_dec_scale_states( psEncC, NSQ, psDelDec, x_Q3, x_sc_Q10, sL
TP, sLTP_Q15, k, | 263 silk_nsq_del_dec_scale_states( psEncC, NSQ, psDelDec, x16, x_sc_Q10, sLT
P, sLTP_Q15, k, |
261 psEncC->nStatesDelayedDecision, LTP_scale_Q14, Gains_Q16, pitchL, ps
Indices->signalType, decisionDelay ); | 264 psEncC->nStatesDelayedDecision, LTP_scale_Q14, Gains_Q16, pitchL, ps
Indices->signalType, decisionDelay ); |
262 | 265 |
263 silk_noise_shape_quantizer_del_dec( NSQ, psDelDec, psIndices->signalType
, x_sc_Q10, pulses, pxq, sLTP_Q15, | 266 silk_noise_shape_quantizer_del_dec( NSQ, psDelDec, psIndices->signalType
, x_sc_Q10, pulses, pxq, sLTP_Q15, |
264 delayedGain_Q10, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q
14, Tilt_Q14[ k ], LF_shp_Q14[ k ], | 267 delayedGain_Q10, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q
14, Tilt_Q14[ k ], LF_shp_Q14[ k ], |
265 Gains_Q16[ k ], Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr+
+, psEncC->shapingLPCOrder, | 268 Gains_Q16[ k ], Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr+
+, psEncC->shapingLPCOrder, |
266 psEncC->predictLPCOrder, psEncC->warping_Q16, psEncC->nStatesDelayed
Decision, &smpl_buf_idx, decisionDelay, psEncC->arch ); | 269 psEncC->predictLPCOrder, psEncC->warping_Q16, psEncC->nStatesDelayed
Decision, &smpl_buf_idx, decisionDelay, psEncC->arch ); |
267 | 270 |
268 x_Q3 += psEncC->subfr_length; | 271 x16 += psEncC->subfr_length; |
269 pulses += psEncC->subfr_length; | 272 pulses += psEncC->subfr_length; |
270 pxq += psEncC->subfr_length; | 273 pxq += psEncC->subfr_length; |
271 } | 274 } |
272 | 275 |
273 /* Find winner */ | 276 /* Find winner */ |
274 RDmin_Q10 = psDelDec[ 0 ].RD_Q10; | 277 RDmin_Q10 = psDelDec[ 0 ].RD_Q10; |
275 Winner_ind = 0; | 278 Winner_ind = 0; |
276 for( k = 1; k < psEncC->nStatesDelayedDecision; k++ ) { | 279 for( k = 1; k < psEncC->nStatesDelayedDecision; k++ ) { |
277 if( psDelDec[ k ].RD_Q10 < RDmin_Q10 ) { | 280 if( psDelDec[ k ].RD_Q10 < RDmin_Q10 ) { |
278 RDmin_Q10 = psDelDec[ k ].RD_Q10; | 281 RDmin_Q10 = psDelDec[ k ].RD_Q10; |
279 Winner_ind = k; | 282 Winner_ind = k; |
280 } | 283 } |
281 } | 284 } |
282 | 285 |
283 /* Copy final part of signals from winner state to output and long-term filt
er states */ | 286 /* Copy final part of signals from winner state to output and long-term filt
er states */ |
284 psDD = &psDelDec[ Winner_ind ]; | 287 psDD = &psDelDec[ Winner_ind ]; |
285 psIndices->Seed = psDD->SeedInit; | 288 psIndices->Seed = psDD->SeedInit; |
286 last_smple_idx = smpl_buf_idx + decisionDelay; | 289 last_smple_idx = smpl_buf_idx + decisionDelay; |
287 Gain_Q10 = silk_RSHIFT32( Gains_Q16[ psEncC->nb_subfr - 1 ], 6 ); | 290 Gain_Q10 = silk_RSHIFT32( Gains_Q16[ psEncC->nb_subfr - 1 ], 6 ); |
288 for( i = 0; i < decisionDelay; i++ ) { | 291 for( i = 0; i < decisionDelay; i++ ) { |
289 last_smple_idx = ( last_smple_idx - 1 ) & DECISION_DELAY_MASK; | 292 last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY; |
| 293 if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY; |
| 294 |
290 pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q1
0[ last_smple_idx ], 10 ); | 295 pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q1
0[ last_smple_idx ], 10 ); |
291 pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( | 296 pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( |
292 silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gain_Q10 ), 8 ) ); | 297 silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gain_Q10 ), 8 ) ); |
293 NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->S
hape_Q14[ last_smple_idx ]; | 298 NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->S
hape_Q14[ last_smple_idx ]; |
294 } | 299 } |
295 silk_memcpy( NSQ->sLPC_Q14, &psDD->sLPC_Q14[ psEncC->subfr_length ], NSQ_LPC
_BUF_LENGTH * sizeof( opus_int32 ) ); | 300 silk_memcpy( NSQ->sLPC_Q14, &psDD->sLPC_Q14[ psEncC->subfr_length ], NSQ_LPC
_BUF_LENGTH * sizeof( opus_int32 ) ); |
296 silk_memcpy( NSQ->sAR2_Q14, psDD->sAR2_Q14, sizeof( psDD->sAR2_Q14 ) ); | 301 silk_memcpy( NSQ->sAR2_Q14, psDD->sAR2_Q14, sizeof( psDD->sAR2_Q14 ) ); |
297 | 302 |
298 /* Update states */ | 303 /* Update states */ |
299 NSQ->sLF_AR_shp_Q14 = psDD->LF_AR_Q14; | 304 NSQ->sLF_AR_shp_Q14 = psDD->LF_AR_Q14; |
| 305 NSQ->sDiff_shp_Q14 = psDD->Diff_Q14; |
300 NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; | 306 NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; |
301 | 307 |
302 /* Save quantized speech signal */ | 308 /* Save quantized speech signal */ |
303 /* DEBUG_STORE_DATA( enc.pcm, &NSQ->xq[psEncC->ltp_mem_length], psEncC->fram
e_length * sizeof( opus_int16 ) ) */ | |
304 silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ],
psEncC->ltp_mem_length * sizeof( opus_int16 ) ); | 309 silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ],
psEncC->ltp_mem_length * sizeof( opus_int16 ) ); |
305 silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ],
psEncC->ltp_mem_length * sizeof( opus_int32 ) ); | 310 silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ],
psEncC->ltp_mem_length * sizeof( opus_int32 ) ); |
306 RESTORE_STACK; | 311 RESTORE_STACK; |
307 } | 312 } |
308 | 313 |
309 /******************************************/ | 314 /******************************************/ |
310 /* Noise shape quantizer for one subframe */ | 315 /* Noise shape quantizer for one subframe */ |
311 /******************************************/ | 316 /******************************************/ |
312 #ifndef OVERRIDE_silk_noise_shape_quantizer_del_dec | 317 #ifndef OVERRIDE_silk_noise_shape_quantizer_del_dec |
313 static OPUS_INLINE void silk_noise_shape_quantizer_del_dec( | 318 static OPUS_INLINE void silk_noise_shape_quantizer_del_dec( |
(...skipping 14 matching lines...) Expand all Loading... |
328 opus_int32 LF_shp_Q14, /* I
*/ | 333 opus_int32 LF_shp_Q14, /* I
*/ |
329 opus_int32 Gain_Q16, /* I
*/ | 334 opus_int32 Gain_Q16, /* I
*/ |
330 opus_int Lambda_Q10, /* I
*/ | 335 opus_int Lambda_Q10, /* I
*/ |
331 opus_int offset_Q10, /* I
*/ | 336 opus_int offset_Q10, /* I
*/ |
332 opus_int length, /* I Input length
*/ | 337 opus_int length, /* I Input length
*/ |
333 opus_int subfr, /* I Subframe number
*/ | 338 opus_int subfr, /* I Subframe number
*/ |
334 opus_int shapingLPCOrder, /* I Shaping LPC filter order
*/ | 339 opus_int shapingLPCOrder, /* I Shaping LPC filter order
*/ |
335 opus_int predictLPCOrder, /* I Prediction filter order
*/ | 340 opus_int predictLPCOrder, /* I Prediction filter order
*/ |
336 opus_int warping_Q16, /* I
*/ | 341 opus_int warping_Q16, /* I
*/ |
337 opus_int nStatesDelayedDecision, /* I Number of states in deci
sion tree */ | 342 opus_int nStatesDelayedDecision, /* I Number of states in deci
sion tree */ |
338 opus_int *smpl_buf_idx, /* I Index to newest samples
in buffers */ | 343 opus_int *smpl_buf_idx, /* I/O Index to newest samples
in buffers */ |
339 opus_int decisionDelay, /* I
*/ | 344 opus_int decisionDelay, /* I
*/ |
340 int arch /* I
*/ | 345 int arch /* I
*/ |
341 ) | 346 ) |
342 { | 347 { |
343 opus_int i, j, k, Winner_ind, RDmin_ind, RDmax_ind, last_smple_idx; | 348 opus_int i, j, k, Winner_ind, RDmin_ind, RDmax_ind, last_smple_idx; |
344 opus_int32 Winner_rand_state; | 349 opus_int32 Winner_rand_state; |
345 opus_int32 LTP_pred_Q14, LPC_pred_Q14, n_AR_Q14, n_LTP_Q14; | 350 opus_int32 LTP_pred_Q14, LPC_pred_Q14, n_AR_Q14, n_LTP_Q14; |
346 opus_int32 n_LF_Q14, r_Q10, rr_Q10, rd1_Q10, rd2_Q10, RDmin_Q10, RDmax_Q10
; | 351 opus_int32 n_LF_Q14, r_Q10, rr_Q10, rd1_Q10, rd2_Q10, RDmin_Q10, RDmax_Q10
; |
347 opus_int32 q1_Q0, q1_Q10, q2_Q10, exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10; | 352 opus_int32 q1_Q0, q1_Q10, q2_Q10, exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10; |
348 opus_int32 tmp1, tmp2, sLF_AR_shp_Q14; | 353 opus_int32 tmp1, tmp2, sLF_AR_shp_Q14; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 | 414 |
410 /* Pointer used in short term prediction and shaping */ | 415 /* Pointer used in short term prediction and shaping */ |
411 psLPC_Q14 = &psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 + i ]; | 416 psLPC_Q14 = &psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 + i ]; |
412 /* Short-term prediction */ | 417 /* Short-term prediction */ |
413 LPC_pred_Q14 = silk_noise_shape_quantizer_short_prediction(psLPC_Q14
, a_Q12, a_Q12_arch, predictLPCOrder, arch); | 418 LPC_pred_Q14 = silk_noise_shape_quantizer_short_prediction(psLPC_Q14
, a_Q12, a_Q12_arch, predictLPCOrder, arch); |
414 LPC_pred_Q14 = silk_LSHIFT( LPC_pred_Q14, 4 );
/* Q10 -> Q14 */ | 419 LPC_pred_Q14 = silk_LSHIFT( LPC_pred_Q14, 4 );
/* Q10 -> Q14 */ |
415 | 420 |
416 /* Noise shape feedback */ | 421 /* Noise shape feedback */ |
417 silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order i
s even */ | 422 silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order i
s even */ |
418 /* Output of lowpass section */ | 423 /* Output of lowpass section */ |
419 tmp2 = silk_SMLAWB( psLPC_Q14[ 0 ], psDD->sAR2_Q14[ 0 ], warping_Q16
); | 424 tmp2 = silk_SMLAWB( psDD->Diff_Q14, psDD->sAR2_Q14[ 0 ], warping_Q16
); |
420 /* Output of allpass section */ | 425 /* Output of allpass section */ |
421 tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ 0 ], psDD->sAR2_Q14[ 1 ] - tmp2,
warping_Q16 ); | 426 tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ 0 ], psDD->sAR2_Q14[ 1 ] - tmp2,
warping_Q16 ); |
422 psDD->sAR2_Q14[ 0 ] = tmp2; | 427 psDD->sAR2_Q14[ 0 ] = tmp2; |
423 n_AR_Q14 = silk_RSHIFT( shapingLPCOrder, 1 ); | 428 n_AR_Q14 = silk_RSHIFT( shapingLPCOrder, 1 ); |
424 n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp2, AR_shp_Q13[ 0 ] ); | 429 n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp2, AR_shp_Q13[ 0 ] ); |
425 /* Loop over allpass sections */ | 430 /* Loop over allpass sections */ |
426 for( j = 2; j < shapingLPCOrder; j += 2 ) { | 431 for( j = 2; j < shapingLPCOrder; j += 2 ) { |
427 /* Output of allpass section */ | 432 /* Output of allpass section */ |
428 tmp2 = silk_SMLAWB( psDD->sAR2_Q14[ j - 1 ], psDD->sAR2_Q14[ j +
0 ] - tmp1, warping_Q16 ); | 433 tmp2 = silk_SMLAWB( psDD->sAR2_Q14[ j - 1 ], psDD->sAR2_Q14[ j +
0 ] - tmp1, warping_Q16 ); |
429 psDD->sAR2_Q14[ j - 1 ] = tmp1; | 434 psDD->sAR2_Q14[ j - 1 ] = tmp1; |
(...skipping 25 matching lines...) Expand all Loading... |
455 | 460 |
456 /* Flip sign depending on dither */ | 461 /* Flip sign depending on dither */ |
457 if ( psDD->Seed < 0 ) { | 462 if ( psDD->Seed < 0 ) { |
458 r_Q10 = -r_Q10; | 463 r_Q10 = -r_Q10; |
459 } | 464 } |
460 r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 ); | 465 r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 ); |
461 | 466 |
462 /* Find two quantization level candidates and measure their rate-dis
tortion */ | 467 /* Find two quantization level candidates and measure their rate-dis
tortion */ |
463 q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); | 468 q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); |
464 q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); | 469 q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); |
| 470 if (Lambda_Q10 > 2048) { |
| 471 /* For aggressive RDO, the bias becomes more than one pulse. */ |
| 472 int rdo_offset = Lambda_Q10/2 - 512; |
| 473 if (q1_Q10 > rdo_offset) { |
| 474 q1_Q0 = silk_RSHIFT( q1_Q10 - rdo_offset, 10 ); |
| 475 } else if (q1_Q10 < -rdo_offset) { |
| 476 q1_Q0 = silk_RSHIFT( q1_Q10 + rdo_offset, 10 ); |
| 477 } else if (q1_Q10 < 0) { |
| 478 q1_Q0 = -1; |
| 479 } else { |
| 480 q1_Q0 = 0; |
| 481 } |
| 482 } |
465 if( q1_Q0 > 0 ) { | 483 if( q1_Q0 > 0 ) { |
466 q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJU
ST_Q10 ); | 484 q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJU
ST_Q10 ); |
467 q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); | 485 q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); |
468 q2_Q10 = silk_ADD32( q1_Q10, 1024 ); | 486 q2_Q10 = silk_ADD32( q1_Q10, 1024 ); |
469 rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 ); | 487 rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 ); |
470 rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 ); | 488 rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 ); |
471 } else if( q1_Q0 == 0 ) { | 489 } else if( q1_Q0 == 0 ) { |
472 q1_Q10 = offset_Q10; | 490 q1_Q10 = offset_Q10; |
473 q2_Q10 = silk_ADD32( q1_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 ); | 491 q2_Q10 = silk_ADD32( q1_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 ); |
474 rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 ); | 492 rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 ); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 exc_Q14 = silk_LSHIFT32( psSS[ 0 ].Q_Q10, 4 ); | 526 exc_Q14 = silk_LSHIFT32( psSS[ 0 ].Q_Q10, 4 ); |
509 if ( psDD->Seed < 0 ) { | 527 if ( psDD->Seed < 0 ) { |
510 exc_Q14 = -exc_Q14; | 528 exc_Q14 = -exc_Q14; |
511 } | 529 } |
512 | 530 |
513 /* Add predictions */ | 531 /* Add predictions */ |
514 LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 ); | 532 LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 ); |
515 xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 ); | 533 xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 ); |
516 | 534 |
517 /* Update states */ | 535 /* Update states */ |
518 sLF_AR_shp_Q14 = silk_SUB32( xq_Q14, n_AR_Q14 ); | 536 psSS[ 0 ].Diff_Q14 = silk_SUB_LSHIFT32( xq_Q14, x_Q10[ i ], 4 ); |
| 537 sLF_AR_shp_Q14 = silk_SUB32( psSS[ 0 ].Diff_Q14, n_AR_Q14 ); |
519 psSS[ 0 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 ); | 538 psSS[ 0 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 ); |
520 psSS[ 0 ].LF_AR_Q14 = sLF_AR_shp_Q14; | 539 psSS[ 0 ].LF_AR_Q14 = sLF_AR_shp_Q14; |
521 psSS[ 0 ].LPC_exc_Q14 = LPC_exc_Q14; | 540 psSS[ 0 ].LPC_exc_Q14 = LPC_exc_Q14; |
522 psSS[ 0 ].xq_Q14 = xq_Q14; | 541 psSS[ 0 ].xq_Q14 = xq_Q14; |
523 | 542 |
524 /* Update states for second best quantization */ | 543 /* Update states for second best quantization */ |
525 | 544 |
526 /* Quantized excitation */ | 545 /* Quantized excitation */ |
527 exc_Q14 = silk_LSHIFT32( psSS[ 1 ].Q_Q10, 4 ); | 546 exc_Q14 = silk_LSHIFT32( psSS[ 1 ].Q_Q10, 4 ); |
528 if ( psDD->Seed < 0 ) { | 547 if ( psDD->Seed < 0 ) { |
529 exc_Q14 = -exc_Q14; | 548 exc_Q14 = -exc_Q14; |
530 } | 549 } |
531 | 550 |
532 | |
533 /* Add predictions */ | 551 /* Add predictions */ |
534 LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 ); | 552 LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 ); |
535 xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 ); | 553 xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 ); |
536 | 554 |
537 /* Update states */ | 555 /* Update states */ |
538 sLF_AR_shp_Q14 = silk_SUB32( xq_Q14, n_AR_Q14 ); | 556 psSS[ 1 ].Diff_Q14 = silk_SUB_LSHIFT32( xq_Q14, x_Q10[ i ], 4 ); |
| 557 sLF_AR_shp_Q14 = silk_SUB32( psSS[ 1 ].Diff_Q14, n_AR_Q14 ); |
539 psSS[ 1 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 ); | 558 psSS[ 1 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 ); |
540 psSS[ 1 ].LF_AR_Q14 = sLF_AR_shp_Q14; | 559 psSS[ 1 ].LF_AR_Q14 = sLF_AR_shp_Q14; |
541 psSS[ 1 ].LPC_exc_Q14 = LPC_exc_Q14; | 560 psSS[ 1 ].LPC_exc_Q14 = LPC_exc_Q14; |
542 psSS[ 1 ].xq_Q14 = xq_Q14; | 561 psSS[ 1 ].xq_Q14 = xq_Q14; |
543 } | 562 } |
544 | 563 |
545 *smpl_buf_idx = ( *smpl_buf_idx - 1 ) & DECISION_DELAY_MASK;
/* Index to newest samples */ | 564 *smpl_buf_idx = ( *smpl_buf_idx - 1 ) % DECISION_DELAY; |
546 last_smple_idx = ( *smpl_buf_idx + decisionDelay ) & DECISION_DELAY_MASK
; /* Index to decisionDelay old samples */ | 565 if( *smpl_buf_idx < 0 ) *smpl_buf_idx += DECISION_DELAY; |
| 566 last_smple_idx = ( *smpl_buf_idx + decisionDelay ) % DECISION_DELAY; |
547 | 567 |
548 /* Find winner */ | 568 /* Find winner */ |
549 RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10; | 569 RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10; |
550 Winner_ind = 0; | 570 Winner_ind = 0; |
551 for( k = 1; k < nStatesDelayedDecision; k++ ) { | 571 for( k = 1; k < nStatesDelayedDecision; k++ ) { |
552 if( psSampleState[ k ][ 0 ].RD_Q10 < RDmin_Q10 ) { | 572 if( psSampleState[ k ][ 0 ].RD_Q10 < RDmin_Q10 ) { |
553 RDmin_Q10 = psSampleState[ k ][ 0 ].RD_Q10; | 573 RDmin_Q10 = psSampleState[ k ][ 0 ].RD_Q10; |
554 Winner_ind = k; | 574 Winner_ind = k; |
555 } | 575 } |
556 } | 576 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
600 sLTP_Q15[ NSQ->sLTP_buf_idx - decisionDelay ] = psDD->P
red_Q15[ last_smple_idx ]; | 620 sLTP_Q15[ NSQ->sLTP_buf_idx - decisionDelay ] = psDD->P
red_Q15[ last_smple_idx ]; |
601 } | 621 } |
602 NSQ->sLTP_shp_buf_idx++; | 622 NSQ->sLTP_shp_buf_idx++; |
603 NSQ->sLTP_buf_idx++; | 623 NSQ->sLTP_buf_idx++; |
604 | 624 |
605 /* Update states */ | 625 /* Update states */ |
606 for( k = 0; k < nStatesDelayedDecision; k++ ) { | 626 for( k = 0; k < nStatesDelayedDecision; k++ ) { |
607 psDD = &psDelDec[ k ]; | 627 psDD = &psDelDec[ k ]; |
608 psSS = &psSampleState[ k ][ 0 ]; | 628 psSS = &psSampleState[ k ][ 0 ]; |
609 psDD->LF_AR_Q14 = psSS->LF_AR_Q14; | 629 psDD->LF_AR_Q14 = psSS->LF_AR_Q14; |
| 630 psDD->Diff_Q14 = psSS->Diff_Q14; |
610 psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ] = psSS->xq_Q14; | 631 psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ] = psSS->xq_Q14; |
611 psDD->Xq_Q14[ *smpl_buf_idx ] = psSS->xq_Q14; | 632 psDD->Xq_Q14[ *smpl_buf_idx ] = psSS->xq_Q14; |
612 psDD->Q_Q10[ *smpl_buf_idx ] = psSS->Q_Q10; | 633 psDD->Q_Q10[ *smpl_buf_idx ] = psSS->Q_Q10; |
613 psDD->Pred_Q15[ *smpl_buf_idx ] = silk_LSHIFT32( psSS->LPC_
exc_Q14, 1 ); | 634 psDD->Pred_Q15[ *smpl_buf_idx ] = silk_LSHIFT32( psSS->LPC_
exc_Q14, 1 ); |
614 psDD->Shape_Q14[ *smpl_buf_idx ] = psSS->sLTP_shp_Q14; | 635 psDD->Shape_Q14[ *smpl_buf_idx ] = psSS->sLTP_shp_Q14; |
615 psDD->Seed = silk_ADD32_ovflw( psDD->S
eed, silk_RSHIFT_ROUND( psSS->Q_Q10, 10 ) ); | 636 psDD->Seed = silk_ADD32_ovflw( psDD->S
eed, silk_RSHIFT_ROUND( psSS->Q_Q10, 10 ) ); |
616 psDD->RandState[ *smpl_buf_idx ] = psDD->Seed; | 637 psDD->RandState[ *smpl_buf_idx ] = psDD->Seed; |
617 psDD->RD_Q10 = psSS->RD_Q10; | 638 psDD->RD_Q10 = psSS->RD_Q10; |
618 } | 639 } |
619 delayedGain_Q10[ *smpl_buf_idx ] = Gain_Q10; | 640 delayedGain_Q10[ *smpl_buf_idx ] = Gain_Q10; |
620 } | 641 } |
621 /* Update LPC states */ | 642 /* Update LPC states */ |
622 for( k = 0; k < nStatesDelayedDecision; k++ ) { | 643 for( k = 0; k < nStatesDelayedDecision; k++ ) { |
623 psDD = &psDelDec[ k ]; | 644 psDD = &psDelDec[ k ]; |
624 silk_memcpy( psDD->sLPC_Q14, &psDD->sLPC_Q14[ length ], NSQ_LPC_BUF_LENG
TH * sizeof( opus_int32 ) ); | 645 silk_memcpy( psDD->sLPC_Q14, &psDD->sLPC_Q14[ length ], NSQ_LPC_BUF_LENG
TH * sizeof( opus_int32 ) ); |
625 } | 646 } |
626 RESTORE_STACK; | 647 RESTORE_STACK; |
627 } | 648 } |
628 #endif /* OVERRIDE_silk_noise_shape_quantizer_del_dec */ | 649 #endif /* OVERRIDE_silk_noise_shape_quantizer_del_dec */ |
629 | 650 |
630 static OPUS_INLINE void silk_nsq_del_dec_scale_states( | 651 static OPUS_INLINE void silk_nsq_del_dec_scale_states( |
631 const silk_encoder_state *psEncC, /* I Encoder State
*/ | 652 const silk_encoder_state *psEncC, /* I Encoder State
*/ |
632 silk_nsq_state *NSQ, /* I/O NSQ state
*/ | 653 silk_nsq_state *NSQ, /* I/O NSQ state
*/ |
633 NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision sta
tes */ | 654 NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision sta
tes */ |
634 const opus_int32 x_Q3[], /* I Input in Q3
*/ | 655 const opus_int16 x16[], /* I Input
*/ |
635 opus_int32 x_sc_Q10[], /* O Input scaled with 1/
Gain in Q10 */ | 656 opus_int32 x_sc_Q10[], /* O Input scaled with 1/
Gain in Q10 */ |
636 const opus_int16 sLTP[], /* I Re-whitened LTP stat
e in Q0 */ | 657 const opus_int16 sLTP[], /* I Re-whitened LTP stat
e in Q0 */ |
637 opus_int32 sLTP_Q15[], /* O LTP state matching s
caled input */ | 658 opus_int32 sLTP_Q15[], /* O LTP state matching s
caled input */ |
638 opus_int subfr, /* I Subframe number
*/ | 659 opus_int subfr, /* I Subframe number
*/ |
639 opus_int nStatesDelayedDecision, /* I Number of del dec st
ates */ | 660 opus_int nStatesDelayedDecision, /* I Number of del dec st
ates */ |
640 const opus_int LTP_scale_Q14, /* I LTP state scaling
*/ | 661 const opus_int LTP_scale_Q14, /* I LTP state scaling
*/ |
641 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I
*/ | 662 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I
*/ |
642 const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag
*/ | 663 const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag
*/ |
643 const opus_int signal_type, /* I Signal type
*/ | 664 const opus_int signal_type, /* I Signal type
*/ |
644 const opus_int decisionDelay /* I Decision delay
*/ | 665 const opus_int decisionDelay /* I Decision delay
*/ |
645 ) | 666 ) |
646 { | 667 { |
647 opus_int i, k, lag; | 668 opus_int i, k, lag; |
648 opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q23; | 669 opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q26; |
649 NSQ_del_dec_struct *psDD; | 670 NSQ_del_dec_struct *psDD; |
650 | 671 |
651 lag = pitchL[ subfr ]; | 672 lag = pitchL[ subfr ]; |
652 inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); | 673 inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); |
653 silk_assert( inv_gain_Q31 != 0 ); | 674 silk_assert( inv_gain_Q31 != 0 ); |
654 | 675 |
655 /* Calculate gain adjustment factor */ | 676 /* Scale input */ |
656 if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { | 677 inv_gain_Q26 = silk_RSHIFT_ROUND( inv_gain_Q31, 5 ); |
657 gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ],
16 ); | 678 for( i = 0; i < psEncC->subfr_length; i++ ) { |
658 } else { | 679 x_sc_Q10[ i ] = silk_SMULWW( x16[ i ], inv_gain_Q26 ); |
659 gain_adj_Q16 = (opus_int32)1 << 16; | |
660 } | 680 } |
661 | 681 |
662 /* Scale input */ | |
663 inv_gain_Q23 = silk_RSHIFT_ROUND( inv_gain_Q31, 8 ); | |
664 for( i = 0; i < psEncC->subfr_length; i++ ) { | |
665 x_sc_Q10[ i ] = silk_SMULWW( x_Q3[ i ], inv_gain_Q23 ); | |
666 } | |
667 | |
668 /* Save inverse gain */ | |
669 NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; | |
670 | |
671 /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16
*/ | 682 /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16
*/ |
672 if( NSQ->rewhite_flag ) { | 683 if( NSQ->rewhite_flag ) { |
673 if( subfr == 0 ) { | 684 if( subfr == 0 ) { |
674 /* Do LTP downscaling */ | 685 /* Do LTP downscaling */ |
675 inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14
), 2 ); | 686 inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14
), 2 ); |
676 } | 687 } |
677 for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx;
i++ ) { | 688 for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx;
i++ ) { |
678 silk_assert( i < MAX_FRAME_LENGTH ); | 689 silk_assert( i < MAX_FRAME_LENGTH ); |
679 sLTP_Q15[ i ] = silk_SMULWB( inv_gain_Q31, sLTP[ i ] ); | 690 sLTP_Q15[ i ] = silk_SMULWB( inv_gain_Q31, sLTP[ i ] ); |
680 } | 691 } |
681 } | 692 } |
682 | 693 |
683 /* Adjust for changing gain */ | 694 /* Adjust for changing gain */ |
684 if( gain_adj_Q16 != (opus_int32)1 << 16 ) { | 695 if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { |
| 696 gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ],
16 ); |
| 697 |
685 /* Scale long-term shaping state */ | 698 /* Scale long-term shaping state */ |
686 for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_s
hp_buf_idx; i++ ) { | 699 for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_s
hp_buf_idx; i++ ) { |
687 NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q1
4[ i ] ); | 700 NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q1
4[ i ] ); |
688 } | 701 } |
689 | 702 |
690 /* Scale long-term prediction state */ | 703 /* Scale long-term prediction state */ |
691 if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) { | 704 if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) { |
692 for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_
idx - decisionDelay; i++ ) { | 705 for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_
idx - decisionDelay; i++ ) { |
693 sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] ); | 706 sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] ); |
694 } | 707 } |
695 } | 708 } |
696 | 709 |
697 for( k = 0; k < nStatesDelayedDecision; k++ ) { | 710 for( k = 0; k < nStatesDelayedDecision; k++ ) { |
698 psDD = &psDelDec[ k ]; | 711 psDD = &psDelDec[ k ]; |
699 | 712 |
700 /* Scale scalar states */ | 713 /* Scale scalar states */ |
701 psDD->LF_AR_Q14 = silk_SMULWW( gain_adj_Q16, psDD->LF_AR_Q14 ); | 714 psDD->LF_AR_Q14 = silk_SMULWW( gain_adj_Q16, psDD->LF_AR_Q14 ); |
| 715 psDD->Diff_Q14 = silk_SMULWW( gain_adj_Q16, psDD->Diff_Q14 ); |
702 | 716 |
703 /* Scale short-term prediction and shaping states */ | 717 /* Scale short-term prediction and shaping states */ |
704 for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { | 718 for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { |
705 psDD->sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->sLPC_Q14[
i ] ); | 719 psDD->sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->sLPC_Q14[
i ] ); |
706 } | 720 } |
707 for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { | 721 for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { |
708 psDD->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->sAR2_Q14[
i ] ); | 722 psDD->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->sAR2_Q14[
i ] ); |
709 } | 723 } |
710 for( i = 0; i < DECISION_DELAY; i++ ) { | 724 for( i = 0; i < DECISION_DELAY; i++ ) { |
711 psDD->Pred_Q15[ i ] = silk_SMULWW( gain_adj_Q16, psDD->Pred_Q15
[ i ] ); | 725 psDD->Pred_Q15[ i ] = silk_SMULWW( gain_adj_Q16, psDD->Pred_Q15
[ i ] ); |
712 psDD->Shape_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->Shape_Q1
4[ i ] ); | 726 psDD->Shape_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->Shape_Q1
4[ i ] ); |
713 } | 727 } |
714 } | 728 } |
| 729 |
| 730 /* Save inverse gain */ |
| 731 NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; |
715 } | 732 } |
716 } | 733 } |
OLD | NEW |