Line data Source code
1 : /*====================================================================================
2 : EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
3 : ====================================================================================*/
4 :
5 : #include <stdint.h>
6 : #include "options.h" /* Compilation switches */
7 : #include "cnst.h" /* Common constants */
8 : #include "rom_com.h" /* Static table prototypes */
9 : #include "prot_fx.h" /* Function prototypes */
10 :
11 : /*--------------------------------------------------------------------------*
12 : * sfm2mqb_fx()
13 : *
14 : * Map sub-vectors to pbands
15 : *--------------------------------------------------------------------------*/
16 :
17 3842 : static void sfm2mqb_fx(
18 : Word16 spe[], /* i : sub-vectors Q0*/
19 : Word16 spe2q[], /* o : pbands Q0*/
20 : const Word16 nb_sfm /* i : number of norms Q0*/
21 : )
22 : {
23 : Word16 tmp, i;
24 :
25 : /* short groups */
26 3842 : spe2q[0] = add( spe[0], 3 ); /* Q0 */
27 3842 : move16();
28 3842 : spe2q[1] = add( spe[1], 3 ); /* Q0 */
29 3842 : move16();
30 3842 : spe2q[2] = add( spe[2], 3 ); /* Q0 */
31 3842 : move16();
32 3842 : spe2q[3] = add( spe[3], 3 ); /* Q0 */
33 3842 : move16();
34 3842 : spe2q[4] = add( spe[4], 3 ); /* Q0 */
35 3842 : move16();
36 3842 : spe2q[5] = add( spe[5], 3 ); /* Q0 */
37 3842 : move16();
38 3842 : spe2q[6] = add( spe[6], 3 ); /* Q0 */
39 3842 : move16();
40 3842 : spe2q[7] = add( spe[7], 3 ); /* Q0 */
41 3842 : move16();
42 3842 : spe2q[8] = add( spe[8], 3 ); /* Q0 */
43 3842 : move16();
44 3842 : spe2q[9] = add( spe[9], 3 ); /* Q0 */
45 3842 : move16();
46 :
47 3842 : spe2q[10] = add( shr( add( spe[10], spe[11] ), 1 ), 4 ); /* Q0 */
48 3842 : move16();
49 3842 : spe2q[11] = add( shr( add( spe[12], spe[13] ), 1 ), 4 ); /* Q0 */
50 3842 : move16();
51 3842 : spe2q[12] = add( shr( add( spe[14], spe[15] ), 1 ), 4 ); /* Q0 */
52 3842 : move16();
53 :
54 3842 : spe2q[13] = add( shr( add( spe[16], spe[17] ), 1 ), 5 ); /* Q0 */
55 3842 : move16();
56 3842 : spe2q[14] = add( shr( add( spe[18], spe[19] ), 1 ), 5 ); /* Q0 */
57 3842 : move16();
58 :
59 3842 : tmp = 0;
60 3842 : move16();
61 19210 : FOR( i = 20; i < 24; i++ )
62 : {
63 15368 : tmp = add( tmp, spe[i] );
64 : }
65 3842 : spe2q[15] = add( mult( tmp, 8192 ), 6 ); /* Q0 */
66 3842 : move16();
67 :
68 3842 : tmp = 0;
69 3842 : move16();
70 15368 : FOR( i = 24; i < 27; i++ )
71 : {
72 11526 : tmp = add( tmp, spe[i] ); /* Q0 */
73 : }
74 3842 : spe2q[16] = add( mult( tmp, 10923 ), 6 ); /* Q0 */
75 3842 : move16();
76 :
77 3842 : IF( GT_16( nb_sfm, SFM_N_STA_8k ) )
78 : {
79 3842 : tmp = 0;
80 3842 : move16();
81 15368 : FOR( i = 27; i < 30; i++ )
82 : {
83 11526 : tmp = add( tmp, spe[i] ); /* Q0 */
84 : }
85 3842 : spe2q[17] = add( mult( tmp, 10923 ), 6 ); /* Q0 */
86 3842 : move16();
87 :
88 3842 : IF( GT_16( nb_sfm, SFM_N_STA_10k ) )
89 : {
90 3842 : tmp = 0;
91 3842 : move16();
92 23052 : FOR( i = 30; i < 35; i++ )
93 : {
94 19210 : tmp = add( tmp, spe[i] ); /* Q0 */
95 : }
96 3842 : spe2q[18] = add( mult( tmp, 6553 ), 7 ); /* Q0 */
97 3842 : move16();
98 :
99 3842 : tmp = 0;
100 3842 : move16();
101 38420 : FOR( i = 35; i < 44; i++ )
102 : {
103 34578 : tmp = add( tmp, spe[i] ); /* Q0 */
104 : }
105 3842 : spe2q[19] = add( mult( tmp, 3641 ), 8 ); /* Q0 */
106 3842 : move16();
107 : }
108 : }
109 :
110 3842 : return;
111 : }
112 :
113 : /*--------------------------------------------------------------------------*
114 : * mqb2sfm_fx()
115 : *
116 : * Map pbands to sub-vectors
117 : *--------------------------------------------------------------------------*/
118 :
119 3842 : static void mqb2sfm_fx(
120 : Word16 spe2q[], /* i : pbands Q0*/
121 : Word16 spe[], /* o : sub-vectors Q0*/
122 : const Word16 lnb_sfm /* i : number of norms Q0*/
123 : )
124 : {
125 : Word16 i;
126 :
127 3842 : spe[0] = spe2q[0]; /* Q0 */
128 3842 : move16();
129 3842 : spe[1] = spe2q[1]; /* Q0 */
130 3842 : move16();
131 3842 : spe[2] = spe2q[2]; /* Q0 */
132 3842 : move16();
133 3842 : spe[3] = spe2q[3]; /* Q0 */
134 3842 : move16();
135 3842 : spe[4] = spe2q[4]; /* Q0 */
136 3842 : move16();
137 3842 : spe[5] = spe2q[5]; /* Q0 */
138 3842 : move16();
139 3842 : spe[6] = spe2q[6]; /* Q0 */
140 3842 : move16();
141 3842 : spe[7] = spe2q[7]; /* Q0 */
142 3842 : move16();
143 3842 : spe[8] = spe2q[8]; /* Q0 */
144 3842 : move16();
145 3842 : spe[9] = spe2q[9]; /* Q0 */
146 3842 : move16();
147 :
148 3842 : spe[10] = spe2q[10]; /* Q0 */
149 3842 : move16();
150 3842 : spe[11] = spe2q[10]; /* Q0 */
151 3842 : move16();
152 :
153 3842 : spe[12] = spe2q[11]; /* Q0 */
154 3842 : move16();
155 3842 : spe[13] = spe2q[11]; /* Q0 */
156 3842 : move16();
157 :
158 3842 : spe[14] = spe2q[12]; /* Q0 */
159 3842 : move16();
160 3842 : spe[15] = spe2q[12]; /* Q0 */
161 3842 : move16();
162 :
163 3842 : spe[16] = spe2q[13]; /* Q0 */
164 3842 : move16();
165 3842 : spe[17] = spe2q[13]; /* Q0 */
166 3842 : move16();
167 :
168 3842 : spe[18] = spe2q[14]; /* Q0 */
169 3842 : move16();
170 3842 : spe[19] = spe2q[14]; /* Q0 */
171 3842 : move16();
172 :
173 19210 : FOR( i = 20; i < 24; i++ )
174 : {
175 15368 : spe[i] = spe2q[15]; /* Q0 */
176 15368 : move16();
177 : }
178 :
179 15368 : FOR( i = 24; i < 27; i++ )
180 : {
181 11526 : spe[i] = spe2q[16]; /* Q0 */
182 11526 : move16();
183 : }
184 :
185 3842 : IF( GT_16( lnb_sfm, SFM_N_STA_8k ) )
186 : {
187 15368 : FOR( i = 27; i < 30; i++ )
188 : {
189 11526 : spe[i] = spe2q[17]; /* Q0 */
190 11526 : move16();
191 : }
192 :
193 3842 : IF( GT_16( lnb_sfm, SFM_N_STA_10k ) )
194 : {
195 23052 : FOR( i = 30; i < 35; i++ )
196 : {
197 19210 : spe[i] = spe2q[18]; /* Q0 */
198 19210 : move16();
199 : }
200 :
201 38420 : FOR( i = 35; i < 44; i++ )
202 : {
203 34578 : spe[i] = spe2q[19]; /* Q0 */
204 34578 : move16();
205 : }
206 : }
207 : }
208 :
209 3842 : return;
210 : }
211 :
212 : /*--------------------------------------------------------------------------*
213 : * map_quant_weight_fx()
214 : *
215 : * Calculate the quantization weights
216 : *--------------------------------------------------------------------------*/
217 :
218 3842 : void map_quant_weight_fx(
219 : const Word16 normqlg2[], /* i : quantized norms Q0*/
220 : Word16 wnorm[], /* o : weighted norm Q0*/
221 : const Word16 is_transient /* i : transient flag Q0*/
222 : )
223 : {
224 : Word16 sfm;
225 : Word16 tmp16;
226 : Word16 spe2q[NUM_MAP_BANDS];
227 : Word16 spe[NB_SFM];
228 :
229 : Word16 spe2q_max;
230 : Word16 spe2q_min;
231 : Word16 norm_max;
232 : Word16 shift;
233 : Word16 sum;
234 : Word16 k;
235 : Word16 lnb_sfm, num_map_bands;
236 :
237 3842 : lnb_sfm = NB_SFM;
238 3842 : move16();
239 3842 : num_map_bands = NUM_MAP_BANDS;
240 3842 : move16();
241 :
242 3842 : IF( is_transient != 0 )
243 : {
244 4320 : FOR( sfm = 0; sfm < lnb_sfm; sfm += 4 )
245 : {
246 3960 : sum = 0;
247 3960 : move16();
248 19800 : FOR( k = 0; k < 4; k++ )
249 : {
250 15840 : sum = add( sum, normqlg2[sfm + k] ); /* Q0 */
251 : }
252 3960 : sum = shr( sum, 2 );
253 :
254 19800 : FOR( k = 0; k < 4; k++ )
255 : {
256 15840 : spe[sfm + k] = sum; /* Q0 */
257 15840 : move16();
258 : }
259 : }
260 : }
261 : ELSE
262 : {
263 156690 : FOR( sfm = 0; sfm < lnb_sfm; sfm++ )
264 : {
265 153208 : spe[sfm] = normqlg2[sfm]; /* Q0 */
266 153208 : move16();
267 : }
268 : }
269 :
270 3842 : sfm2mqb_fx( spe, spe2q, lnb_sfm );
271 :
272 80682 : FOR( sfm = 0; sfm < num_map_bands; sfm++ )
273 : {
274 76840 : spe2q[sfm] = sub( spe2q[sfm], 10 ); /* Q0 */
275 76840 : move16();
276 : }
277 :
278 : /* spectral smoothing */
279 76840 : FOR( sfm = 1; sfm < num_map_bands; sfm++ )
280 : {
281 72998 : tmp16 = sub( spe2q[sfm - 1], 4 ); /* Q0 */
282 72998 : spe2q[sfm] = s_max( spe2q[sfm], tmp16 ); /* Q0 */
283 72998 : move16();
284 : }
285 :
286 76840 : FOR( sfm = num_map_bands - 2; sfm >= 0; sfm-- )
287 : {
288 72998 : tmp16 = sub( spe2q[sfm + 1], 8 ); /* Q0 */
289 72998 : spe2q[sfm] = s_max( spe2q[sfm], tmp16 ); /* Q0 */
290 72998 : move16();
291 : }
292 :
293 80682 : FOR( sfm = 0; sfm < num_map_bands; sfm++ )
294 : {
295 76840 : spe2q[sfm] = s_max( spe2q[sfm], a_map[sfm] ); /* Q0 */
296 76840 : move16();
297 : }
298 :
299 : /* Saturate by the Absolute Threshold of Hearing */
300 3842 : spe2q_max = -32768;
301 3842 : move16();
302 3842 : spe2q_min = MAX_16;
303 3842 : move16();
304 :
305 80682 : FOR( sfm = 0; sfm < num_map_bands; sfm++ )
306 : {
307 76840 : spe2q[sfm] = sub( sfm_width[sfm], spe2q[sfm] ); /* Q0 */
308 76840 : move16();
309 76840 : spe2q_max = s_max( spe2q[sfm], spe2q_max ); /* Q0 */
310 76840 : spe2q_min = s_min( spe2q[sfm], spe2q_min ); /* Q0 */
311 : }
312 :
313 80682 : FOR( sfm = 0; sfm < num_map_bands; sfm++ )
314 : {
315 76840 : spe2q[sfm] = sub( spe2q[sfm], spe2q_min ); /* Q0 */
316 76840 : move16();
317 : }
318 :
319 3842 : spe2q_max = sub( spe2q_max, spe2q_min );
320 :
321 3842 : norm_max = norm_s( spe2q_max );
322 :
323 3842 : shift = sub( norm_max, 13 );
324 :
325 80682 : FOR( sfm = 0; sfm < num_map_bands; sfm++ )
326 : {
327 76840 : spe2q[sfm] = shl( spe2q[sfm], shift );
328 76840 : move16();
329 : }
330 :
331 3842 : mqb2sfm_fx( spe2q, spe, lnb_sfm );
332 :
333 3842 : IF( is_transient != 0 )
334 : {
335 4320 : FOR( sfm = 0; sfm < lnb_sfm; sfm += 4 )
336 : {
337 3960 : sum = 0;
338 3960 : move16();
339 19800 : FOR( k = 0; k < 4; k++ )
340 : {
341 15840 : sum = add( sum, spe[sfm + k] ); /* Q0 */
342 : }
343 3960 : sum = shr( sum, 2 );
344 19800 : FOR( k = 0; k < 4; k++ )
345 : {
346 15840 : spe[sfm + k] = sum; /* Q0 */
347 15840 : move16();
348 : }
349 : }
350 : }
351 :
352 : /* modify the norms for bit-allocation */
353 172890 : FOR( sfm = 0; sfm < lnb_sfm; sfm++ )
354 : {
355 169048 : wnorm[sfm] = add( spe[sfm], normqlg2[sfm] ); /* Q0 */
356 169048 : move16();
357 : }
358 :
359 3842 : return;
360 : }
|