Mercurial > hg > sv-dependency-builds
comparison src/opus-1.3/silk/fixed/find_pred_coefs_FIX.c @ 69:7aeed7906520
Add Opus sources and macOS builds
author | Chris Cannam |
---|---|
date | Wed, 23 Jan 2019 13:48:08 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
68:85d5306e114e | 69:7aeed7906520 |
---|---|
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_FIX.h" | |
33 #include "stack_alloc.h" | |
34 | |
35 void silk_find_pred_coefs_FIX( | |
36 silk_encoder_state_FIX *psEnc, /* I/O encoder state */ | |
37 silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ | |
38 const opus_int16 res_pitch[], /* I Residual from pitch analysis */ | |
39 const opus_int16 x[], /* I Speech signal */ | |
40 opus_int condCoding /* I The type of conditional coding to use */ | |
41 ) | |
42 { | |
43 opus_int i; | |
44 opus_int32 invGains_Q16[ MAX_NB_SUBFR ], local_gains[ MAX_NB_SUBFR ]; | |
45 opus_int16 NLSF_Q15[ MAX_LPC_ORDER ]; | |
46 const opus_int16 *x_ptr; | |
47 opus_int16 *x_pre_ptr; | |
48 VARDECL( opus_int16, LPC_in_pre ); | |
49 opus_int32 min_gain_Q16, minInvGain_Q30; | |
50 SAVE_STACK; | |
51 | |
52 /* weighting for weighted least squares */ | |
53 min_gain_Q16 = silk_int32_MAX >> 6; | |
54 for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { | |
55 min_gain_Q16 = silk_min( min_gain_Q16, psEncCtrl->Gains_Q16[ i ] ); | |
56 } | |
57 for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { | |
58 /* Divide to Q16 */ | |
59 silk_assert( psEncCtrl->Gains_Q16[ i ] > 0 ); | |
60 /* Invert and normalize gains, and ensure that maximum invGains_Q16 is within range of a 16 bit int */ | |
61 invGains_Q16[ i ] = silk_DIV32_varQ( min_gain_Q16, psEncCtrl->Gains_Q16[ i ], 16 - 2 ); | |
62 | |
63 /* Limit inverse */ | |
64 invGains_Q16[ i ] = silk_max( invGains_Q16[ i ], 100 ); | |
65 | |
66 /* Square the inverted gains */ | |
67 silk_assert( invGains_Q16[ i ] == silk_SAT16( invGains_Q16[ i ] ) ); | |
68 | |
69 /* Invert the inverted and normalized gains */ | |
70 local_gains[ i ] = silk_DIV32( ( (opus_int32)1 << 16 ), invGains_Q16[ i ] ); | |
71 } | |
72 | |
73 ALLOC( LPC_in_pre, | |
74 psEnc->sCmn.nb_subfr * psEnc->sCmn.predictLPCOrder | |
75 + psEnc->sCmn.frame_length, opus_int16 ); | |
76 if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { | |
77 VARDECL( opus_int32, xXLTP_Q17 ); | |
78 VARDECL( opus_int32, XXLTP_Q17 ); | |
79 | |
80 /**********/ | |
81 /* VOICED */ | |
82 /**********/ | |
83 celt_assert( psEnc->sCmn.ltp_mem_length - psEnc->sCmn.predictLPCOrder >= psEncCtrl->pitchL[ 0 ] + LTP_ORDER / 2 ); | |
84 | |
85 ALLOC( xXLTP_Q17, psEnc->sCmn.nb_subfr * LTP_ORDER, opus_int32 ); | |
86 ALLOC( XXLTP_Q17, psEnc->sCmn.nb_subfr * LTP_ORDER * LTP_ORDER, opus_int32 ); | |
87 | |
88 /* LTP analysis */ | |
89 silk_find_LTP_FIX( XXLTP_Q17, xXLTP_Q17, res_pitch, | |
90 psEncCtrl->pitchL, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.arch ); | |
91 | |
92 /* Quantize LTP gain parameters */ | |
93 silk_quant_LTP_gains( psEncCtrl->LTPCoef_Q14, psEnc->sCmn.indices.LTPIndex, &psEnc->sCmn.indices.PERIndex, | |
94 &psEnc->sCmn.sum_log_gain_Q7, &psEncCtrl->LTPredCodGain_Q7, XXLTP_Q17, xXLTP_Q17, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.arch ); | |
95 | |
96 /* Control LTP scaling */ | |
97 silk_LTP_scale_ctrl_FIX( psEnc, psEncCtrl, condCoding ); | |
98 | |
99 /* Create LTP residual */ | |
100 silk_LTP_analysis_filter_FIX( LPC_in_pre, x - psEnc->sCmn.predictLPCOrder, psEncCtrl->LTPCoef_Q14, | |
101 psEncCtrl->pitchL, invGains_Q16, psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder ); | |
102 | |
103 } else { | |
104 /************/ | |
105 /* UNVOICED */ | |
106 /************/ | |
107 /* Create signal with prepended subframes, scaled by inverse gains */ | |
108 x_ptr = x - psEnc->sCmn.predictLPCOrder; | |
109 x_pre_ptr = LPC_in_pre; | |
110 for( i = 0; i < psEnc->sCmn.nb_subfr; i++ ) { | |
111 silk_scale_copy_vector16( x_pre_ptr, x_ptr, invGains_Q16[ i ], | |
112 psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder ); | |
113 x_pre_ptr += psEnc->sCmn.subfr_length + psEnc->sCmn.predictLPCOrder; | |
114 x_ptr += psEnc->sCmn.subfr_length; | |
115 } | |
116 | |
117 silk_memset( psEncCtrl->LTPCoef_Q14, 0, psEnc->sCmn.nb_subfr * LTP_ORDER * sizeof( opus_int16 ) ); | |
118 psEncCtrl->LTPredCodGain_Q7 = 0; | |
119 psEnc->sCmn.sum_log_gain_Q7 = 0; | |
120 } | |
121 | |
122 /* Limit on total predictive coding gain */ | |
123 if( psEnc->sCmn.first_frame_after_reset ) { | |
124 minInvGain_Q30 = SILK_FIX_CONST( 1.0f / MAX_PREDICTION_POWER_GAIN_AFTER_RESET, 30 ); | |
125 } else { | |
126 minInvGain_Q30 = silk_log2lin( silk_SMLAWB( 16 << 7, (opus_int32)psEncCtrl->LTPredCodGain_Q7, SILK_FIX_CONST( 1.0 / 3, 16 ) ) ); /* Q16 */ | |
127 minInvGain_Q30 = silk_DIV32_varQ( minInvGain_Q30, | |
128 silk_SMULWW( SILK_FIX_CONST( MAX_PREDICTION_POWER_GAIN, 0 ), | |
129 silk_SMLAWB( SILK_FIX_CONST( 0.25, 18 ), SILK_FIX_CONST( 0.75, 18 ), psEncCtrl->coding_quality_Q14 ) ), 14 ); | |
130 } | |
131 | |
132 /* LPC_in_pre contains the LTP-filtered input for voiced, and the unfiltered input for unvoiced */ | |
133 silk_find_LPC_FIX( &psEnc->sCmn, NLSF_Q15, LPC_in_pre, minInvGain_Q30 ); | |
134 | |
135 /* Quantize LSFs */ | |
136 silk_process_NLSFs( &psEnc->sCmn, psEncCtrl->PredCoef_Q12, NLSF_Q15, psEnc->sCmn.prev_NLSFq_Q15 ); | |
137 | |
138 /* Calculate residual energy using quantized LPC coefficients */ | |
139 silk_residual_energy_FIX( psEncCtrl->ResNrg, psEncCtrl->ResNrgQ, LPC_in_pre, psEncCtrl->PredCoef_Q12, local_gains, | |
140 psEnc->sCmn.subfr_length, psEnc->sCmn.nb_subfr, psEnc->sCmn.predictLPCOrder, psEnc->sCmn.arch ); | |
141 | |
142 /* Copy to prediction struct for use in next frame for interpolation */ | |
143 silk_memcpy( psEnc->sCmn.prev_NLSFq_Q15, NLSF_Q15, sizeof( psEnc->sCmn.prev_NLSFq_Q15 ) ); | |
144 RESTORE_STACK; | |
145 } |