Mercurial > hg > sv-dependency-builds
comparison src/opus-1.3/silk/quant_LTP_gains.c @ 154:4664ac0c1032
Add Opus sources and macOS builds
author | Chris Cannam <cannam@all-day-breakfast.com> |
---|---|
date | Wed, 23 Jan 2019 13:48:08 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
153:84bc3a5ec321 | 154:4664ac0c1032 |
---|---|
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.h" | |
33 #include "tuning_parameters.h" | |
34 | |
35 void silk_quant_LTP_gains( | |
36 opus_int16 B_Q14[ MAX_NB_SUBFR * LTP_ORDER ], /* O Quantized LTP gains */ | |
37 opus_int8 cbk_index[ MAX_NB_SUBFR ], /* O Codebook Index */ | |
38 opus_int8 *periodicity_index, /* O Periodicity Index */ | |
39 opus_int32 *sum_log_gain_Q7, /* I/O Cumulative max prediction gain */ | |
40 opus_int *pred_gain_dB_Q7, /* O LTP prediction gain */ | |
41 const opus_int32 XX_Q17[ MAX_NB_SUBFR*LTP_ORDER*LTP_ORDER ], /* I Correlation matrix in Q18 */ | |
42 const opus_int32 xX_Q17[ MAX_NB_SUBFR*LTP_ORDER ], /* I Correlation vector in Q18 */ | |
43 const opus_int subfr_len, /* I Number of samples per subframe */ | |
44 const opus_int nb_subfr, /* I Number of subframes */ | |
45 int arch /* I Run-time architecture */ | |
46 ) | |
47 { | |
48 opus_int j, k, cbk_size; | |
49 opus_int8 temp_idx[ MAX_NB_SUBFR ]; | |
50 const opus_uint8 *cl_ptr_Q5; | |
51 const opus_int8 *cbk_ptr_Q7; | |
52 const opus_uint8 *cbk_gain_ptr_Q7; | |
53 const opus_int32 *XX_Q17_ptr, *xX_Q17_ptr; | |
54 opus_int32 res_nrg_Q15_subfr, res_nrg_Q15, rate_dist_Q7_subfr, rate_dist_Q7, min_rate_dist_Q7; | |
55 opus_int32 sum_log_gain_tmp_Q7, best_sum_log_gain_Q7, max_gain_Q7; | |
56 opus_int gain_Q7; | |
57 | |
58 /***************************************************/ | |
59 /* iterate over different codebooks with different */ | |
60 /* rates/distortions, and choose best */ | |
61 /***************************************************/ | |
62 min_rate_dist_Q7 = silk_int32_MAX; | |
63 best_sum_log_gain_Q7 = 0; | |
64 for( k = 0; k < 3; k++ ) { | |
65 /* Safety margin for pitch gain control, to take into account factors | |
66 such as state rescaling/rewhitening. */ | |
67 opus_int32 gain_safety = SILK_FIX_CONST( 0.4, 7 ); | |
68 | |
69 cl_ptr_Q5 = silk_LTP_gain_BITS_Q5_ptrs[ k ]; | |
70 cbk_ptr_Q7 = silk_LTP_vq_ptrs_Q7[ k ]; | |
71 cbk_gain_ptr_Q7 = silk_LTP_vq_gain_ptrs_Q7[ k ]; | |
72 cbk_size = silk_LTP_vq_sizes[ k ]; | |
73 | |
74 /* Set up pointers to first subframe */ | |
75 XX_Q17_ptr = XX_Q17; | |
76 xX_Q17_ptr = xX_Q17; | |
77 | |
78 res_nrg_Q15 = 0; | |
79 rate_dist_Q7 = 0; | |
80 sum_log_gain_tmp_Q7 = *sum_log_gain_Q7; | |
81 for( j = 0; j < nb_subfr; j++ ) { | |
82 max_gain_Q7 = silk_log2lin( ( SILK_FIX_CONST( MAX_SUM_LOG_GAIN_DB / 6.0, 7 ) - sum_log_gain_tmp_Q7 ) | |
83 + SILK_FIX_CONST( 7, 7 ) ) - gain_safety; | |
84 silk_VQ_WMat_EC( | |
85 &temp_idx[ j ], /* O index of best codebook vector */ | |
86 &res_nrg_Q15_subfr, /* O residual energy */ | |
87 &rate_dist_Q7_subfr, /* O best weighted quantization error + mu * rate */ | |
88 &gain_Q7, /* O sum of absolute LTP coefficients */ | |
89 XX_Q17_ptr, /* I correlation matrix */ | |
90 xX_Q17_ptr, /* I correlation vector */ | |
91 cbk_ptr_Q7, /* I codebook */ | |
92 cbk_gain_ptr_Q7, /* I codebook effective gains */ | |
93 cl_ptr_Q5, /* I code length for each codebook vector */ | |
94 subfr_len, /* I number of samples per subframe */ | |
95 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */ | |
96 cbk_size, /* I number of vectors in codebook */ | |
97 arch /* I Run-time architecture */ | |
98 ); | |
99 | |
100 res_nrg_Q15 = silk_ADD_POS_SAT32( res_nrg_Q15, res_nrg_Q15_subfr ); | |
101 rate_dist_Q7 = silk_ADD_POS_SAT32( rate_dist_Q7, rate_dist_Q7_subfr ); | |
102 sum_log_gain_tmp_Q7 = silk_max(0, sum_log_gain_tmp_Q7 | |
103 + silk_lin2log( gain_safety + gain_Q7 ) - SILK_FIX_CONST( 7, 7 )); | |
104 | |
105 XX_Q17_ptr += LTP_ORDER * LTP_ORDER; | |
106 xX_Q17_ptr += LTP_ORDER; | |
107 } | |
108 | |
109 if( rate_dist_Q7 <= min_rate_dist_Q7 ) { | |
110 min_rate_dist_Q7 = rate_dist_Q7; | |
111 *periodicity_index = (opus_int8)k; | |
112 silk_memcpy( cbk_index, temp_idx, nb_subfr * sizeof( opus_int8 ) ); | |
113 best_sum_log_gain_Q7 = sum_log_gain_tmp_Q7; | |
114 } | |
115 } | |
116 | |
117 cbk_ptr_Q7 = silk_LTP_vq_ptrs_Q7[ *periodicity_index ]; | |
118 for( j = 0; j < nb_subfr; j++ ) { | |
119 for( k = 0; k < LTP_ORDER; k++ ) { | |
120 B_Q14[ j * LTP_ORDER + k ] = silk_LSHIFT( cbk_ptr_Q7[ cbk_index[ j ] * LTP_ORDER + k ], 7 ); | |
121 } | |
122 } | |
123 | |
124 if( nb_subfr == 2 ) { | |
125 res_nrg_Q15 = silk_RSHIFT32( res_nrg_Q15, 1 ); | |
126 } else { | |
127 res_nrg_Q15 = silk_RSHIFT32( res_nrg_Q15, 2 ); | |
128 } | |
129 | |
130 *sum_log_gain_Q7 = best_sum_log_gain_Q7; | |
131 *pred_gain_dB_Q7 = (opus_int)silk_SMULBB( -3, silk_lin2log( res_nrg_Q15 ) - ( 15 << 7 ) ); | |
132 } |