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_FIX.h" | 32 #include "main_FIX.h" |
33 #include "stack_alloc.h" | 33 #include "stack_alloc.h" |
34 #include "tuning_parameters.h" | 34 #include "tuning_parameters.h" |
35 | 35 |
36 /* Compute gain to make warped filter coefficients have a zero mean log frequenc
y response on a */ | 36 /* Compute gain to make warped filter coefficients have a zero mean log frequenc
y response on a */ |
37 /* non-warped frequency scale. (So that it can be implemented with a minimum-pha
se monic filter.) */ | 37 /* non-warped frequency scale. (So that it can be implemented with a minimum-pha
se monic filter.) */ |
38 /* Note: A monic filter is one with the first coefficient equal to 1.0. In Silk
we omit the first */ | 38 /* Note: A monic filter is one with the first coefficient equal to 1.0. In Silk
we omit the first */ |
39 /* coefficient in an array of coefficients, for monic filters.
*/ | 39 /* coefficient in an array of coefficients, for monic filters.
*/ |
40 static inline opus_int32 warped_gain( /* gain in Q16*/ | 40 static OPUS_INLINE opus_int32 warped_gain( /* gain in Q16*/ |
41 const opus_int32 *coefs_Q24, | 41 const opus_int32 *coefs_Q24, |
42 opus_int lambda_Q16, | 42 opus_int lambda_Q16, |
43 opus_int order | 43 opus_int order |
44 ) { | 44 ) { |
45 opus_int i; | 45 opus_int i; |
46 opus_int32 gain_Q24; | 46 opus_int32 gain_Q24; |
47 | 47 |
48 lambda_Q16 = -lambda_Q16; | 48 lambda_Q16 = -lambda_Q16; |
49 gain_Q24 = coefs_Q24[ order - 1 ]; | 49 gain_Q24 = coefs_Q24[ order - 1 ]; |
50 for( i = order - 2; i >= 0; i-- ) { | 50 for( i = order - 2; i >= 0; i-- ) { |
51 gain_Q24 = silk_SMLAWB( coefs_Q24[ i ], gain_Q24, lambda_Q16 ); | 51 gain_Q24 = silk_SMLAWB( coefs_Q24[ i ], gain_Q24, lambda_Q16 ); |
52 } | 52 } |
53 gain_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), gain_Q24, -lambda_Q16 ); | 53 gain_Q24 = silk_SMLAWB( SILK_FIX_CONST( 1.0, 24 ), gain_Q24, -lambda_Q16 ); |
54 return silk_INVERSE32_varQ( gain_Q24, 40 ); | 54 return silk_INVERSE32_varQ( gain_Q24, 40 ); |
55 } | 55 } |
56 | 56 |
57 /* Convert warped filter coefficients to monic pseudo-warped coefficients and li
mit maximum */ | 57 /* Convert warped filter coefficients to monic pseudo-warped coefficients and li
mit maximum */ |
58 /* amplitude of monic warped coefficients by using bandwidth expansion on the tr
ue coefficients */ | 58 /* amplitude of monic warped coefficients by using bandwidth expansion on the tr
ue coefficients */ |
59 static inline void limit_warped_coefs( | 59 static OPUS_INLINE void limit_warped_coefs( |
60 opus_int32 *coefs_syn_Q24, | 60 opus_int32 *coefs_syn_Q24, |
61 opus_int32 *coefs_ana_Q24, | 61 opus_int32 *coefs_ana_Q24, |
62 opus_int lambda_Q16, | 62 opus_int lambda_Q16, |
63 opus_int32 limit_Q24, | 63 opus_int32 limit_Q24, |
64 opus_int order | 64 opus_int order |
65 ) { | 65 ) { |
66 opus_int i, iter, ind = 0; | 66 opus_int i, iter, ind = 0; |
67 opus_int32 tmp, maxabs_Q24, chirp_Q16, gain_syn_Q16, gain_ana_Q16; | 67 opus_int32 tmp, maxabs_Q24, chirp_Q16, gain_syn_Q16, gain_ana_Q16; |
68 opus_int32 nom_Q16, den_Q24; | 68 opus_int32 nom_Q16, den_Q24; |
69 | 69 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 silk_assert( 0 ); | 138 silk_assert( 0 ); |
139 } | 139 } |
140 | 140 |
141 /**************************************************************/ | 141 /**************************************************************/ |
142 /* Compute noise shaping coefficients and initial gain values */ | 142 /* Compute noise shaping coefficients and initial gain values */ |
143 /**************************************************************/ | 143 /**************************************************************/ |
144 void silk_noise_shape_analysis_FIX( | 144 void silk_noise_shape_analysis_FIX( |
145 silk_encoder_state_FIX *psEnc, /* I
/O Encoder state FIX
*/ | 145 silk_encoder_state_FIX *psEnc, /* I
/O Encoder state FIX
*/ |
146 silk_encoder_control_FIX *psEncCtrl, /* I
/O Encoder control FIX
*/ | 146 silk_encoder_control_FIX *psEncCtrl, /* I
/O Encoder control FIX
*/ |
147 const opus_int16 *pitch_res, /* I
LPC residual from pitch analysis
*/ | 147 const opus_int16 *pitch_res, /* I
LPC residual from pitch analysis
*/ |
148 const opus_int16 *x /* I
Input signal [ frame_length + la_shape ]
*/ | 148 const opus_int16 *x, /* I
Input signal [ frame_length + la_shape ]
*/ |
| 149 int arch /* I
Run-time architecture
*/ |
149 ) | 150 ) |
150 { | 151 { |
151 silk_shape_state_FIX *psShapeSt = &psEnc->sShape; | 152 silk_shape_state_FIX *psShapeSt = &psEnc->sShape; |
152 opus_int k, i, nSamples, Qnrg, b_Q14, warping_Q16, scale = 0; | 153 opus_int k, i, nSamples, Qnrg, b_Q14, warping_Q16, scale = 0; |
153 opus_int32 SNR_adj_dB_Q7, HarmBoost_Q16, HarmShapeGain_Q16, Tilt_Q16, tmp3
2; | 154 opus_int32 SNR_adj_dB_Q7, HarmBoost_Q16, HarmShapeGain_Q16, Tilt_Q16, tmp3
2; |
154 opus_int32 nrg, pre_nrg_Q30, log_energy_Q7, log_energy_prev_Q7, energy_var
iation_Q7; | 155 opus_int32 nrg, pre_nrg_Q30, log_energy_Q7, log_energy_prev_Q7, energy_var
iation_Q7; |
155 opus_int32 delta_Q16, BWExp1_Q16, BWExp2_Q16, gain_mult_Q16, gain_add_Q16,
strength_Q16, b_Q8; | 156 opus_int32 delta_Q16, BWExp1_Q16, BWExp2_Q16, gain_mult_Q16, gain_add_Q16,
strength_Q16, b_Q8; |
156 opus_int32 auto_corr[ MAX_SHAPE_LPC_ORDER + 1 ]; | 157 opus_int32 auto_corr[ MAX_SHAPE_LPC_ORDER + 1 ]; |
157 opus_int32 refl_coef_Q16[ MAX_SHAPE_LPC_ORDER ]; | 158 opus_int32 refl_coef_Q16[ MAX_SHAPE_LPC_ORDER ]; |
158 opus_int32 AR1_Q24[ MAX_SHAPE_LPC_ORDER ]; | 159 opus_int32 AR1_Q24[ MAX_SHAPE_LPC_ORDER ]; |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 silk_apply_sine_window( x_windowed + shift, x_ptr + shift, 2, slope_part
); | 275 silk_apply_sine_window( x_windowed + shift, x_ptr + shift, 2, slope_part
); |
275 | 276 |
276 /* Update pointer: next LPC analysis block */ | 277 /* Update pointer: next LPC analysis block */ |
277 x_ptr += psEnc->sCmn.subfr_length; | 278 x_ptr += psEnc->sCmn.subfr_length; |
278 | 279 |
279 if( psEnc->sCmn.warping_Q16 > 0 ) { | 280 if( psEnc->sCmn.warping_Q16 > 0 ) { |
280 /* Calculate warped auto correlation */ | 281 /* Calculate warped auto correlation */ |
281 silk_warped_autocorrelation_FIX( auto_corr, &scale, x_windowed, warp
ing_Q16, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder ); | 282 silk_warped_autocorrelation_FIX( auto_corr, &scale, x_windowed, warp
ing_Q16, psEnc->sCmn.shapeWinLength, psEnc->sCmn.shapingLPCOrder ); |
282 } else { | 283 } else { |
283 /* Calculate regular auto correlation */ | 284 /* Calculate regular auto correlation */ |
284 silk_autocorr( auto_corr, &scale, x_windowed, psEnc->sCmn.shapeWinLe
ngth, psEnc->sCmn.shapingLPCOrder + 1 ); | 285 silk_autocorr( auto_corr, &scale, x_windowed, psEnc->sCmn.shapeWinLe
ngth, psEnc->sCmn.shapingLPCOrder + 1, arch ); |
285 } | 286 } |
286 | 287 |
287 /* Add white noise, as a fraction of energy */ | 288 /* Add white noise, as a fraction of energy */ |
288 auto_corr[0] = silk_ADD32( auto_corr[0], silk_max_32( silk_SMULWB( silk_
RSHIFT( auto_corr[ 0 ], 4 ), | 289 auto_corr[0] = silk_ADD32( auto_corr[0], silk_max_32( silk_SMULWB( silk_
RSHIFT( auto_corr[ 0 ], 4 ), |
289 SILK_FIX_CONST( SHAPE_WHITE_NOISE_FRACTION, 20 ) ), 1 ) ); | 290 SILK_FIX_CONST( SHAPE_WHITE_NOISE_FRACTION, 20 ) ), 1 ) ); |
290 | 291 |
291 /* Calculate the reflection coefficients using schur */ | 292 /* Calculate the reflection coefficients using schur */ |
292 nrg = silk_schur64( refl_coef_Q16, auto_corr, psEnc->sCmn.shapingLPCOrde
r ); | 293 nrg = silk_schur64( refl_coef_Q16, auto_corr, psEnc->sCmn.shapingLPCOrde
r ); |
293 silk_assert( nrg >= 0 ); | 294 silk_assert( nrg >= 0 ); |
294 | 295 |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
435 silk_SMLAWB( psShapeSt->HarmShapeGain_smth_Q16, HarmShapeGain_Q16 -
psShapeSt->HarmShapeGain_smth_Q16, SILK_FIX_CONST( SUBFR_SMTH_COEF, 16 ) ); | 436 silk_SMLAWB( psShapeSt->HarmShapeGain_smth_Q16, HarmShapeGain_Q16 -
psShapeSt->HarmShapeGain_smth_Q16, SILK_FIX_CONST( SUBFR_SMTH_COEF, 16 ) ); |
436 psShapeSt->Tilt_smth_Q16 = | 437 psShapeSt->Tilt_smth_Q16 = |
437 silk_SMLAWB( psShapeSt->Tilt_smth_Q16, Tilt_Q16 -
psShapeSt->Tilt_smth_Q16, SILK_FIX_CONST( SUBFR_SMTH_COEF, 16 ) ); | 438 silk_SMLAWB( psShapeSt->Tilt_smth_Q16, Tilt_Q16 -
psShapeSt->Tilt_smth_Q16, SILK_FIX_CONST( SUBFR_SMTH_COEF, 16 ) ); |
438 | 439 |
439 psEncCtrl->HarmBoost_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psSha
peSt->HarmBoost_smth_Q16, 2 ); | 440 psEncCtrl->HarmBoost_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psSha
peSt->HarmBoost_smth_Q16, 2 ); |
440 psEncCtrl->HarmShapeGain_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psSha
peSt->HarmShapeGain_smth_Q16, 2 ); | 441 psEncCtrl->HarmShapeGain_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psSha
peSt->HarmShapeGain_smth_Q16, 2 ); |
441 psEncCtrl->Tilt_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psSha
peSt->Tilt_smth_Q16, 2 ); | 442 psEncCtrl->Tilt_Q14[ k ] = ( opus_int )silk_RSHIFT_ROUND( psSha
peSt->Tilt_smth_Q16, 2 ); |
442 } | 443 } |
443 RESTORE_STACK; | 444 RESTORE_STACK; |
444 } | 445 } |
OLD | NEW |