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 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 if( gain_Q16 >= (1 << 21) || psCNG->CNG_smth_Gain_Q16 > (1 << 23) ) { | 131 if( gain_Q16 >= (1 << 21) || psCNG->CNG_smth_Gain_Q16 > (1 << 23) ) { |
132 gain_Q16 = silk_SMULTT( gain_Q16, gain_Q16 ); | 132 gain_Q16 = silk_SMULTT( gain_Q16, gain_Q16 ); |
133 gain_Q16 = silk_SUB_LSHIFT32(silk_SMULTT( psCNG->CNG_smth_Gain_Q16,
psCNG->CNG_smth_Gain_Q16 ), gain_Q16, 5 ); | 133 gain_Q16 = silk_SUB_LSHIFT32(silk_SMULTT( psCNG->CNG_smth_Gain_Q16,
psCNG->CNG_smth_Gain_Q16 ), gain_Q16, 5 ); |
134 gain_Q16 = silk_LSHIFT32( silk_SQRT_APPROX( gain_Q16 ), 16 ); | 134 gain_Q16 = silk_LSHIFT32( silk_SQRT_APPROX( gain_Q16 ), 16 ); |
135 } else { | 135 } else { |
136 gain_Q16 = silk_SMULWW( gain_Q16, gain_Q16 ); | 136 gain_Q16 = silk_SMULWW( gain_Q16, gain_Q16 ); |
137 gain_Q16 = silk_SUB_LSHIFT32(silk_SMULWW( psCNG->CNG_smth_Gain_Q16,
psCNG->CNG_smth_Gain_Q16 ), gain_Q16, 5 ); | 137 gain_Q16 = silk_SUB_LSHIFT32(silk_SMULWW( psCNG->CNG_smth_Gain_Q16,
psCNG->CNG_smth_Gain_Q16 ), gain_Q16, 5 ); |
138 gain_Q16 = silk_LSHIFT32( silk_SQRT_APPROX( gain_Q16 ), 8 ); | 138 gain_Q16 = silk_LSHIFT32( silk_SQRT_APPROX( gain_Q16 ), 8 ); |
139 } | 139 } |
140 gain_Q10 = silk_RSHIFT( gain_Q16, 6 ); | 140 gain_Q10 = silk_RSHIFT( gain_Q16, 6 ); |
141 | 141 |
142 silk_CNG_exc( CNG_sig_Q14 + MAX_LPC_ORDER, psCNG->CNG_exc_buf_Q14, lengt
h, &psCNG->rand_seed ); | 142 silk_CNG_exc( CNG_sig_Q14 + MAX_LPC_ORDER, psCNG->CNG_exc_buf_Q14, lengt
h, &psCNG->rand_seed ); |
143 | 143 |
144 /* Convert CNG NLSF to filter representation */ | 144 /* Convert CNG NLSF to filter representation */ |
145 silk_NLSF2A( A_Q12, psCNG->CNG_smth_NLSF_Q15, psDec->LPC_order ); | 145 silk_NLSF2A( A_Q12, psCNG->CNG_smth_NLSF_Q15, psDec->LPC_order, psDec->a
rch ); |
146 | 146 |
147 /* Generate CNG signal, by synthesis filtering */ | 147 /* Generate CNG signal, by synthesis filtering */ |
148 silk_memcpy( CNG_sig_Q14, psCNG->CNG_synth_state, MAX_LPC_ORDER * sizeof
( opus_int32 ) ); | 148 silk_memcpy( CNG_sig_Q14, psCNG->CNG_synth_state, MAX_LPC_ORDER * sizeof
( opus_int32 ) ); |
149 for( i = 0; i < length; i++ ) { | 149 for( i = 0; i < length; i++ ) { |
150 silk_assert( psDec->LPC_order == 10 || psDec->LPC_order == 16 ); | 150 silk_assert( psDec->LPC_order == 10 || psDec->LPC_order == 16 ); |
151 /* Avoids introducing a bias because silk_SMLAWB() always rounds to
-inf */ | 151 /* Avoids introducing a bias because silk_SMLAWB() always rounds to
-inf */ |
152 LPC_pred_Q10 = silk_RSHIFT( psDec->LPC_order, 1 ); | 152 LPC_pred_Q10 = silk_RSHIFT( psDec->LPC_order, 1 ); |
153 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 1 ], A_Q12[ 0 ] ); | 153 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 1 ], A_Q12[ 0 ] ); |
154 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 2 ], A_Q12[ 1 ] ); | 154 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 2 ], A_Q12[ 1 ] ); |
155 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 3 ], A_Q12[ 2 ] ); | 155 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 3 ], A_Q12[ 2 ] ); |
156 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 4 ], A_Q12[ 3 ] ); | 156 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 4 ], A_Q12[ 3 ] ); |
157 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 5 ], A_Q12[ 4 ] ); | 157 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 5 ], A_Q12[ 4 ] ); |
158 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 6 ], A_Q12[ 5 ] ); | 158 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 6 ], A_Q12[ 5 ] ); |
159 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 7 ], A_Q12[ 6 ] ); | 159 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 7 ], A_Q12[ 6 ] ); |
160 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 8 ], A_Q12[ 7 ] ); | 160 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 8 ], A_Q12[ 7 ] ); |
161 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 9 ], A_Q12[ 8 ] ); | 161 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 9 ], A_Q12[ 8 ] ); |
162 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 10 ], A_Q12[ 9 ] ); | 162 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_ORDER
+ i - 10 ], A_Q12[ 9 ] ); |
163 if( psDec->LPC_order == 16 ) { | 163 if( psDec->LPC_order == 16 ) { |
164 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_O
RDER + i - 11 ], A_Q12[ 10 ] ); | 164 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_O
RDER + i - 11 ], A_Q12[ 10 ] ); |
165 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_O
RDER + i - 12 ], A_Q12[ 11 ] ); | 165 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_O
RDER + i - 12 ], A_Q12[ 11 ] ); |
166 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_O
RDER + i - 13 ], A_Q12[ 12 ] ); | 166 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_O
RDER + i - 13 ], A_Q12[ 12 ] ); |
167 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_O
RDER + i - 14 ], A_Q12[ 13 ] ); | 167 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_O
RDER + i - 14 ], A_Q12[ 13 ] ); |
168 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_O
RDER + i - 15 ], A_Q12[ 14 ] ); | 168 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_O
RDER + i - 15 ], A_Q12[ 14 ] ); |
169 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_O
RDER + i - 16 ], A_Q12[ 15 ] ); | 169 LPC_pred_Q10 = silk_SMLAWB( LPC_pred_Q10, CNG_sig_Q14[ MAX_LPC_O
RDER + i - 16 ], A_Q12[ 15 ] ); |
170 } | 170 } |
171 | 171 |
172 /* Update states */ | 172 /* Update states */ |
173 CNG_sig_Q14[ MAX_LPC_ORDER + i ] = silk_ADD_SAT32( CNG_sig_Q14[ MAX_
LPC_ORDER + i ], silk_LSHIFT_SAT32( LPC_pred_Q10, 4 ) ); | 173 CNG_sig_Q14[ MAX_LPC_ORDER + i ] = silk_ADD_SAT32( CNG_sig_Q14[ MAX_
LPC_ORDER + i ], silk_LSHIFT_SAT32( LPC_pred_Q10, 4 ) ); |
174 | 174 |
175 /* Scale with Gain and add to input signal */ | 175 /* Scale with Gain and add to input signal */ |
176 frame[ i ] = (opus_int16)silk_ADD_SAT16( frame[ i ], silk_SAT16( sil
k_RSHIFT_ROUND( silk_SMULWW( CNG_sig_Q14[ MAX_LPC_ORDER + i ], gain_Q10 ), 8 ) )
); | 176 frame[ i ] = (opus_int16)silk_ADD_SAT16( frame[ i ], silk_SAT16( sil
k_RSHIFT_ROUND( silk_SMULWW( CNG_sig_Q14[ MAX_LPC_ORDER + i ], gain_Q10 ), 8 ) )
); |
177 | 177 |
178 } | 178 } |
179 silk_memcpy( psCNG->CNG_synth_state, &CNG_sig_Q14[ length ], MAX_LPC_ORD
ER * sizeof( opus_int32 ) ); | 179 silk_memcpy( psCNG->CNG_synth_state, &CNG_sig_Q14[ length ], MAX_LPC_ORD
ER * sizeof( opus_int32 ) ); |
180 } else { | 180 } else { |
181 silk_memset( psCNG->CNG_synth_state, 0, psDec->LPC_order * sizeof( opus
_int32 ) ); | 181 silk_memset( psCNG->CNG_synth_state, 0, psDec->LPC_order * sizeof( opus
_int32 ) ); |
182 } | 182 } |
183 RESTORE_STACK; | 183 RESTORE_STACK; |
184 } | 184 } |
OLD | NEW |