Line data Source code
1 : /*====================================================================================
2 : EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
3 : ====================================================================================*/
4 : #include <stdint.h>
5 : #include "options.h" /* Compilation switches */
6 : #include "rom_com.h" /* Static table prototypes */
7 : #include "prot_fx.h"
8 : #include <assert.h>
9 :
10 : /*------------------------------------------------------------------
11 : * weight_a_subfr()
12 : *
13 : * Weighting of LP filter coefficients for multiple subframes,
14 : * ap[i] = a[i] * (gamma^i)
15 : *------------------------------------------------------------------*/
16 :
17 1298444 : void weight_a_subfr_fx(
18 : const Word16 nb_subfr, /* i : number of subframes Q0 */
19 : const Word16 *A, /* i : LP filter coefficients Q12 */
20 : Word16 *Aw, /* o : weighted LP filter coefficients Q12 */
21 : const Word16 gamma, /* i : weighting factor Q15 */
22 : const Word16 order /* i : order of LP filter Q0 */
23 : )
24 : {
25 : Word16 k, orderp1;
26 :
27 : /* Smoothing aka spreading aka masking envelope generation */
28 1298444 : orderp1 = add( order, 1 );
29 6658260 : FOR( k = 0; k < nb_subfr; k++ )
30 : {
31 5359816 : weight_a_fx( &A[k * ( orderp1 )], &Aw[k * ( orderp1 )], gamma, order );
32 : }
33 :
34 1298444 : return;
35 : }
36 :
37 : /*==============================================================================*/
38 : /* FUNCTION : void weight_a_lc_fx ( ) */
39 : /*------------------------------------------------------------------------------*/
40 : /* PURPOSE : Weighting of LP filter coefficients, ap[i] = a[i] * (gamma^i)*/
41 : /*------------------------------------------------------------------------------*/
42 : /* INPUT ARGUMENTS : */
43 : /* const Word16 a[], i: LP filter coefficients Q12 */
44 : /* const Word16 *gammatbl, i: weighting factor Q15 */
45 : /* const Word16 m i: order of LP filter Q0 */
46 : /*------------------------------------------------------------------------------*/
47 : /* OUTPUT ARGUMENTS : */
48 : /* Word16 ap[], o: weighted LP filter coefficients Q12 */
49 : /*------------------------------------------------------------------------------*/
50 : /* RETURN ARGUMENTS : */
51 : /*------------------------------------------------------------------------------*/
52 : /* CALLED FROM : TX/RX */
53 : /*==============================================================================*/
54 59804 : void weight_a_lc_fx(
55 : const Word16 a[], /* i: LP filter coefficients Q12 */
56 : Word16 ap[], /* o: weighted LP filter coefficients Q12 */
57 : const Word16 *gammatbl, /* i: weighting factor Q15 */
58 : const Word16 m /* i: order of LP filter Q0 */
59 : )
60 : {
61 : Word16 i;
62 : Word32 Amax;
63 : Word16 shift;
64 : const Word16 *ptr_gamma;
65 :
66 59804 : ptr_gamma = gammatbl; /* Q15 */
67 59804 : Amax = L_mult( 16384, a[0] ); /* Q27 */
68 956864 : FOR( i = 1; i < m; i++ )
69 : {
70 897060 : Amax = L_max( Amax, L_abs( L_mult0( *ptr_gamma++, a[i] ) ) ); /* Q27 */
71 : }
72 59804 : Amax = L_max( Amax, L_abs( L_mult0( *ptr_gamma++, a[m] ) ) ); /* Q27 */
73 59804 : shift = norm_l( Amax );
74 59804 : ptr_gamma = gammatbl; /* Q15 */
75 59804 : ap[0] = shl( a[0], sub( shift, 1 ) ); /* Q11 + shift */
76 59804 : move16();
77 956864 : FOR( i = 1; i < m; i++ )
78 : {
79 897060 : ap[i] = round_fx( L_shl( L_mult0( a[i], *ptr_gamma++ ), shift ) ); /* Q11 + shift */
80 897060 : move16();
81 : }
82 59804 : ap[m] = round_fx( L_shl( L_mult0( a[m], *ptr_gamma++ ), shift ) ); /* Q11 + shift */
83 59804 : move16();
84 :
85 59804 : return;
86 : }
87 :
88 : /*------------------------------------------------------------------
89 : * weight_a:
90 : *
91 : * Weighting of LP filter coefficients, ap[i] = a[i] * (gamma^i)
92 : *------------------------------------------------------------------*/
93 11890659 : void weight_a_fx(
94 : const Word16 a[], /* i: LP filter coefficients Q12 */
95 : Word16 ap[], /* o: weighted LP filter coefficients Q12 */
96 : const Word16 gamma, /* i: weighting factor Q15 */
97 : const Word16 m /* i: order of LP filter Q0 */
98 : )
99 : {
100 : Word16 i, fac;
101 : Word32 Amax;
102 : Word16 shift;
103 : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
104 : Flag Overflow;
105 11890659 : Overflow = 0;
106 11890659 : move32();
107 : #endif
108 :
109 11890659 : fac = gamma; /* Q15 */
110 11890659 : move16();
111 11890659 : Amax = L_mult( 16384, a[0] ); /* Q27 */
112 180075408 : FOR( i = 1; i < m; i++ )
113 : {
114 168184749 : Amax = L_max( Amax, L_abs( L_mult0( fac, a[i] ) ) ); /* Q27 */
115 168184749 : fac = mult_r( fac, gamma ); /* Q15 */
116 : }
117 11890659 : Amax = L_max( Amax, L_abs( L_mult0( fac, a[m] ) ) );
118 11890659 : shift = norm_l( Amax );
119 11890659 : fac = gamma; /* Q15 */
120 11890659 : move16();
121 11890659 : ap[0] = shl( a[0], sub( shift, 1 ) ); /* Q11 + shift */
122 11890659 : move16();
123 180075408 : FOR( i = 1; i < m; i++ )
124 : {
125 168184749 : ap[i] = round_fx_o( L_shl( L_mult0( a[i], fac ), shift ), &Overflow ); /* Q11 + shift */
126 168184749 : move16();
127 168184749 : fac = mult_r( fac, gamma ); /* Q15 */
128 : }
129 11890659 : ap[m] = round_fx( L_shl( L_mult0( a[m], fac ), shift ) ); /* Q11 + shift */
130 11890659 : move16();
131 :
132 11890659 : return;
133 : }
134 :
135 : /*
136 : * E_LPC_a_weight_inv
137 : *
138 : * Parameters:
139 : * a I: LP filter coefficients Q12
140 : * ap O: weighted LP filter coefficients Q12
141 : * inv_gamma I: inverse weighting factor Q14
142 : * m I: order of LP filter
143 : *
144 : * Function:
145 : * Weighting of LP filter coefficients, ap[i] = a[i] * (inv_gamma^i).
146 : *
147 : * Returns:
148 : * void
149 : */
150 17495 : void E_LPC_a_weight_inv(
151 : const Word16 *a, /* Q12 */
152 : Word16 *ap, /* Q12 */
153 : const Word16 inv_gamma, /* Q14 */
154 : const Word16 m /* Q0 */
155 : )
156 : {
157 : Word16 i;
158 : static const Word16 inv_gamma_tab_12k8[16] = { 17809, 19357, 21041, 22870, 24859, 27020, 29370, 31924, /* Q14 */
159 : 17350, 18859, 20499, 22281, 24219, 26325, 28614, 31102 }; /* Q13 */
160 : static const Word16 inv_gamma_tab_16k[16] = { 17430, 18542, 19726, 20985, 22324, 23749, 25265, 26878, /* Q14 */
161 : 14297, 15209, 16180, 17213, 18312, 19480, 20724, 22047 }; /* Q13 */
162 17495 : move16();
163 17495 : move16();
164 17495 : move16();
165 17495 : move16();
166 17495 : move16();
167 17495 : move16();
168 17495 : move16();
169 17495 : move16();
170 17495 : move16();
171 17495 : move16();
172 17495 : move16();
173 17495 : move16();
174 17495 : move16();
175 17495 : move16();
176 17495 : move16();
177 17495 : move16();
178 17495 : move16();
179 17495 : move16();
180 17495 : move16();
181 17495 : move16();
182 17495 : move16();
183 17495 : move16();
184 17495 : move16();
185 17495 : move16();
186 17495 : move16();
187 17495 : move16();
188 17495 : move16();
189 17495 : move16();
190 17495 : move16();
191 17495 : move16();
192 17495 : move16();
193 17495 : move16();
194 :
195 : const Word16 *inv_gamma_tab;
196 : Word32 L_tmp;
197 : Word32 Amax;
198 : Word16 shift;
199 :
200 :
201 17495 : IF( EQ_16( inv_gamma, 16384 /* 1 in Q14 */ ) )
202 : {
203 0 : FOR( i = 0; i <= m; i++ )
204 : {
205 0 : ap[i] = a[i]; /* Q12 */
206 0 : move16();
207 : }
208 0 : return;
209 : }
210 :
211 17495 : assert( inv_gamma == GAMMA1_INV || inv_gamma == GAMMA16k_INV );
212 17495 : assert( m == 16 );
213 :
214 17495 : inv_gamma_tab = inv_gamma_tab_12k8; /* Q14 */
215 17495 : if ( EQ_16( inv_gamma, GAMMA16k_INV ) )
216 : {
217 0 : inv_gamma_tab = inv_gamma_tab_16k; /* Q14 */
218 : }
219 :
220 :
221 17495 : Amax = L_mult( 16384, a[0] );
222 157455 : FOR( i = 1; i < 9; i++ )
223 : {
224 139960 : Amax = L_max( Amax, L_abs( L_mult( a[i], inv_gamma_tab[i - 1] ) ) ); /* Q27 */
225 : }
226 157455 : FOR( i = 9; i < 17; i++ )
227 : {
228 139960 : Amax = L_max( Amax, L_abs( L_shl( L_mult( a[i], inv_gamma_tab[i - 1] ), 1 ) ) ); /* Q27 */
229 : }
230 17495 : shift = norm_l( Amax );
231 17495 : ap[0] = shl( a[0], sub( shift, 1 ) ); /* Q11 + shift */
232 17495 : move16();
233 157455 : FOR( i = 1; i < 9; i++ )
234 : {
235 139960 : L_tmp = L_mult( a[i], inv_gamma_tab[i - 1] ); /* Q27 */
236 139960 : ap[i] = round_fx( L_shl( L_tmp, shift ) ); /* Q11 + shift */
237 139960 : move16();
238 : }
239 17495 : shift = add( shift, 1 );
240 157455 : FOR( i = 9; i < 17; i++ )
241 : {
242 139960 : L_tmp = L_mult( a[i], inv_gamma_tab[i - 1] ); /* Q26 */
243 139960 : ap[i] = round_fx( L_shl( L_tmp, shift ) ); /* Q11 + shift */
244 139960 : move16();
245 : }
246 :
247 :
248 17495 : return;
249 : }
|