Line data Source code
1 : /*====================================================================================
2 : EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
3 : ====================================================================================*/
4 :
5 :
6 : #include <stdint.h>
7 : #include "options.h"
8 : #include "basop_util.h"
9 : #include "vad_basop.h"
10 : //#include "prot_fx.h"
11 : #include "prot_fx.h" /* Function prototypes */
12 : #include "prot_fx_enc.h" /* Function prototypes */
13 : /*-------------------------------------------------------------------*
14 : * bg_music_decision_fx()
15 : *
16 : *
17 : * -------------------------------------------------------------------*/
18 3100 : void bg_music_decision_fx(
19 : VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */
20 : Word16 *music_backgound_f, /* i : background music flag*/
21 : Word32 frame_energy, /* i : current frame energy 1*/
22 : Word16 frame_energy_Q /* i : the Scaling of current frame energy*/
23 : )
24 : {
25 :
26 3100 : Word16 *f_tonality_rate = hVAD_CLDFB->f_tonality_rate;
27 3100 : Word16 *ltd_stable_rate = hVAD_CLDFB->ltd_stable_rate;
28 3100 : Word16 *sp_center = hVAD_CLDFB->sp_center;
29 3100 : Word16 *sSFM = hVAD_CLDFB->sfm;
30 : Word16 cmp_result;
31 : Word32 music_background_frame;
32 : Word32 tmp1;
33 : Word16 tmp1_Q;
34 : Word16 tmp_norm;
35 : Word32 frame_energy_Mcount;
36 : Word16 fg_energy_Qtmp;
37 :
38 :
39 3100 : music_background_frame = 0;
40 3100 : move32();
41 3100 : tmp1 = L_mult( hVAD_CLDFB->fg_energy_count, 18842 );
42 3100 : tmp1_Q = norm_l( tmp1 );
43 3100 : tmp1 = L_shl( tmp1, tmp1_Q );
44 3100 : tmp_norm = extract_h( tmp1 );
45 3100 : frame_energy_Mcount = MUL_F( frame_energy, tmp_norm );
46 :
47 3100 : fg_energy_Qtmp = sub( frame_energy_Q, 18 );
48 3100 : fg_energy_Qtmp = add( fg_energy_Qtmp, tmp1_Q );
49 :
50 3100 : cmp_result = VAD_L_CMP( frame_energy_Mcount, fg_energy_Qtmp, hVAD_CLDFB->fg_energy, hVAD_CLDFB->fg_energy_scale );
51 :
52 3100 : test();
53 3100 : IF( ( GT_16( f_tonality_rate[1], 9830 /* 0.6 Q14 */ ) ) || ( GT_16( f_tonality_rate[0], 14089 /* 0.86 Q14 */ ) ) )
54 : {
55 :
56 1745 : test();
57 1745 : test();
58 1745 : test();
59 1745 : test();
60 1745 : if ( ( LT_16( ltd_stable_rate[0], 2359 /* 0.072 Q15 */ ) ) && ( GT_16( sp_center[0], 1228 /* 1.2 Q10 */ ) ) && ( ( LT_16( sSFM[0], 24903 /* 0.76 Q15 */ ) ) || ( LT_16( sSFM[1], 28835 /* 0.88 Q15 */ ) ) || ( LT_16( sSFM[2], 31456 /* 0.96 Q15 */ ) ) ) )
61 : {
62 20 : music_background_frame = 1;
63 20 : move32();
64 : }
65 : }
66 :
67 3100 : test();
68 3100 : test();
69 3100 : IF( music_background_frame && ( cmp_result > 0 ) && ( EQ_32( hVAD_CLDFB->fg_energy_est_start, 1 ) ) )
70 : {
71 20 : hVAD_CLDFB->music_background_rate = add( mult( hVAD_CLDFB->music_background_rate, 31949 ), 819 );
72 20 : move16();
73 : }
74 3080 : ELSE IF( music_background_frame )
75 : {
76 0 : hVAD_CLDFB->music_background_rate = add( mult( hVAD_CLDFB->music_background_rate, 32702 ), 66 );
77 0 : move16();
78 : }
79 : ELSE
80 : {
81 3080 : hVAD_CLDFB->music_background_rate = mult( hVAD_CLDFB->music_background_rate, 32670 );
82 3080 : move16();
83 : }
84 :
85 3100 : *music_backgound_f = 0;
86 3100 : move16();
87 3100 : if ( GT_16( hVAD_CLDFB->music_background_rate, 16384 ) )
88 : {
89 0 : *music_backgound_f = 1;
90 0 : move16();
91 : }
92 3100 : }
93 : /*-------------------------------------------------------------------*
94 : * update_decision_fx()
95 : *
96 : *
97 : *-------------------------------------------------------------------*/
98 :
99 3100 : Word16 update_decision_fx(
100 : VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */
101 : const Word32 frame_energy, /* i : current frame energy*/
102 : Word32 HB_Power, /* i : current frame high frequency energy*/
103 : const Word16 frameloop, /* i : amount of frames*/
104 : const Word16 bw, /* i : band width index*/
105 : const Word16 frame_energy_Q, /* i : the Scaling of current frame energy*/
106 : const Word16 HB_Power_Q, /* i : the Scaling of current frame high frequency energy*/
107 : const Word32 snr, /* i : frequency domain SNR */
108 : const Word32 tsnr, /* i : time domain SNR */
109 : const Word16 vad_flag, /* i : VAD flag */
110 : const Word16 music_backgound_f /* i : background music flag*/
111 : )
112 : {
113 3100 : Word16 *sp_center = hVAD_CLDFB->sp_center;
114 3100 : Word16 *ltd_stable_rate = hVAD_CLDFB->ltd_stable_rate;
115 3100 : Word16 *sSFM = hVAD_CLDFB->sfm;
116 3100 : Word16 *f_tonality_rate = hVAD_CLDFB->f_tonality_rate;
117 :
118 : Word16 update_flag;
119 : Word16 tonality_flag;
120 : Word32 tmp1;
121 : Word16 tmp1_Q;
122 : Word16 tmp_norm;
123 : Word32 frame_energy_Mcount;
124 : Word32 lt_bg_highf_eng_trbl;
125 : Word16 flag_high_eng;
126 : Word16 fg_energy_Qtmp;
127 : Word16 cmp_result;
128 : Word16 tmpout;
129 : Word16 sp_center3_diff;
130 :
131 : Word16 Q_counter;
132 : Word16 Q_sum;
133 : Word32 sum_num, counter_den;
134 : Word16 div_r;
135 :
136 : Word16 div_r_Q;
137 : Word32 div_r_32;
138 :
139 :
140 3100 : update_flag = 1;
141 3100 : move16();
142 3100 : tonality_flag = 0;
143 3100 : move16();
144 :
145 3100 : lt_bg_highf_eng_trbl = MUL_F( hVAD_CLDFB->lt_bg_highf_eng, 24576 );
146 3100 : IF( GT_16( 14, HB_Power_Q ) )
147 : {
148 99 : lt_bg_highf_eng_trbl = L_shr( lt_bg_highf_eng_trbl, sub( 14, HB_Power_Q ) );
149 : }
150 : ELSE
151 : {
152 3001 : HB_Power = L_shr( HB_Power, s_min( 31, sub( HB_Power_Q, 14 ) ) );
153 : }
154 :
155 3100 : flag_high_eng = 0;
156 3100 : move16();
157 3100 : if ( GT_32( HB_Power, lt_bg_highf_eng_trbl ) )
158 : {
159 1093 : flag_high_eng = 1;
160 1093 : move16();
161 : }
162 :
163 3100 : sp_center3_diff = sub( sp_center[3], hVAD_CLDFB->lt_noise_sp_center3 );
164 :
165 3100 : IF( sub( frameloop, 50 ) > 0 )
166 : {
167 2947 : if ( GT_16( ltd_stable_rate[0], 3932 /* 0.12 Q15 */ ) )
168 :
169 : {
170 2825 : update_flag = 0;
171 2825 : move16();
172 : }
173 :
174 2947 : tmpout = VAD_L_CMP( frame_energy, sub( frame_energy_Q, 2 ), hVAD_CLDFB->frame_energy_smooth, hVAD_CLDFB->frame_energy_smooth_scale );
175 2947 : test();
176 2947 : IF( ( NE_16( bw, CLDFBVAD_NB_ID ) ) && tmpout > 0 )
177 : {
178 1649 : test();
179 1649 : if ( ( flag_high_eng ) && ( GT_16( sp_center3_diff, 409 ) ) )
180 : {
181 459 : update_flag = 0;
182 459 : move16();
183 : }
184 1649 : test();
185 1649 : if ( ( GT_16( sp_center[3], 2864 /* 2.8 Q10 */ ) ) && ( GT_16( ltd_stable_rate[0], 655 /* 0.02 Q15 */ ) ) )
186 : {
187 365 : update_flag = 0;
188 365 : move16();
189 : }
190 : }
191 : }
192 :
193 3100 : test();
194 3100 : if ( ( GT_16( f_tonality_rate[1], 8192 /* 0.5 Q14 */ ) ) && ( GT_16( ltd_stable_rate[0], 3277 /* 0.1 Q15 */ ) ) )
195 : {
196 2051 : update_flag = 0;
197 2051 : move16();
198 : }
199 :
200 3100 : test();
201 3100 : test();
202 3100 : IF( ( LT_16( sSFM[1], 30146 /* 0.92 Q15 */ ) ) && ( LT_16( sSFM[0], 30146 /* 0.92 Q15 */ ) ) && ( LT_16( sSFM[2], 30146 /* 0.92 Q15 */ ) ) )
203 : {
204 1669 : update_flag = 0;
205 1669 : move16();
206 : }
207 :
208 3100 : test();
209 3100 : test();
210 3100 : IF( ( LT_16( sSFM[0], 26214 /* 0.8 Q15 */ ) ) || ( LT_16( sSFM[1], 25558 /* 0.78 Q15 */ ) ) || ( LT_16( sSFM[2], 26214 /* 0.8 Q15 */ ) ) )
211 : {
212 2222 : update_flag = 0;
213 2222 : move16();
214 : }
215 :
216 : /*if(frame_energy > 32*hVAD_CLDFB->frame_energy_smooth)*/
217 3100 : tmpout = VAD_L_CMP( frame_energy, frame_energy_Q, hVAD_CLDFB->frame_energy_smooth, sub( hVAD_CLDFB->frame_energy_smooth_scale, 5 ) );
218 :
219 3100 : if ( tmpout > 0 )
220 : {
221 8 : update_flag = 0;
222 8 : move16();
223 : }
224 3100 : tmp1 = L_mult( hVAD_CLDFB->fg_energy_count, 18842 );
225 3100 : tmp1_Q = norm_l( tmp1 );
226 3100 : tmp1 = L_shl( tmp1, tmp1_Q );
227 3100 : tmp_norm = extract_h( tmp1 );
228 3100 : frame_energy_Mcount = MUL_F( frame_energy, tmp_norm );
229 :
230 3100 : fg_energy_Qtmp = sub( frame_energy_Q, 18 );
231 3100 : fg_energy_Qtmp = add( fg_energy_Qtmp, tmp1_Q );
232 :
233 3100 : cmp_result = VAD_L_CMP( frame_energy_Mcount, fg_energy_Qtmp, hVAD_CLDFB->fg_energy, hVAD_CLDFB->fg_energy_scale );
234 :
235 3100 : tmpout = VAD_L_CMP( frame_energy, frame_energy_Q, 3, 0 );
236 :
237 3100 : test();
238 3100 : test();
239 3100 : if ( ( cmp_result > 0 ) && ( EQ_32( hVAD_CLDFB->fg_energy_est_start, 1 ) ) && ( tmpout > 0 ) )
240 : {
241 1595 : update_flag = 0;
242 1595 : move16();
243 : }
244 :
245 3100 : test();
246 3100 : IF( ( GT_16( f_tonality_rate[1], 9830 /* 0.6 Q14 */ ) ) || ( GT_16( f_tonality_rate[0], 14089 /* 0.86 Q14 */ ) ) )
247 : {
248 1745 : update_flag = 0;
249 1745 : move16();
250 1745 : tonality_flag = 1;
251 1745 : move16();
252 : }
253 :
254 3100 : hVAD_CLDFB->tonality_rate3 = mult( hVAD_CLDFB->tonality_rate3, 32211 );
255 3100 : move16();
256 3100 : IF( tonality_flag )
257 : {
258 1745 : hVAD_CLDFB->tonality_rate3 = add( mult( hVAD_CLDFB->tonality_rate3, 32211 ), 557 );
259 1745 : move16();
260 : }
261 :
262 3100 : if ( GT_16( hVAD_CLDFB->tonality_rate3, 16384 ) )
263 : {
264 621 : update_flag = 0;
265 621 : move16();
266 : }
267 :
268 3100 : test();
269 3100 : if ( ( GT_16( sp_center[0], 4092 /* 4.0 Q10 */ ) ) && ( GT_16( ltd_stable_rate[0], 1311 /* 0.04 Q15 */ ) ) )
270 : {
271 168 : update_flag = 0;
272 168 : move16();
273 : }
274 :
275 3100 : test();
276 3100 : test();
277 3100 : if ( ( GT_16( f_tonality_rate[1], 7536 /* 0.46 Q14 */ ) ) && ( ( GT_16( sSFM[1], 30473 /* 0.93 Q15 */ ) ) || ( GT_16( ltd_stable_rate[0], 2949 /* 0.09 Q15 */ ) ) ) )
278 : {
279 2343 : update_flag = 0;
280 2343 : move16();
281 : }
282 :
283 3100 : test();
284 3100 : test();
285 3100 : test();
286 3100 : if ( ( LT_16( sSFM[1], 30473 /* 0.93 Q15 */ ) && LT_16( sSFM[0], 30146 /* 0.92 Q15 */ ) && LT_16( sSFM[2], 31784 /* 0.97 Q15 */ ) ) && ( GT_16( f_tonality_rate[1], 8192 /* 0.5 Q14 */ ) ) )
287 : {
288 1787 : update_flag = 0;
289 1787 : move16();
290 : }
291 :
292 3100 : test();
293 3100 : test();
294 3100 : if ( ( f_tonality_rate[1] > 7045 /* 0.43 Q14 */ ) && ( sSFM[0] < 31129 /* 0.95 Q15 */ ) && ( sp_center[1] > 1985 /* 1.94 Q10 */ ) )
295 : {
296 0 : update_flag = 0;
297 0 : move16();
298 : }
299 :
300 3100 : IF( EQ_16( update_flag, 1 ) )
301 : {
302 28 : IF( LT_16( hVAD_CLDFB->update_count, 1000 ) )
303 : {
304 28 : hVAD_CLDFB->update_count = add( hVAD_CLDFB->update_count, 1 );
305 28 : move16();
306 : }
307 : }
308 :
309 :
310 3100 : IF( update_flag )
311 : {
312 28 : hVAD_CLDFB->lt_noise_sp_center3 = add( mult( hVAD_CLDFB->lt_noise_sp_center3, 29491 ), mult( sp_center[3], 3277 ) );
313 28 : move16();
314 : }
315 :
316 :
317 3100 : tmpout = VAD_L_CMP( frame_energy, frame_energy_Q, hVAD_CLDFB->frame_energy_smooth, sub( hVAD_CLDFB->frame_energy_smooth_scale, 2 ) );
318 :
319 :
320 3100 : test();
321 3100 : test();
322 3100 : test();
323 3100 : test();
324 3100 : if ( ( tmpout > 0 ) && ( LT_16( frameloop, 100 ) ) && ( LT_16( f_tonality_rate[1], 9174 /* 0.56 Q14 */ ) ) && ( ( LT_16( sp_center[0], 1391 /* 1.36 Q10 */ ) ) || LT_16( ltd_stable_rate[0], 983 /* 0.03 Q15 */ ) ) )
325 : {
326 0 : update_flag = 1;
327 0 : move16();
328 : }
329 :
330 3100 : test();
331 3100 : test();
332 3100 : test();
333 3100 : test();
334 3100 : test();
335 3100 : test();
336 3100 : if ( ( LT_32( snr, 10066329 /* 0.3 Q25 */ ) ) && tmpout < 0 && ( LT_32( L_shr( tsnr, 1 ), 20132659 /* 1.2/2.0 Q25 */ ) ) && ( vad_flag == 0 ) && ( LT_16( hVAD_CLDFB->f_tonality_rate[1], 8192 /* 0.5 Q14 */ ) ) && ( music_backgound_f == 0 ) && ( LT_16( hVAD_CLDFB->ltd_stable_rate[3], 3277 /* 0.1 Q15 */ ) ) )
337 : {
338 16 : update_flag = 1;
339 16 : move16();
340 : }
341 :
342 3100 : test();
343 3100 : test();
344 3100 : test();
345 3100 : if ( vad_flag && GT_32( snr, 33554431 /* 1.0 Q25 */ ) && EQ_16( bw, CLDFBVAD_SWB_ID ) && tmpout > 0 )
346 : {
347 305 : update_flag = 0;
348 305 : move16();
349 : }
350 :
351 3100 : test();
352 3100 : test();
353 3100 : test();
354 3100 : if ( vad_flag && GT_32( snr, 50331647 /* 1.5 Q25 */ ) && NE_16( bw, CLDFBVAD_SWB_ID ) && tmpout > 0 )
355 : {
356 0 : update_flag = 0;
357 0 : move16();
358 : }
359 :
360 :
361 3100 : IF( update_flag == 0 )
362 : {
363 3070 : hVAD_CLDFB->update_num_with_snr = 0;
364 3070 : move16();
365 : }
366 : ELSE
367 : {
368 30 : test();
369 30 : test();
370 30 : IF( vad_flag && GT_32( snr, 100663293 /* 3.0 Q25 */ ) && LT_16( hVAD_CLDFB->update_num_with_snr, 10 ) )
371 : {
372 0 : update_flag = 0;
373 0 : move16();
374 0 : hVAD_CLDFB->update_num_with_snr = add( hVAD_CLDFB->update_num_with_snr, 1 );
375 0 : move16();
376 : }
377 : }
378 :
379 :
380 3100 : test();
381 3100 : IF( vad_flag == 0 || EQ_16( update_flag, 1 ) )
382 : {
383 : Word16 tmp_fix;
384 90 : tmp_fix = sub( hVAD_CLDFB->sp_center[2], hVAD_CLDFB->lt_noise_sp_center0 );
385 90 : tmp_fix = abs_s( tmp_fix );
386 90 : if ( GT_16( tmp_fix, 2558 /* 2.5 Q10 */ ) )
387 : {
388 0 : tmp_fix = 2558 /* 2.5 Q10 */;
389 0 : move16();
390 : }
391 90 : hVAD_CLDFB->lt_noise_sp_center_diff_sum = L_add( hVAD_CLDFB->lt_noise_sp_center_diff_sum, tmp_fix );
392 90 : move32();
393 :
394 90 : hVAD_CLDFB->lt_noise_sp_center_diff_counter = L_add( hVAD_CLDFB->lt_noise_sp_center_diff_counter, 1 );
395 90 : move32();
396 90 : IF( EQ_32( hVAD_CLDFB->lt_noise_sp_center_diff_counter, 128 ) )
397 : {
398 0 : hVAD_CLDFB->lt_noise_sp_center_diff_sum = MUL_F( hVAD_CLDFB->lt_noise_sp_center_diff_sum, 24576 );
399 0 : move32();
400 0 : hVAD_CLDFB->lt_noise_sp_center_diff_counter = 96;
401 0 : move32();
402 : }
403 :
404 90 : IF( GT_16( (Word16) abs_s( sub( hVAD_CLDFB->sp_center[0], hVAD_CLDFB->lt_noise_sp_center0 ) ), 2455 /* 2.4 Q10 */ ) )
405 : {
406 0 : hVAD_CLDFB->lt_noise_sp_center0 = add( mult( hVAD_CLDFB->lt_noise_sp_center0, 32637 ), mult( hVAD_CLDFB->sp_center[0], 131 ) );
407 0 : move16();
408 : }
409 90 : ELSE IF( GT_16( (Word16) abs_s( sub( hVAD_CLDFB->sp_center[0], hVAD_CLDFB->lt_noise_sp_center0 ) ), 1023 /* 1.0 Q10 */ ) )
410 : {
411 0 : hVAD_CLDFB->lt_noise_sp_center0 = add( mult( hVAD_CLDFB->lt_noise_sp_center0, 32440 ), mult( hVAD_CLDFB->sp_center[0], 328 ) );
412 0 : move16();
413 : }
414 : ELSE
415 : {
416 90 : hVAD_CLDFB->lt_noise_sp_center0 = add( mult( hVAD_CLDFB->lt_noise_sp_center0, 31457 ), mult( hVAD_CLDFB->sp_center[0], 1311 ) );
417 90 : move16();
418 : }
419 : }
420 :
421 3100 : Q_sum = sub( norm_l( hVAD_CLDFB->lt_noise_sp_center_diff_sum ), 1 );
422 3100 : Q_counter = norm_l( hVAD_CLDFB->lt_noise_sp_center_diff_counter );
423 3100 : sum_num = L_shl( hVAD_CLDFB->lt_noise_sp_center_diff_sum, Q_sum );
424 3100 : counter_den = L_shl( hVAD_CLDFB->lt_noise_sp_center_diff_counter, Q_counter );
425 :
426 3100 : IF( extract_h( counter_den ) == 0 )
427 : {
428 0 : div_r = EVS_SW_MAX;
429 0 : move16();
430 : }
431 : ELSE
432 : {
433 3100 : div_r = div_l( sum_num, extract_h( counter_den ) );
434 : }
435 :
436 3100 : div_r = mult( div_r, 24576 );
437 3100 : div_r_32 = VAD_L_ADD( L_deposit_l( div_r ), add( sub( Q_sum, Q_counter ), 22 ), 9830, 15, &div_r_Q );
438 3100 : div_r = extract_l( L_shr( div_r_32, sub( div_r_Q, SP_CENTER_Q ) ) );
439 :
440 3100 : test();
441 3100 : if ( ( GT_16( abs_s( sub( hVAD_CLDFB->sp_center[2], hVAD_CLDFB->lt_noise_sp_center0 ) ), div_r ) ) && ( GT_16( frameloop, 200 ) ) )
442 : {
443 133 : update_flag = 0;
444 133 : move16();
445 : }
446 :
447 :
448 3100 : return update_flag;
449 : }
|