Line data Source code
1 : /*====================================================================================
2 : EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
3 : ====================================================================================*/
4 :
5 : #include "options.h" /* Compilation switches */
6 : #include "stl.h" /* required for wmc_tool */
7 : #include "prot_fx.h" /* Function prototypes */
8 : #include "cnst.h" /* Common constants */
9 : #include "ivas_prot_fx.h"
10 :
11 : /*--------------------------------------------------------------------------*
12 : * hq_bit_allocation_fx()
13 : *
14 : * Assign bits for HQ fine structure coding with PVQ
15 : *--------------------------------------------------------------------------*/
16 :
17 7331 : void ivas_hq_bit_allocation_fx(
18 : const Word32 core_brate, /* i : Core bit-rate Q0 */
19 : const Word16 length, /* i : Frame length Q0 */
20 : const Word16 hqswb_clas, /* i : HQ class Q0 */
21 : Word16 *num_bits, /* i/o: Remaining bit budget Q0 */
22 : const Word16 *normqlg2, /* i : Quantized norms Q0 */
23 : const Word16 nb_sfm, /* i : Number sub bands to be encoded Q0 */
24 : const Word16 *sfmsize, /* i : Sub band bandwidths Q0 */
25 : Word16 *noise_level, /* o : HVQ noise level Q15 */
26 : Word16 *R, /* o : Bit allocation per sub band Q0 */
27 : Word16 *Rsubband, /* o : Fractional bit allocation Q3 */
28 : Word16 *sum, /* o : Sum of allocated shape bits Q0 */
29 : Word16 *core_sfm, /* o : Last coded band in core Q0 */
30 : const Word16 num_env_bands /* i : Number sub bands to be encoded for HQ_GEN Q0 */
31 : )
32 : {
33 : Word16 i;
34 : Word16 idx[NB_SFM];
35 : Word16 wnorm[NB_SFM];
36 : Word16 avrg_wnorm;
37 : Word16 tmp, tmp2;
38 : Word16 E_low;
39 : Word16 E_hb_mean;
40 : Word16 E_max;
41 : Word16 i_max;
42 : /* Temp */
43 :
44 7331 : Word16 sfm_limit = nb_sfm;
45 7331 : move16();
46 :
47 7331 : set16_fx( R, 0, NB_SFM );
48 280994 : FOR( i = 0; i < nb_sfm; i++ )
49 : {
50 273663 : idx[i] = i;
51 273663 : move16();
52 : }
53 7331 : test();
54 7331 : test();
55 7331 : test();
56 7331 : IF( NE_16( hqswb_clas, HQ_TRANSIENT ) && NE_16( hqswb_clas, HQ_HVQ ) && !( EQ_16( length, L_FRAME16k ) && LE_32( core_brate, HQ_32k ) ) )
57 : {
58 : /* 'nf_idx' 2-bits index written later */
59 5160 : *num_bits = sub( *num_bits, 2 ); /*Q0*/
60 5160 : move16();
61 : }
62 :
63 7331 : test();
64 7331 : IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
65 : {
66 2743 : IF( GE_32( core_brate, HQ_32k ) )
67 : {
68 0 : *num_bits = sub( *num_bits, HQ_GENERIC_SWB_NBITS2 ); /*Q0*/
69 : }
70 : ELSE
71 : {
72 2743 : *num_bits = sub( *num_bits, HQ_GENERIC_SWB_NBITS ); /*Q0*/
73 : }
74 2743 : move16();
75 :
76 2743 : IF( EQ_16( length, L_SPEC48k ) )
77 : {
78 2070 : *num_bits = sub( *num_bits, HQ_GENERIC_FB_NBITS ); /*Q0*/
79 2070 : move16();
80 : }
81 : }
82 :
83 7331 : test();
84 7331 : test();
85 7331 : IF( ( EQ_16( length, L_SPEC48k ) ) && ( NE_16( hqswb_clas, HQ_HARMONIC ) ) && ( NE_16( hqswb_clas, HQ_HVQ ) ) )
86 : {
87 3842 : tmp = 0;
88 3842 : move16();
89 3842 : IF( EQ_16( hqswb_clas, HQ_TRANSIENT ) )
90 : {
91 360 : tmp = 1;
92 360 : move16();
93 : }
94 3842 : map_quant_weight_fx( normqlg2, wnorm, tmp );
95 : }
96 : ELSE
97 : {
98 3489 : Copy( normqlg2, wnorm, nb_sfm );
99 : }
100 :
101 7331 : IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
102 : {
103 : /* classification and limit bandwidth for bit allocation */
104 708 : sfm_limit = sub( sfm_limit, 2 );
105 708 : move16();
106 708 : limit_band_noise_level_calc_fx( wnorm, &sfm_limit, core_brate, noise_level );
107 :
108 : /* Detect important band in high frequency region */
109 708 : E_low = sum16_fx( wnorm, SFM_G1 );
110 708 : i_max = 0;
111 708 : move16();
112 708 : E_max = MIN16B;
113 708 : move16();
114 708 : E_hb_mean = 0;
115 708 : move16();
116 12598 : FOR( i = SFM_G1; i < nb_sfm; i++ )
117 : {
118 11890 : E_hb_mean = add( E_hb_mean, wnorm[i] );
119 11890 : IF( GT_16( wnorm[i], E_max ) )
120 : {
121 1581 : E_max = wnorm[i];
122 1581 : move16();
123 1581 : i_max = i;
124 1581 : move16();
125 : }
126 : }
127 708 : E_hb_mean = shr( E_hb_mean, 4 ); /* Truncated division by SFM_G1 */
128 708 : set16_fx( wnorm + sfm_limit, -20, sub( nb_sfm, sfm_limit ) );
129 708 : IF( LE_32( L_msu0( L_deposit_l( E_low ), E_max, 15 ), 0 ) )
130 : {
131 310 : IF( LE_32( L_msu( L_deposit_h( E_hb_mean ), E_max, 21955 ), 0 ) ) /* 21955 = 0.67 (Q15) */
132 : {
133 152 : IF( GE_16( i_max, sfm_limit ) )
134 : {
135 5 : wnorm[i_max] = E_max;
136 5 : move16();
137 : }
138 : }
139 : }
140 : }
141 7331 : test();
142 7331 : test();
143 7331 : test();
144 7331 : test();
145 7331 : IF( EQ_16( hqswb_clas, HQ_HVQ ) )
146 : {
147 1229 : *sum = 0;
148 1229 : move16();
149 : }
150 6102 : ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || ( EQ_16( hqswb_clas, HQ_TRANSIENT ) && EQ_16( length, L_FRAME32k ) && LE_32( core_brate, HQ_32k ) ) )
151 : {
152 769 : *sum = BitAllocF_fx( wnorm, core_brate, *num_bits, nb_sfm, R, Rsubband, hqswb_clas, num_env_bands );
153 769 : move16();
154 : }
155 5333 : ELSE IF( EQ_16( length, L_FRAME16k ) && LE_32( core_brate, HQ_32k ) )
156 : {
157 476 : IF( NE_16( hqswb_clas, HQ_TRANSIENT ) )
158 : {
159 465 : avrg_wnorm = wnorm[10];
160 465 : move16();
161 3720 : FOR( i = 11; i < 18; i++ )
162 : {
163 3255 : avrg_wnorm = add( avrg_wnorm, wnorm[i] );
164 : }
165 :
166 465 : avrg_wnorm = shr( avrg_wnorm, 3 );
167 2325 : FOR( i = 0; i < 4; i++ ){
168 1860 : IF( LT_16( wnorm[i], avrg_wnorm ) ){
169 177 : wnorm[i] = avrg_wnorm;
170 177 : move16();
171 : }
172 : }
173 :
174 : /* Estimate number of bits per band */
175 465 : *sum = BitAllocWB_fx( wnorm, *num_bits, nb_sfm, R, Rsubband );
176 465 : move16();
177 : }
178 : ELSE
179 : {
180 11 : reordvct_fx( wnorm, nb_sfm, idx );
181 11 : bitalloc_fx( wnorm, idx, *num_bits, nb_sfm, QBIT_MAX2, R, sfmsize, hqswb_clas );
182 11 : bitallocsum_fx( R, nb_sfm, sum, Rsubband, *num_bits, length, sfmsize );
183 : }
184 : }
185 : ELSE
186 : {
187 4857 : reordvct_fx( wnorm, nb_sfm, idx );
188 :
189 : /* enlarge the wnorm value so that more bits can be allocated to (sfm_limit/2 ~ sfm_limit) range */
190 4857 : IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
191 : {
192 708 : tmp = shr( sfm_limit, 1 );
193 708 : tmp2 = sub( tmp, 1 );
194 9951 : FOR( i = tmp; i < sfm_limit; i++ )
195 : {
196 9243 : wnorm[i] = wnorm[tmp2];
197 9243 : move16();
198 : }
199 : }
200 4857 : bitalloc_fx( wnorm, idx, *num_bits, nb_sfm, QBIT_MAX2, R, sfmsize, hqswb_clas );
201 4857 : bitallocsum_fx( R, nb_sfm, sum, Rsubband, *num_bits, length, sfmsize );
202 : }
203 :
204 : /* Find last coded core band */
205 7331 : *core_sfm = sub( nb_sfm, 1 );
206 7331 : move16();
207 7331 : test();
208 7331 : test();
209 7331 : IF( hqswb_clas == HQ_NORMAL || EQ_16( hqswb_clas, HQ_HARMONIC ) )
210 : {
211 2882 : *core_sfm = find_last_band_fx( R, nb_sfm );
212 2882 : move16();
213 : }
214 4449 : ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
215 : {
216 2743 : *core_sfm = find_last_band_fx( R, nb_sfm );
217 2743 : move16();
218 2743 : IF( LT_16( *core_sfm, num_env_bands ) )
219 : {
220 2743 : *core_sfm = sub( num_env_bands, 1 );
221 2743 : move16();
222 : }
223 : }
224 :
225 7331 : *num_bits = sub( *num_bits, *sum );
226 7331 : move16();
227 :
228 7331 : return;
229 : }
230 397 : void hq_bit_allocation_fx(
231 : const Word32 core_brate, /* i : Core bit-rate Q0 */
232 : const Word16 length, /* i : Frame length Q0 */
233 : const Word16 hqswb_clas, /* i : HQ class Q0 */
234 : Word16 *num_bits, /* i/o: Remaining bit budget Q0 */
235 : const Word16 *normqlg2, /* i : Quantized norms Q0 */
236 : const Word16 nb_sfm, /* i : Number sub bands to be encoded Q0 */
237 : const Word16 *sfmsize, /* i : Sub band bandwidths Q0 */
238 : Word16 *noise_level, /* o : HVQ noise level Q15 */
239 : Word16 *R, /* o : Bit allocation per sub band Q0 */
240 : Word16 *Rsubband, /* o : Fractional bit allocation Q3 */
241 : Word16 *sum, /* o : Sum of allocated shape bits Q0 */
242 : Word16 *core_sfm, /* o : Last coded band in core Q0 */
243 : const Word16 num_env_bands /* i : Number sub bands to be encoded for HQ_GEN Q0 */
244 : )
245 : {
246 : Word16 i;
247 : Word16 idx[NB_SFM];
248 : Word16 wnorm[NB_SFM];
249 : Word16 avrg_wnorm;
250 : Word16 tmp, tmp2;
251 : Word16 E_low;
252 : Word16 E_hb_mean;
253 : Word16 E_max;
254 : Word16 i_max;
255 : /* Temp */
256 :
257 397 : Word16 sfm_limit = nb_sfm;
258 397 : move16();
259 :
260 397 : set16_fx( R, 0, NB_SFM );
261 15720 : FOR( i = 0; i < nb_sfm; i++ )
262 : {
263 15323 : idx[i] = i;
264 15323 : move16();
265 : }
266 397 : test();
267 397 : test();
268 397 : test();
269 397 : if ( NE_16( hqswb_clas, HQ_TRANSIENT ) && NE_16( hqswb_clas, HQ_HVQ ) && !( EQ_16( length, L_FRAME16k ) && EQ_32( core_brate, HQ_32k ) ) )
270 : {
271 : /* 'nf_idx' 2-bits index written later */
272 362 : *num_bits = sub( *num_bits, 2 );
273 : }
274 :
275 397 : test();
276 397 : IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
277 : {
278 46 : IF( EQ_32( core_brate, HQ_32k ) )
279 : {
280 0 : *num_bits = sub( *num_bits, HQ_GENERIC_SWB_NBITS2 );
281 0 : move16();
282 : }
283 : ELSE
284 : {
285 46 : *num_bits = sub( *num_bits, HQ_GENERIC_SWB_NBITS );
286 46 : move16();
287 : }
288 :
289 46 : if ( EQ_16( hqswb_clas, HQ_GEN_FB ) )
290 : {
291 0 : *num_bits = sub( *num_bits, HQ_GENERIC_FB_NBITS );
292 0 : move16();
293 : }
294 : }
295 :
296 397 : test();
297 397 : test();
298 397 : IF( ( EQ_16( length, L_FRAME48k ) ) && ( NE_16( hqswb_clas, HQ_HARMONIC ) ) && ( NE_16( hqswb_clas, HQ_HVQ ) ) )
299 : {
300 0 : tmp = 0;
301 0 : move16();
302 0 : if ( EQ_16( hqswb_clas, HQ_TRANSIENT ) )
303 : {
304 0 : tmp = 1;
305 0 : move16();
306 : }
307 0 : map_quant_weight_fx( normqlg2, wnorm, tmp );
308 : }
309 : ELSE
310 : {
311 397 : Copy( normqlg2, wnorm, nb_sfm );
312 : }
313 :
314 397 : IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
315 : {
316 : /* classification and limit bandwidth for bit allocation */
317 20 : sfm_limit = sub( sfm_limit, 2 );
318 20 : limit_band_noise_level_calc_fx( wnorm, &sfm_limit, core_brate, noise_level );
319 :
320 : /* Detect important band in high frequency region */
321 20 : E_low = sum16_fx( wnorm, SFM_G1 );
322 20 : i_max = 0;
323 20 : move16();
324 20 : E_max = MIN16B;
325 20 : move16();
326 20 : E_hb_mean = 0;
327 20 : move16();
328 320 : FOR( i = SFM_G1; i < nb_sfm; i++ )
329 : {
330 300 : E_hb_mean = add( E_hb_mean, wnorm[i] );
331 300 : IF( GT_16( wnorm[i], E_max ) )
332 : {
333 70 : E_max = wnorm[i];
334 70 : move16();
335 70 : i_max = i;
336 70 : move16();
337 : }
338 : }
339 20 : E_hb_mean = shr( E_hb_mean, 4 ); /* Truncated division by SFM_G1 */
340 20 : set16_fx( wnorm + sfm_limit, -20, sub( nb_sfm, sfm_limit ) );
341 20 : IF( L_msu0( L_deposit_l( E_low ), E_max, 15 ) <= 0 )
342 : {
343 11 : IF( L_msu( L_deposit_h( E_hb_mean ), E_max, 21955 ) <= 0 ) /* 21955 = 0.67 (Q15) */
344 : {
345 2 : if ( GE_16( i_max, sfm_limit ) )
346 : {
347 0 : wnorm[i_max] = E_max;
348 0 : move16();
349 : }
350 : }
351 : }
352 : }
353 397 : test();
354 397 : test();
355 397 : test();
356 397 : test();
357 397 : IF( EQ_16( hqswb_clas, HQ_HVQ ) )
358 : {
359 0 : *sum = 0;
360 0 : move16();
361 : }
362 397 : ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || ( EQ_16( hqswb_clas, HQ_TRANSIENT ) && EQ_16( length, L_FRAME32k ) && LE_32( core_brate, HQ_32k ) ) )
363 : {
364 46 : *sum = BitAllocF_fx( wnorm, core_brate, *num_bits, nb_sfm, R, Rsubband, hqswb_clas, num_env_bands );
365 46 : move16();
366 : }
367 351 : ELSE IF( EQ_16( length, L_FRAME16k ) && EQ_32( core_brate, HQ_32k ) )
368 : {
369 0 : IF( NE_16( hqswb_clas, HQ_TRANSIENT ) )
370 : {
371 0 : avrg_wnorm = wnorm[10];
372 0 : move16();
373 0 : FOR( i = 11; i < 18; i++ )
374 : {
375 0 : avrg_wnorm = add( avrg_wnorm, wnorm[i] );
376 : }
377 :
378 0 : avrg_wnorm = shr( avrg_wnorm, 3 );
379 0 : FOR( i = 0; i < 4; i++ )
380 : {
381 0 : if ( LT_16( wnorm[i], avrg_wnorm ) )
382 : {
383 0 : wnorm[i] = avrg_wnorm;
384 0 : move16();
385 : }
386 : }
387 :
388 : /* Estimate number of bits per band */
389 0 : *sum = BitAllocWB_fx( wnorm, *num_bits, nb_sfm, R, Rsubband );
390 0 : move16();
391 : }
392 : ELSE
393 : {
394 0 : reordvct_fx( wnorm, nb_sfm, idx );
395 0 : bitalloc_fx( wnorm, idx, *num_bits, nb_sfm, QBIT_MAX2, R, sfmsize, hqswb_clas );
396 0 : bitallocsum_fx( R, nb_sfm, sum, Rsubband, *num_bits, length, sfmsize );
397 : }
398 : }
399 : ELSE
400 : {
401 351 : reordvct_fx( wnorm, nb_sfm, idx );
402 :
403 : /* enlarge the wnorm value so that more bits can be allocated to (sfm_limit/2 ~ sfm_limit) range */
404 351 : IF( EQ_16( hqswb_clas, HQ_HARMONIC ) )
405 : {
406 20 : tmp = shr( sfm_limit, 1 );
407 20 : tmp2 = sub( tmp, 1 );
408 270 : FOR( i = tmp; i < sfm_limit; i++ )
409 : {
410 250 : wnorm[i] = wnorm[tmp2];
411 250 : move16();
412 : }
413 : }
414 351 : bitalloc_fx( wnorm, idx, *num_bits, nb_sfm, QBIT_MAX2, R, sfmsize, hqswb_clas );
415 351 : bitallocsum_fx( R, nb_sfm, sum, Rsubband, *num_bits, length, sfmsize );
416 : }
417 :
418 : /* Find last coded core band */
419 397 : *core_sfm = sub( nb_sfm, 1 );
420 397 : move16();
421 397 : test();
422 397 : test();
423 397 : IF( hqswb_clas == HQ_NORMAL || EQ_16( hqswb_clas, HQ_HARMONIC ) )
424 : {
425 316 : *core_sfm = find_last_band_fx( R, nb_sfm );
426 316 : move16();
427 : }
428 81 : ELSE IF( EQ_16( hqswb_clas, HQ_GEN_SWB ) || EQ_16( hqswb_clas, HQ_GEN_FB ) )
429 : {
430 46 : *core_sfm = find_last_band_fx( R, nb_sfm );
431 46 : move16();
432 46 : IF( LT_16( *core_sfm, num_env_bands ) )
433 : {
434 43 : *core_sfm = sub( num_env_bands, 1 );
435 43 : move16();
436 : }
437 : }
438 :
439 397 : *num_bits = sub( *num_bits, *sum );
440 397 : move16();
441 :
442 397 : return;
443 : }
|