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 19 matching lines...) Expand all Loading... |
30 #endif | 30 #endif |
31 | 31 |
32 #include "main.h" | 32 #include "main.h" |
33 #include "stack_alloc.h" | 33 #include "stack_alloc.h" |
34 #include "NSQ.h" | 34 #include "NSQ.h" |
35 | 35 |
36 | 36 |
37 static OPUS_INLINE void silk_nsq_scale_states( | 37 static OPUS_INLINE void silk_nsq_scale_states( |
38 const silk_encoder_state *psEncC, /* I Encoder State
*/ | 38 const silk_encoder_state *psEncC, /* I Encoder State
*/ |
39 silk_nsq_state *NSQ, /* I/O NSQ state
*/ | 39 silk_nsq_state *NSQ, /* I/O NSQ state
*/ |
40 const opus_int32 x_Q3[], /* I input in Q3
*/ | 40 const opus_int16 x16[], /* I input
*/ |
41 opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain
*/ | 41 opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain
*/ |
42 const opus_int16 sLTP[], /* I re-whitened LTP state in
Q0 */ | 42 const opus_int16 sLTP[], /* I re-whitened LTP state in
Q0 */ |
43 opus_int32 sLTP_Q15[], /* O LTP state matching scale
d input */ | 43 opus_int32 sLTP_Q15[], /* O LTP state matching scale
d input */ |
44 opus_int subfr, /* I subframe number
*/ | 44 opus_int subfr, /* I subframe number
*/ |
45 const opus_int LTP_scale_Q14, /* I
*/ | 45 const opus_int LTP_scale_Q14, /* I
*/ |
46 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I
*/ | 46 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I
*/ |
47 const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag
*/ | 47 const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag
*/ |
48 const opus_int signal_type /* I Signal type
*/ | 48 const opus_int signal_type /* I Signal type
*/ |
49 ); | 49 ); |
50 | 50 |
(...skipping 17 matching lines...) Expand all Loading... |
68 opus_int offset_Q10, /* I
*/ | 68 opus_int offset_Q10, /* I
*/ |
69 opus_int length, /* I Input length
*/ | 69 opus_int length, /* I Input length
*/ |
70 opus_int shapingLPCOrder, /* I Noise shaping AR filter
order */ | 70 opus_int shapingLPCOrder, /* I Noise shaping AR filter
order */ |
71 opus_int predictLPCOrder, /* I Prediction filter order
*/ | 71 opus_int predictLPCOrder, /* I Prediction filter order
*/ |
72 int arch /* I Architecture
*/ | 72 int arch /* I Architecture
*/ |
73 ); | 73 ); |
74 #endif | 74 #endif |
75 | 75 |
76 void silk_NSQ_c | 76 void silk_NSQ_c |
77 ( | 77 ( |
78 const silk_encoder_state *psEncC, /* I
/O Encoder State */ | 78 const silk_encoder_state *psEncC, /* I
Encoder State */ |
79 silk_nsq_state *NSQ, /* I
/O NSQ state */ | 79 silk_nsq_state *NSQ, /* I
/O NSQ state */ |
80 SideInfoIndices *psIndices, /* I
/O Quantization Indices */ | 80 SideInfoIndices *psIndices, /* I
/O Quantization Indices */ |
81 const opus_int32 x_Q3[], /* I
Prefiltered input signal */ | 81 const opus_int16 x16[], /*
I Input */ |
82 opus_int8 pulses[], /* O
Quantized pulse signal */ | 82 opus_int8 pulses[], /* O
Quantized pulse signal */ |
83 const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I
Short term prediction coefs */ | 83 const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I
Short term prediction coefs */ |
84 const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I
Long term prediction coefs */ | 84 const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I
Long term prediction coefs */ |
85 const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /
* I Noise shaping coefs */ | 85 const opus_int16 AR_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /*
I Noise shaping coefs */ |
86 const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I
Long term shaping coefs */ | 86 const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I
Long term shaping coefs */ |
87 const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I
Spectral tilt */ | 87 const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I
Spectral tilt */ |
88 const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I
Low frequency shaping coefs */ | 88 const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I
Low frequency shaping coefs */ |
89 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I
Quantization step sizes */ | 89 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I
Quantization step sizes */ |
90 const opus_int pitchL[ MAX_NB_SUBFR ], /* I
Pitch lags */ | 90 const opus_int pitchL[ MAX_NB_SUBFR ], /* I
Pitch lags */ |
91 const opus_int Lambda_Q10, /* I
Rate/distortion tradeoff */ | 91 const opus_int Lambda_Q10, /* I
Rate/distortion tradeoff */ |
92 const opus_int LTP_scale_Q14 /* I
LTP state scaling */ | 92 const opus_int LTP_scale_Q14 /* I
LTP state scaling */ |
93 ) | 93 ) |
94 { | 94 { |
95 opus_int k, lag, start_idx, LSF_interpolation_flag; | 95 opus_int k, lag, start_idx, LSF_interpolation_flag; |
(...skipping 14 matching lines...) Expand all Loading... |
110 silk_assert( NSQ->prev_gain_Q16 != 0 ); | 110 silk_assert( NSQ->prev_gain_Q16 != 0 ); |
111 | 111 |
112 offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ ps
Indices->quantOffsetType ]; | 112 offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ ps
Indices->quantOffsetType ]; |
113 | 113 |
114 if( psIndices->NLSFInterpCoef_Q2 == 4 ) { | 114 if( psIndices->NLSFInterpCoef_Q2 == 4 ) { |
115 LSF_interpolation_flag = 0; | 115 LSF_interpolation_flag = 0; |
116 } else { | 116 } else { |
117 LSF_interpolation_flag = 1; | 117 LSF_interpolation_flag = 1; |
118 } | 118 } |
119 | 119 |
120 ALLOC( sLTP_Q15, | 120 ALLOC( sLTP_Q15, psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 )
; |
121 psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 ); | |
122 ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); | 121 ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 ); |
123 ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); | 122 ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 ); |
124 /* Set up pointers to start of sub frame */ | 123 /* Set up pointers to start of sub frame */ |
125 NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length; | 124 NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length; |
126 NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; | 125 NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; |
127 pxq = &NSQ->xq[ psEncC->ltp_mem_length ]; | 126 pxq = &NSQ->xq[ psEncC->ltp_mem_length ]; |
128 for( k = 0; k < psEncC->nb_subfr; k++ ) { | 127 for( k = 0; k < psEncC->nb_subfr; k++ ) { |
129 A_Q12 = &PredCoef_Q12[ (( k >> 1 ) | ( 1 - LSF_interpolation_flag )
) * MAX_LPC_ORDER ]; | 128 A_Q12 = &PredCoef_Q12[ (( k >> 1 ) | ( 1 - LSF_interpolation_flag )
) * MAX_LPC_ORDER ]; |
130 B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; | 129 B_Q14 = <PCoef_Q14[ k * LTP_ORDER ]; |
131 AR_shp_Q13 = &AR2_Q13[ k * MAX_SHAPE_LPC_ORDER ]; | 130 AR_shp_Q13 = &AR_Q13[ k * MAX_SHAPE_LPC_ORDER ]; |
132 | 131 |
133 /* Noise shape parameters */ | 132 /* Noise shape parameters */ |
134 silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); | 133 silk_assert( HarmShapeGain_Q14[ k ] >= 0 ); |
135 HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShap
eGain_Q14[ k ], 2 ); | 134 HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShap
eGain_Q14[ k ], 2 ); |
136 HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShap
eGain_Q14[ k ], 1 ), 16 ); | 135 HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShap
eGain_Q14[ k ], 1 ), 16 ); |
137 | 136 |
138 NSQ->rewhite_flag = 0; | 137 NSQ->rewhite_flag = 0; |
139 if( psIndices->signalType == TYPE_VOICED ) { | 138 if( psIndices->signalType == TYPE_VOICED ) { |
140 /* Voiced */ | 139 /* Voiced */ |
141 lag = pitchL[ k ]; | 140 lag = pitchL[ k ]; |
142 | 141 |
143 /* Re-whitening */ | 142 /* Re-whitening */ |
144 if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 )
{ | 143 if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 )
{ |
145 /* Rewhiten with new A coefs */ | 144 /* Rewhiten with new A coefs */ |
146 start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrd
er - LTP_ORDER / 2; | 145 start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrd
er - LTP_ORDER / 2; |
147 silk_assert( start_idx > 0 ); | 146 silk_assert( start_idx > 0 ); |
148 | 147 |
149 silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_id
x + k * psEncC->subfr_length ], | 148 silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_id
x + k * psEncC->subfr_length ], |
150 A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLP
COrder, psEncC->arch ); | 149 A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLP
COrder, psEncC->arch ); |
151 | 150 |
152 NSQ->rewhite_flag = 1; | 151 NSQ->rewhite_flag = 1; |
153 NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; | 152 NSQ->sLTP_buf_idx = psEncC->ltp_mem_length; |
154 } | 153 } |
155 } | 154 } |
156 | 155 |
157 silk_nsq_scale_states( psEncC, NSQ, x_Q3, x_sc_Q10, sLTP, sLTP_Q15, k, L
TP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType ); | 156 silk_nsq_scale_states( psEncC, NSQ, x16, x_sc_Q10, sLTP, sLTP_Q15, k, LT
P_scale_Q14, Gains_Q16, pitchL, psIndices->signalType ); |
158 | 157 |
159 silk_noise_shape_quantizer( NSQ, psIndices->signalType, x_sc_Q10, pulses
, pxq, sLTP_Q15, A_Q12, B_Q14, | 158 silk_noise_shape_quantizer( NSQ, psIndices->signalType, x_sc_Q10, pulses
, pxq, sLTP_Q15, A_Q12, B_Q14, |
160 AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[
k ], Gains_Q16[ k ], Lambda_Q10, | 159 AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[
k ], Gains_Q16[ k ], Lambda_Q10, |
161 offset_Q10, psEncC->subfr_length, psEncC->shapingLPCOrder, psEncC->p
redictLPCOrder, psEncC->arch ); | 160 offset_Q10, psEncC->subfr_length, psEncC->shapingLPCOrder, psEncC->p
redictLPCOrder, psEncC->arch ); |
162 | 161 |
163 x_Q3 += psEncC->subfr_length; | 162 x16 += psEncC->subfr_length; |
164 pulses += psEncC->subfr_length; | 163 pulses += psEncC->subfr_length; |
165 pxq += psEncC->subfr_length; | 164 pxq += psEncC->subfr_length; |
166 } | 165 } |
167 | 166 |
168 /* Update lagPrev for next frame */ | 167 /* Update lagPrev for next frame */ |
169 NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; | 168 NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ]; |
170 | 169 |
171 /* Save quantized speech and noise shaping signals */ | 170 /* Save quantized speech and noise shaping signals */ |
172 /* DEBUG_STORE_DATA( enc.pcm, &NSQ->xq[ psEncC->ltp_mem_length ], psEncC->fr
ame_length * sizeof( opus_int16 ) ) */ | |
173 silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ],
psEncC->ltp_mem_length * sizeof( opus_int16 ) ); | 171 silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ],
psEncC->ltp_mem_length * sizeof( opus_int16 ) ); |
174 silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ],
psEncC->ltp_mem_length * sizeof( opus_int32 ) ); | 172 silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ],
psEncC->ltp_mem_length * sizeof( opus_int32 ) ); |
175 RESTORE_STACK; | 173 RESTORE_STACK; |
176 } | 174 } |
177 | 175 |
178 /***********************************/ | 176 /***********************************/ |
179 /* silk_noise_shape_quantizer */ | 177 /* silk_noise_shape_quantizer */ |
180 /***********************************/ | 178 /***********************************/ |
181 | 179 |
182 #if !defined(OPUS_X86_MAY_HAVE_SSE4_1) | 180 #if !defined(OPUS_X86_MAY_HAVE_SSE4_1) |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -2 ], b_Q14[
2 ] ); | 241 LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -2 ], b_Q14[
2 ] ); |
244 LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -3 ], b_Q14[
3 ] ); | 242 LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -3 ], b_Q14[
3 ] ); |
245 LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -4 ], b_Q14[
4 ] ); | 243 LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -4 ], b_Q14[
4 ] ); |
246 pred_lag_ptr++; | 244 pred_lag_ptr++; |
247 } else { | 245 } else { |
248 LTP_pred_Q13 = 0; | 246 LTP_pred_Q13 = 0; |
249 } | 247 } |
250 | 248 |
251 /* Noise shape feedback */ | 249 /* Noise shape feedback */ |
252 silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is ev
en */ | 250 silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is ev
en */ |
253 n_AR_Q12 = silk_NSQ_noise_shape_feedback_loop(psLPC_Q14, NSQ->sAR2_Q14,
AR_shp_Q13, shapingLPCOrder, arch); | 251 n_AR_Q12 = silk_NSQ_noise_shape_feedback_loop(&NSQ->sDiff_shp_Q14, NSQ->
sAR2_Q14, AR_shp_Q13, shapingLPCOrder, arch); |
254 | 252 |
255 n_AR_Q12 = silk_SMLAWB( n_AR_Q12, NSQ->sLF_AR_shp_Q14, Tilt_Q14 ); | 253 n_AR_Q12 = silk_SMLAWB( n_AR_Q12, NSQ->sLF_AR_shp_Q14, Tilt_Q14 ); |
256 | 254 |
257 n_LF_Q12 = silk_SMULWB( NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - 1 ],
LF_shp_Q14 ); | 255 n_LF_Q12 = silk_SMULWB( NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - 1 ],
LF_shp_Q14 ); |
258 n_LF_Q12 = silk_SMLAWT( n_LF_Q12, NSQ->sLF_AR_shp_Q14, LF_shp_Q14 ); | 256 n_LF_Q12 = silk_SMLAWT( n_LF_Q12, NSQ->sLF_AR_shp_Q14, LF_shp_Q14 ); |
259 | 257 |
260 silk_assert( lag > 0 || signalType != TYPE_VOICED ); | 258 silk_assert( lag > 0 || signalType != TYPE_VOICED ); |
261 | 259 |
262 /* Combine prediction and noise shaping signals */ | 260 /* Combine prediction and noise shaping signals */ |
263 tmp1 = silk_SUB32( silk_LSHIFT32( LPC_pred_Q10, 2 ), n_AR_Q12 );
/* Q12 */ | 261 tmp1 = silk_SUB32( silk_LSHIFT32( LPC_pred_Q10, 2 ), n_AR_Q12 );
/* Q12 */ |
264 tmp1 = silk_SUB32( tmp1, n_LF_Q12 );
/* Q12 */ | 262 tmp1 = silk_SUB32( tmp1, n_LF_Q12 );
/* Q12 */ |
265 if( lag > 0 ) { | 263 if( lag > 0 ) { |
266 /* Symmetric, packed FIR coefficients */ | 264 /* Symmetric, packed FIR coefficients */ |
267 n_LTP_Q13 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[
-2 ] ), HarmShapeFIRPacked_Q14 ); | 265 n_LTP_Q13 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[
-2 ] ), HarmShapeFIRPacked_Q14 ); |
268 n_LTP_Q13 = silk_SMLAWT( n_LTP_Q13, shp_lag_ptr[ -1 ],
HarmShapeFIRPacked_Q14 ); | 266 n_LTP_Q13 = silk_SMLAWT( n_LTP_Q13, shp_lag_ptr[ -1 ],
HarmShapeFIRPacked_Q14 ); |
269 n_LTP_Q13 = silk_LSHIFT( n_LTP_Q13, 1 ); | 267 n_LTP_Q13 = silk_LSHIFT( n_LTP_Q13, 1 ); |
270 shp_lag_ptr++; | 268 shp_lag_ptr++; |
271 | 269 |
272 tmp2 = silk_SUB32( LTP_pred_Q13, n_LTP_Q13 );
/* Q13 */ | 270 tmp2 = silk_SUB32( LTP_pred_Q13, n_LTP_Q13 );
/* Q13 */ |
273 tmp1 = silk_ADD_LSHIFT32( tmp2, tmp1, 1 );
/* Q13 */ | 271 tmp1 = silk_ADD_LSHIFT32( tmp2, tmp1, 1 );
/* Q13 */ |
274 tmp1 = silk_RSHIFT_ROUND( tmp1, 3 );
/* Q10 */ | 272 tmp1 = silk_RSHIFT_ROUND( tmp1, 3 );
/* Q10 */ |
275 } else { | 273 } else { |
276 tmp1 = silk_RSHIFT_ROUND( tmp1, 2 );
/* Q10 */ | 274 tmp1 = silk_RSHIFT_ROUND( tmp1, 2 );
/* Q10 */ |
277 } | 275 } |
278 | 276 |
279 r_Q10 = silk_SUB32( x_sc_Q10[ i ], tmp1 );
/* residual error Q10 */ | 277 r_Q10 = silk_SUB32( x_sc_Q10[ i ], tmp1 );
/* residual error Q10 */ |
280 | 278 |
281 /* Flip sign depending on dither */ | 279 /* Flip sign depending on dither */ |
282 if ( NSQ->rand_seed < 0 ) { | 280 if( NSQ->rand_seed < 0 ) { |
283 r_Q10 = -r_Q10; | 281 r_Q10 = -r_Q10; |
284 } | 282 } |
285 r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 ); | 283 r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 ); |
286 | 284 |
287 /* Find two quantization level candidates and measure their rate-distort
ion */ | 285 /* Find two quantization level candidates and measure their rate-distort
ion */ |
288 q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); | 286 q1_Q10 = silk_SUB32( r_Q10, offset_Q10 ); |
289 q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); | 287 q1_Q0 = silk_RSHIFT( q1_Q10, 10 ); |
| 288 if (Lambda_Q10 > 2048) { |
| 289 /* For aggressive RDO, the bias becomes more than one pulse. */ |
| 290 int rdo_offset = Lambda_Q10/2 - 512; |
| 291 if (q1_Q10 > rdo_offset) { |
| 292 q1_Q0 = silk_RSHIFT( q1_Q10 - rdo_offset, 10 ); |
| 293 } else if (q1_Q10 < -rdo_offset) { |
| 294 q1_Q0 = silk_RSHIFT( q1_Q10 + rdo_offset, 10 ); |
| 295 } else if (q1_Q10 < 0) { |
| 296 q1_Q0 = -1; |
| 297 } else { |
| 298 q1_Q0 = 0; |
| 299 } |
| 300 } |
290 if( q1_Q0 > 0 ) { | 301 if( q1_Q0 > 0 ) { |
291 q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q
10 ); | 302 q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q
10 ); |
292 q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); | 303 q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 ); |
293 q2_Q10 = silk_ADD32( q1_Q10, 1024 ); | 304 q2_Q10 = silk_ADD32( q1_Q10, 1024 ); |
294 rd1_Q20 = silk_SMULBB( q1_Q10, Lambda_Q10 ); | 305 rd1_Q20 = silk_SMULBB( q1_Q10, Lambda_Q10 ); |
295 rd2_Q20 = silk_SMULBB( q2_Q10, Lambda_Q10 ); | 306 rd2_Q20 = silk_SMULBB( q2_Q10, Lambda_Q10 ); |
296 } else if( q1_Q0 == 0 ) { | 307 } else if( q1_Q0 == 0 ) { |
297 q1_Q10 = offset_Q10; | 308 q1_Q10 = offset_Q10; |
298 q2_Q10 = silk_ADD32( q1_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 ); | 309 q2_Q10 = silk_ADD32( q1_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 ); |
299 rd1_Q20 = silk_SMULBB( q1_Q10, Lambda_Q10 ); | 310 rd1_Q20 = silk_SMULBB( q1_Q10, Lambda_Q10 ); |
(...skipping 30 matching lines...) Expand all Loading... |
330 /* Add predictions */ | 341 /* Add predictions */ |
331 LPC_exc_Q14 = silk_ADD_LSHIFT32( exc_Q14, LTP_pred_Q13, 1 ); | 342 LPC_exc_Q14 = silk_ADD_LSHIFT32( exc_Q14, LTP_pred_Q13, 1 ); |
332 xq_Q14 = silk_ADD_LSHIFT32( LPC_exc_Q14, LPC_pred_Q10, 4 ); | 343 xq_Q14 = silk_ADD_LSHIFT32( LPC_exc_Q14, LPC_pred_Q10, 4 ); |
333 | 344 |
334 /* Scale XQ back to normal level before saving */ | 345 /* Scale XQ back to normal level before saving */ |
335 xq[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( xq_Q14
, Gain_Q10 ), 8 ) ); | 346 xq[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( xq_Q14
, Gain_Q10 ), 8 ) ); |
336 | 347 |
337 /* Update states */ | 348 /* Update states */ |
338 psLPC_Q14++; | 349 psLPC_Q14++; |
339 *psLPC_Q14 = xq_Q14; | 350 *psLPC_Q14 = xq_Q14; |
340 sLF_AR_shp_Q14 = silk_SUB_LSHIFT32( xq_Q14, n_AR_Q12, 2 ); | 351 NSQ->sDiff_shp_Q14 = silk_SUB_LSHIFT32( xq_Q14, x_sc_Q10[ i ], 4 ); |
| 352 sLF_AR_shp_Q14 = silk_SUB_LSHIFT32( NSQ->sDiff_shp_Q14, n_AR_Q12, 2 ); |
341 NSQ->sLF_AR_shp_Q14 = sLF_AR_shp_Q14; | 353 NSQ->sLF_AR_shp_Q14 = sLF_AR_shp_Q14; |
342 | 354 |
343 NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx ] = silk_SUB_LSHIFT32( sLF_AR_s
hp_Q14, n_LF_Q12, 2 ); | 355 NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx ] = silk_SUB_LSHIFT32( sLF_AR_s
hp_Q14, n_LF_Q12, 2 ); |
344 sLTP_Q15[ NSQ->sLTP_buf_idx ] = silk_LSHIFT( LPC_exc_Q14, 1 ); | 356 sLTP_Q15[ NSQ->sLTP_buf_idx ] = silk_LSHIFT( LPC_exc_Q14, 1 ); |
345 NSQ->sLTP_shp_buf_idx++; | 357 NSQ->sLTP_shp_buf_idx++; |
346 NSQ->sLTP_buf_idx++; | 358 NSQ->sLTP_buf_idx++; |
347 | 359 |
348 /* Make dither dependent on quantized signal */ | 360 /* Make dither dependent on quantized signal */ |
349 NSQ->rand_seed = silk_ADD32_ovflw( NSQ->rand_seed, pulses[ i ] ); | 361 NSQ->rand_seed = silk_ADD32_ovflw( NSQ->rand_seed, pulses[ i ] ); |
350 } | 362 } |
351 | 363 |
352 /* Update LPC synth buffer */ | 364 /* Update LPC synth buffer */ |
353 silk_memcpy( NSQ->sLPC_Q14, &NSQ->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * s
izeof( opus_int32 ) ); | 365 silk_memcpy( NSQ->sLPC_Q14, &NSQ->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * s
izeof( opus_int32 ) ); |
354 } | 366 } |
355 | 367 |
356 static OPUS_INLINE void silk_nsq_scale_states( | 368 static OPUS_INLINE void silk_nsq_scale_states( |
357 const silk_encoder_state *psEncC, /* I Encoder State
*/ | 369 const silk_encoder_state *psEncC, /* I Encoder State
*/ |
358 silk_nsq_state *NSQ, /* I/O NSQ state
*/ | 370 silk_nsq_state *NSQ, /* I/O NSQ state
*/ |
359 const opus_int32 x_Q3[], /* I input in Q3
*/ | 371 const opus_int16 x16[], /* I input
*/ |
360 opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain
*/ | 372 opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain
*/ |
361 const opus_int16 sLTP[], /* I re-whitened LTP state in
Q0 */ | 373 const opus_int16 sLTP[], /* I re-whitened LTP state in
Q0 */ |
362 opus_int32 sLTP_Q15[], /* O LTP state matching scale
d input */ | 374 opus_int32 sLTP_Q15[], /* O LTP state matching scale
d input */ |
363 opus_int subfr, /* I subframe number
*/ | 375 opus_int subfr, /* I subframe number
*/ |
364 const opus_int LTP_scale_Q14, /* I
*/ | 376 const opus_int LTP_scale_Q14, /* I
*/ |
365 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I
*/ | 377 const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I
*/ |
366 const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag
*/ | 378 const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag
*/ |
367 const opus_int signal_type /* I Signal type
*/ | 379 const opus_int signal_type /* I Signal type
*/ |
368 ) | 380 ) |
369 { | 381 { |
370 opus_int i, lag; | 382 opus_int i, lag; |
371 opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q23; | 383 opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q26; |
372 | 384 |
373 lag = pitchL[ subfr ]; | 385 lag = pitchL[ subfr ]; |
374 inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); | 386 inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 ); |
375 silk_assert( inv_gain_Q31 != 0 ); | 387 silk_assert( inv_gain_Q31 != 0 ); |
376 | 388 |
377 /* Calculate gain adjustment factor */ | 389 /* Scale input */ |
378 if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { | 390 inv_gain_Q26 = silk_RSHIFT_ROUND( inv_gain_Q31, 5 ); |
379 gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ],
16 ); | 391 for( i = 0; i < psEncC->subfr_length; i++ ) { |
380 } else { | 392 x_sc_Q10[ i ] = silk_SMULWW( x16[ i ], inv_gain_Q26 ); |
381 gain_adj_Q16 = (opus_int32)1 << 16; | |
382 } | 393 } |
383 | 394 |
384 /* Scale input */ | |
385 inv_gain_Q23 = silk_RSHIFT_ROUND( inv_gain_Q31, 8 ); | |
386 for( i = 0; i < psEncC->subfr_length; i++ ) { | |
387 x_sc_Q10[ i ] = silk_SMULWW( x_Q3[ i ], inv_gain_Q23 ); | |
388 } | |
389 | |
390 /* Save inverse gain */ | |
391 NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; | |
392 | |
393 /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16
*/ | 395 /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16
*/ |
394 if( NSQ->rewhite_flag ) { | 396 if( NSQ->rewhite_flag ) { |
395 if( subfr == 0 ) { | 397 if( subfr == 0 ) { |
396 /* Do LTP downscaling */ | 398 /* Do LTP downscaling */ |
397 inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14
), 2 ); | 399 inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14
), 2 ); |
398 } | 400 } |
399 for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx;
i++ ) { | 401 for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx;
i++ ) { |
400 silk_assert( i < MAX_FRAME_LENGTH ); | 402 silk_assert( i < MAX_FRAME_LENGTH ); |
401 sLTP_Q15[ i ] = silk_SMULWB( inv_gain_Q31, sLTP[ i ] ); | 403 sLTP_Q15[ i ] = silk_SMULWB( inv_gain_Q31, sLTP[ i ] ); |
402 } | 404 } |
403 } | 405 } |
404 | 406 |
405 /* Adjust for changing gain */ | 407 /* Adjust for changing gain */ |
406 if( gain_adj_Q16 != (opus_int32)1 << 16 ) { | 408 if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) { |
| 409 gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ],
16 ); |
| 410 |
407 /* Scale long-term shaping state */ | 411 /* Scale long-term shaping state */ |
408 for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_s
hp_buf_idx; i++ ) { | 412 for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_s
hp_buf_idx; i++ ) { |
409 NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q1
4[ i ] ); | 413 NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q1
4[ i ] ); |
410 } | 414 } |
411 | 415 |
412 /* Scale long-term prediction state */ | 416 /* Scale long-term prediction state */ |
413 if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) { | 417 if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) { |
414 for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_
idx; i++ ) { | 418 for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_
idx; i++ ) { |
415 sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] ); | 419 sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] ); |
416 } | 420 } |
417 } | 421 } |
418 | 422 |
419 NSQ->sLF_AR_shp_Q14 = silk_SMULWW( gain_adj_Q16, NSQ->sLF_AR_shp_Q14 ); | 423 NSQ->sLF_AR_shp_Q14 = silk_SMULWW( gain_adj_Q16, NSQ->sLF_AR_shp_Q14 ); |
| 424 NSQ->sDiff_shp_Q14 = silk_SMULWW( gain_adj_Q16, NSQ->sDiff_shp_Q14 ); |
420 | 425 |
421 /* Scale short-term prediction and shaping states */ | 426 /* Scale short-term prediction and shaping states */ |
422 for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { | 427 for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) { |
423 NSQ->sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLPC_Q14[ i ] )
; | 428 NSQ->sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLPC_Q14[ i ] )
; |
424 } | 429 } |
425 for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { | 430 for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) { |
426 NSQ->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sAR2_Q14[ i ] )
; | 431 NSQ->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sAR2_Q14[ i ] )
; |
427 } | 432 } |
| 433 |
| 434 /* Save inverse gain */ |
| 435 NSQ->prev_gain_Q16 = Gains_Q16[ subfr ]; |
428 } | 436 } |
429 } | 437 } |
OLD | NEW |