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 "cnst.h" /* Common constants */
9 : #include "basop_util.h"
10 : #include "vad_basop.h"
11 : //#include "prot_fx.h"
12 : #include "rom_enc.h" /* Encoder static table prototypes */
13 : #include "rom_com.h" /* Common constants */
14 : #include "prot_fx.h" /* Function prototypes */
15 : #include "basop_util.h" /* Function prototypes */
16 : #include "prot_fx_enc.h"
17 :
18 :
19 : /*-------------------------------------------------------------------*
20 : * local function prototypes
21 : *-------------------------------------------------------------------*/
22 :
23 : /* only one is activated in below preprocessing*/
24 : /*#define CLDFB_VAD*/ /* test on the CLDFB-VAD */
25 :
26 3100 : static Word16 comvad_hangover(
27 : const Word32 lt_snr_org, /* i : original long time SNR Q25*/
28 : const Word32 snr, /* i : frequency domain SNR Q25*/
29 : const Word32 l_snr, /* i : long time frequency domain SNR calculated by l_speech_snr and l_silence_snr Q25*/
30 : const Word32 snr_flux, /* i : average tsnr Q25*/
31 : const Word16 bw_index, /* i : band width index*/
32 : const Word16 vad_flag,
33 : const Word16 pre_res_hang_num, /* i : residual amount of previous hangover */
34 : const Word16 continuous_speech_num2, /* i : amount of continuous speech frames*/
35 : const Word16 noisy_type /* i : noisy type*/
36 : )
37 : {
38 : Word32 l_snr_add;
39 : Word16 speech_flag;
40 :
41 :
42 3100 : speech_flag = pre_res_hang_num;
43 3100 : move16();
44 :
45 3100 : IF( EQ_16( bw_index, CLDFBVAD_SWB_ID ) )
46 : {
47 3100 : IF( vad_flag )
48 : {
49 2994 : speech_flag = 4;
50 2994 : move16();
51 2994 : if ( GT_32( lt_snr_org, 117440509 /* 3.5 Q25 */ ) )
52 : {
53 2943 : speech_flag = 3;
54 2943 : move16();
55 : }
56 :
57 2994 : test();
58 2994 : test();
59 2994 : IF( ( LT_16( continuous_speech_num2, 8 ) ) && ( LT_32( lt_snr_org, 134217724 /* 4.0 Q25 */ ) ) )
60 : {
61 24 : speech_flag = sub( 8, continuous_speech_num2 );
62 : }
63 2970 : ELSE IF( ( GT_32( snr_flux, 26843545 /* 0.8 Q25 */ ) ) && ( GT_16( continuous_speech_num2, 24 ) ) )
64 : {
65 2843 : IF( GT_32( lt_snr_org, 120795952 /* 3.6 Q25 */ ) )
66 : {
67 2843 : speech_flag = 3;
68 2843 : move16();
69 : }
70 0 : ELSE IF( GT_32( lt_snr_org, 87241521 /* 2.6 Q25 */ ) )
71 : {
72 0 : speech_flag = 3;
73 0 : move16();
74 : }
75 0 : ELSE IF( GT_32( lt_snr_org, 53687090 /* 1.6 Q25 */ ) )
76 : {
77 0 : speech_flag = 4;
78 0 : move16();
79 : }
80 : ELSE
81 : {
82 0 : speech_flag = 5;
83 0 : move16();
84 : }
85 2843 : speech_flag = sub( speech_flag, 1 );
86 : }
87 :
88 2994 : IF( LT_16( continuous_speech_num2, 120 ) )
89 : {
90 626 : test();
91 626 : IF( GT_32( snr, 50331647 /* 1.5 Q25 */ ) )
92 : {
93 601 : speech_flag = 9;
94 601 : move16();
95 : }
96 25 : ELSE IF( GT_32( snr, 33554431 /* 1.0 Q25 */ ) && LT_16( speech_flag, 7 ) )
97 : {
98 6 : speech_flag = 7;
99 6 : move16();
100 : }
101 19 : ELSE IF( LT_16( speech_flag, 3 ) )
102 : {
103 0 : speech_flag = 3;
104 0 : move16();
105 : }
106 626 : if ( GT_16( speech_flag, 3 ) )
107 : {
108 607 : speech_flag = sub( speech_flag, 2 );
109 : }
110 : }
111 : ELSE
112 : {
113 2368 : IF( GT_32( lt_snr_org, 120795952 /* 3.6 Q25 */ ) )
114 : {
115 2368 : speech_flag = 1;
116 2368 : move16();
117 : }
118 0 : ELSE IF( GT_32( lt_snr_org, 100663293 /* 3.0 Q25 */ ) )
119 : {
120 0 : speech_flag = 2;
121 0 : move16();
122 : }
123 0 : ELSE IF( GT_32( lt_snr_org, 83886078 /* 2.5 Q25 */ ) )
124 : {
125 0 : speech_flag = 3;
126 0 : move16();
127 : }
128 0 : ELSE IF( GT_32( lt_snr_org, 67108862 /* 2.0 Q25 */ ) )
129 : {
130 0 : speech_flag = 3;
131 0 : move16();
132 : }
133 0 : ELSE IF( GT_32( lt_snr_org, 50331647 /* 1.5 Q25 */ ) )
134 : {
135 0 : speech_flag = 4;
136 0 : move16();
137 : }
138 : ELSE
139 : {
140 0 : speech_flag = 5;
141 0 : move16();
142 : }
143 : }
144 :
145 2994 : if ( EQ_16( noisy_type, SILENCE ) )
146 : {
147 1983 : speech_flag = 6;
148 1983 : move16();
149 : }
150 : }
151 : }
152 0 : ELSE IF( EQ_16( bw_index, CLDFBVAD_WB_ID ) )
153 : {
154 0 : IF( vad_flag )
155 : {
156 0 : IF( GT_32( lt_snr_org, 117440509 /* 3.5 Q25 */ ) )
157 : {
158 0 : speech_flag = 1;
159 0 : move16();
160 : }
161 : ELSE
162 : {
163 0 : speech_flag = 2;
164 0 : move16();
165 : }
166 :
167 0 : test();
168 0 : test();
169 0 : IF( ( LT_16( continuous_speech_num2, 8 ) ) && ( LT_32( lt_snr_org, 134217724 /* 4.0 Q25 */ ) ) )
170 : {
171 0 : speech_flag = sub( 8, continuous_speech_num2 );
172 : }
173 0 : ELSE IF( ( GT_32( snr_flux, 30198988 /* 0.9 Q25 */ ) ) && ( GT_16( continuous_speech_num2, 50 ) ) )
174 : {
175 0 : IF( GT_32( lt_snr_org, 120795952 /* 3.6 Q25 */ ) )
176 : {
177 0 : speech_flag = 1;
178 0 : move16();
179 : }
180 0 : ELSE IF( GT_32( lt_snr_org, 87241521 /* 2.6 Q25 */ ) )
181 : {
182 0 : speech_flag = 5;
183 0 : move16();
184 : }
185 0 : ELSE IF( GT_32( lt_snr_org, 53687090 /* 1.6 Q25 */ ) )
186 : {
187 0 : speech_flag = 6;
188 0 : move16();
189 : }
190 : ELSE
191 : {
192 0 : speech_flag = 7;
193 0 : move16();
194 : }
195 0 : IF( GT_16( speech_flag, 1 ) )
196 : {
197 0 : speech_flag = sub( speech_flag, 1 );
198 : }
199 : }
200 :
201 0 : IF( LT_16( continuous_speech_num2, 120 ) )
202 : {
203 0 : test();
204 0 : test();
205 0 : test();
206 0 : IF( GT_32( snr, 50331647 /* 1.5 Q25 */ ) )
207 : {
208 0 : speech_flag = 6;
209 0 : move16();
210 : }
211 0 : ELSE IF( GT_32( snr, 33554431 /* 1.0 Q25 */ ) && LT_16( speech_flag, 5 ) )
212 : {
213 0 : speech_flag = 5;
214 0 : move16();
215 : }
216 0 : ELSE IF( GT_32( snr, 26843545 /* 0.8 Q25 */ ) && LT_32( lt_snr_org, 67108862 /* 2.0 Q25 */ ) && LT_16( speech_flag, 4 ) )
217 : {
218 0 : speech_flag = 4;
219 0 : move16();
220 : }
221 0 : ELSE IF( LT_16( speech_flag, 3 ) )
222 : {
223 0 : speech_flag = 3;
224 0 : move16();
225 : }
226 : }
227 : ELSE
228 : {
229 0 : IF( GT_32( lt_snr_org, 120795952 /* 3.6 Q25 */ ) )
230 : {
231 0 : speech_flag = 1;
232 0 : move16();
233 : }
234 0 : ELSE IF( GT_32( lt_snr_org, 100663293 /* 3.0 Q25 */ ) )
235 : {
236 0 : speech_flag = 2;
237 0 : move16();
238 : }
239 0 : ELSE IF( GT_32( lt_snr_org, 83886078 /* 2.5 Q25 */ ) )
240 : {
241 0 : speech_flag = 2;
242 0 : move16();
243 : }
244 0 : ELSE IF( GT_32( lt_snr_org, 67108862 /* 2.0 Q25 */ ) )
245 : {
246 0 : speech_flag = 3;
247 0 : move16();
248 : }
249 : ELSE
250 : {
251 0 : speech_flag = 3;
252 0 : move16();
253 : }
254 : }
255 :
256 0 : if ( EQ_16( noisy_type, SILENCE ) )
257 : {
258 0 : speech_flag = 6;
259 0 : move16();
260 : }
261 : }
262 : }
263 : ELSE /* NB */
264 : {
265 0 : IF( vad_flag )
266 : {
267 0 : l_snr_add = L_add( 0x0199999a, MUL_F( l_snr, 0x0ccd ) );
268 :
269 0 : IF( GT_32( lt_snr_org, 117440509 /* 3.5 Q25 */ ) )
270 : {
271 0 : speech_flag = 3;
272 0 : move16();
273 : }
274 : ELSE
275 : {
276 0 : speech_flag = 4;
277 0 : move16();
278 : }
279 :
280 0 : test();
281 0 : test();
282 0 : IF( ( LT_16( continuous_speech_num2, 8 ) ) && ( LT_32( lt_snr_org, 134217724 /* 4.0 Q25 */ ) ) )
283 : {
284 0 : speech_flag = sub( 8, continuous_speech_num2 );
285 : }
286 0 : ELSE IF( ( GT_32( snr_flux, l_snr_add ) ) && ( GT_16( continuous_speech_num2, 24 ) ) )
287 : {
288 0 : IF( GT_32( lt_snr_org, 120795952 /* 3.6 Q25 */ ) )
289 : {
290 0 : speech_flag = 3;
291 0 : move16();
292 : }
293 0 : ELSE IF( GT_32( lt_snr_org, 87241521 /* 2.6 Q25 */ ) )
294 : {
295 0 : speech_flag = 8;
296 0 : move16();
297 : }
298 0 : ELSE IF( GT_32( lt_snr_org, 40265317 /* 1.2 Q25 */ ) )
299 : {
300 0 : speech_flag = 10;
301 0 : move16();
302 : }
303 : ELSE
304 : {
305 0 : speech_flag = 12;
306 0 : move16();
307 : }
308 :
309 0 : IF( GT_16( speech_flag, 2 ) )
310 : {
311 0 : speech_flag = sub( speech_flag, 2 );
312 : }
313 : }
314 :
315 0 : IF( LT_16( continuous_speech_num2, 120 ) )
316 : {
317 0 : test();
318 0 : test();
319 0 : IF( GT_32( snr, 50331647 /* 1.5 Q25 */ ) )
320 : {
321 0 : speech_flag = 10;
322 0 : move16();
323 : }
324 0 : ELSE IF( GT_32( snr, 33554431 /* 1.0 Q25 */ ) && LT_16( speech_flag, 7 ) )
325 : {
326 0 : speech_flag = 7;
327 0 : move16();
328 : }
329 0 : ELSE IF( LT_16( speech_flag, 3 ) && GT_16( continuous_speech_num2, 12 ) )
330 : {
331 0 : speech_flag = 3;
332 0 : move16();
333 : }
334 : }
335 : ELSE
336 : {
337 0 : IF( GT_32( lt_snr_org, 120795952 /* 3.6 Q25 */ ) )
338 : {
339 0 : speech_flag = 2;
340 0 : move16();
341 : }
342 0 : ELSE IF( GT_32( lt_snr_org, 100663293 /* 3.0 Q25 */ ) )
343 : {
344 0 : speech_flag = 2;
345 0 : move16();
346 : }
347 0 : ELSE IF( GT_32( lt_snr_org, 83886078 /* 2.5 Q25 */ ) )
348 : {
349 0 : speech_flag = 3;
350 0 : move16();
351 : }
352 0 : ELSE IF( GT_32( lt_snr_org, 67108862 /* 2.0 Q25 */ ) )
353 : {
354 0 : speech_flag = 3;
355 0 : move16();
356 : }
357 0 : ELSE IF( GT_32( lt_snr_org, 50331647 /* 1.5 Q25 */ ) )
358 : {
359 0 : speech_flag = 4;
360 0 : move16();
361 : }
362 : ELSE
363 : {
364 0 : speech_flag = 4;
365 0 : move16();
366 : }
367 : }
368 :
369 0 : if ( EQ_16( noisy_type, SILENCE ) )
370 : {
371 0 : speech_flag = 2;
372 0 : move16();
373 : }
374 : }
375 : }
376 :
377 :
378 3100 : IF( ( EQ_16( vad_flag, 1 ) ) )
379 : {
380 2994 : IF( ( NE_16( noisy_type, SILENCE ) ) )
381 : {
382 1011 : speech_flag = sub( speech_flag, 1 );
383 : }
384 : ELSE
385 : {
386 1983 : speech_flag = sub( speech_flag, 3 );
387 : }
388 2994 : speech_flag = s_max( speech_flag, 0 );
389 : }
390 :
391 :
392 3100 : return speech_flag;
393 : }
394 :
395 :
396 3100 : Word16 comvad_decision_fx(
397 : VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */
398 : const Word32 l_snr, /* i : long time frequency domain Q25*/
399 : const Word32 lt_snr_org, /* i : original long time SNR Q25*/
400 : const Word32 lt_snr, /* i : long time SNR calculated by fg_energy and bg_energy Q25*/
401 : const Word32 snr_flux, /* i : average tsnr of several frames Q25*/
402 : const Word32 snr, /* i : frequency domain SNR Q25 */
403 : Word32 tsnr, /* i : time domain SNR Q25*/
404 : const Word32 frame_energy, /* i : current frame energy Q(frame_energy_Q)*/
405 : const Word16 music_backgound_f, /* i : background music flag*/
406 : const Word16 frame_energy_Q, /* i : the Scaling of current frame energy*/
407 : Word16 *cldfb_addition, /* o : adjust the harmonized hangover */
408 : const Word16 vada_flag )
409 : {
410 : Word16 speech_flag;
411 : Word32 fg_energy;
412 : Word32 bg_energy;
413 : Word32 tmp_snr;
414 : Word16 vad_flag;
415 : Word16 vadb_flag;
416 : Word32 l_silence_snr_count;
417 : Word32 snr_sub;
418 : Word32 snr_div_fix32;
419 : Word32 l_silence_snr;
420 :
421 : Word16 snr_div_fix;
422 : Word16 Qnorm_silence, Qnorm_silence_count;
423 : Word16 tmpout;
424 : Word16 noisy_type;
425 : Word32 lt_snr_org_cmp;
426 :
427 :
428 : /* avoid overflows in the following if conditions */
429 3100 : tsnr = L_shr( tsnr, 1 );
430 :
431 3100 : noisy_type = UNKNOWN_NOISE;
432 3100 : move16();
433 3100 : speech_flag = hVAD_CLDFB->speech_flag;
434 3100 : move16();
435 3100 : fg_energy = hVAD_CLDFB->fg_energy;
436 3100 : move32();
437 3100 : bg_energy = hVAD_CLDFB->bg_energy;
438 3100 : move32();
439 :
440 3100 : Qnorm_silence = 0;
441 3100 : move16();
442 3100 : Qnorm_silence_count = 0;
443 3100 : move16();
444 :
445 3100 : test();
446 3100 : if ( GT_32( hVAD_CLDFB->lf_snr_smooth, LS_MIN_SILENCE_SNR[hVAD_CLDFB->bw_index - CLDFBVAD_NB_ID] ) && GT_32( lt_snr_org, LT_MIN_SILENCE_SNR_FX[hVAD_CLDFB->bw_index - CLDFBVAD_NB_ID] ) )
447 : {
448 1983 : noisy_type = SILENCE;
449 1983 : move16();
450 : }
451 :
452 3100 : tmp_snr = construct_snr_thresh_fx( hVAD_CLDFB->sp_center, snr_flux, lt_snr, l_snr, hVAD_CLDFB->continuous_speech_num,
453 3100 : hVAD_CLDFB->continuous_noise_num, hVAD_CLDFB->fg_energy_est_start, hVAD_CLDFB->bw_index );
454 :
455 :
456 3100 : vad_flag = 0;
457 3100 : move16();
458 3100 : if ( GT_32( snr, tmp_snr ) )
459 : {
460 2606 : vad_flag = 1;
461 2606 : move16();
462 : }
463 :
464 3100 : if ( GT_32( tsnr, 67108862 /* 4.0/2.0 Q25 */ ) )
465 : {
466 2878 : vad_flag = 1;
467 2878 : move16();
468 : }
469 :
470 3100 : IF( GT_16( hVAD_CLDFB->frameloop, 25 ) )
471 : {
472 3022 : test();
473 3022 : IF( EQ_16( vad_flag, 1 ) && EQ_32( hVAD_CLDFB->fg_energy_est_start, 1 ) )
474 : {
475 : Word32 frame_energy_mult_fix32, bg_energy_mult_fix32;
476 : Word16 frame_energy_mult_Q, bg_energy_mult_Q;
477 :
478 2830 : IF( EQ_16( hVAD_CLDFB->fg_energy_count, 512 ) )
479 : {
480 12 : fg_energy = MUL_F( fg_energy, 0x6000 /*.75f in Q15*/ );
481 12 : hVAD_CLDFB->fg_energy_count = 384;
482 12 : move16();
483 : }
484 :
485 2830 : frame_energy_mult_fix32 = MUL_F( frame_energy, hVAD_CLDFB->bg_energy_count );
486 2830 : frame_energy_mult_Q = sub( frame_energy_Q, 15 );
487 :
488 2830 : bg_energy_mult_fix32 = MUL_F( bg_energy, 6 );
489 2830 : bg_energy_mult_Q = sub( hVAD_CLDFB->bg_energy_scale, 15 );
490 :
491 2830 : IF( GT_16( frame_energy_mult_Q, bg_energy_mult_Q ) )
492 : {
493 0 : frame_energy_mult_fix32 = L_shr( frame_energy_mult_fix32, sub( frame_energy_mult_Q, bg_energy_mult_Q ) );
494 : }
495 2830 : IF( LT_16( frame_energy_mult_Q, bg_energy_mult_Q ) )
496 : {
497 2830 : bg_energy_mult_fix32 = L_shr( bg_energy_mult_fix32, limitScale32( sub( bg_energy_mult_Q, frame_energy_mult_Q ) ) );
498 : }
499 :
500 2830 : IF( GT_32( frame_energy_mult_fix32, bg_energy_mult_fix32 ) )
501 : {
502 2830 : fg_energy = VAD_L_ADD( fg_energy, hVAD_CLDFB->fg_energy_scale, frame_energy, frame_energy_Q, &hVAD_CLDFB->fg_energy_scale );
503 2830 : hVAD_CLDFB->fg_energy_count = add( hVAD_CLDFB->fg_energy_count, 1 );
504 2830 : move16();
505 : }
506 : }
507 : }
508 :
509 3100 : if ( music_backgound_f )
510 : {
511 0 : vad_flag = 1;
512 0 : move16();
513 : }
514 :
515 3100 : IF( EQ_16( vad_flag, 1 ) )
516 : {
517 2878 : IF( hVAD_CLDFB->l_silence_snr == 0 )
518 : {
519 0 : snr_div_fix = 0;
520 0 : move16();
521 : }
522 : ELSE
523 : {
524 2878 : Qnorm_silence = sub( norm_l( hVAD_CLDFB->l_silence_snr ), 1 );
525 2878 : Qnorm_silence_count = norm_l( hVAD_CLDFB->l_silence_snr_count );
526 2878 : l_silence_snr = L_shl( hVAD_CLDFB->l_silence_snr, Qnorm_silence );
527 2878 : l_silence_snr_count = L_shl( hVAD_CLDFB->l_silence_snr_count, Qnorm_silence_count );
528 2878 : snr_div_fix = div_l( l_silence_snr, extract_h( l_silence_snr_count ) );
529 : }
530 2878 : snr_sub = L_sub( snr, 0x3000000 /*1.5f in Q25*/ );
531 2878 : snr_div_fix32 = L_deposit_l( snr_div_fix );
532 2878 : snr_div_fix32 = L_shr( snr_div_fix32, add( 6, sub( Qnorm_silence, Qnorm_silence_count ) ) );
533 :
534 :
535 2878 : IF( GT_32( snr_sub, snr_div_fix32 ) )
536 : {
537 2575 : IF( EQ_32( hVAD_CLDFB->l_speech_snr_count, 512 ) )
538 : {
539 9 : hVAD_CLDFB->l_speech_snr = L_add( MUL_F( hVAD_CLDFB->l_speech_snr, 0x6000 /*.75f in Q15*/ ), L_shr( snr, 9 ) );
540 9 : move32();
541 9 : hVAD_CLDFB->l_speech_snr_count = L_deposit_l( 384 + 1 );
542 9 : move32();
543 : }
544 : ELSE
545 : {
546 2566 : hVAD_CLDFB->l_speech_snr = L_add( hVAD_CLDFB->l_speech_snr, L_shr( snr, 9 ) );
547 2566 : move32();
548 2566 : hVAD_CLDFB->l_speech_snr_count = L_add( hVAD_CLDFB->l_speech_snr_count, 1 );
549 2566 : move32();
550 : }
551 : }
552 : }
553 :
554 3100 : lt_snr_org_cmp = L_sub( lt_snr_org, 117440509 /* 3.5 Q25 */ );
555 :
556 3100 : IF( EQ_16( hVAD_CLDFB->bw_index, CLDFBVAD_NB_ID ) )
557 : {
558 : Word32 lt_snr_add;
559 :
560 0 : lt_snr_add = L_add( 0x03cccccd /*1.9 in Q25*/, MUL_F( lt_snr, 0x23d7 ) );
561 :
562 0 : if ( GT_32( snr_flux, lt_snr_add ) )
563 : {
564 0 : vad_flag = 1;
565 0 : move16();
566 : }
567 :
568 0 : test();
569 0 : test();
570 0 : if ( ( GT_32( snr_flux, 50331647 /* 1.5 Q25 */ ) ) && ( GT_16( hVAD_CLDFB->sp_center[3], 1637 /* 1.6 Q10 */ ) ) && ( lt_snr_org_cmp < 0 ) )
571 : {
572 0 : vad_flag = 1;
573 0 : move16();
574 : }
575 :
576 0 : test();
577 0 : test();
578 0 : if ( ( GT_32( snr_flux, 40265317 /* 1.2 Q25 */ ) ) && ( GT_16( hVAD_CLDFB->sp_center[3], 1944 /* 1.9 Q10 */ ) ) && ( lt_snr_org_cmp < 0 ) )
579 : {
580 0 : vad_flag = 1;
581 0 : move16();
582 : }
583 :
584 0 : test();
585 0 : test();
586 0 : if ( ( GT_32( snr_flux, 33554431 /* 1.0 Q25 */ ) ) && ( GT_16( hVAD_CLDFB->sp_center[3], 3274 /* 3.2 Q10 */ ) ) && ( lt_snr_org_cmp < 0 ) )
587 : {
588 0 : vad_flag = 1;
589 0 : move16();
590 : }
591 : }
592 3100 : ELSE IF( EQ_16( hVAD_CLDFB->bw_index, CLDFBVAD_WB_ID ) )
593 : {
594 : Word32 lt_snr_add;
595 :
596 0 : lt_snr_add = L_add( 0x04333333 /*2.1 in Q25*/, MUL_F( lt_snr, 0x1eb8 ) );
597 :
598 0 : if ( GT_32( snr_flux, lt_snr_add ) )
599 : {
600 0 : vad_flag = 1;
601 0 : move16();
602 : }
603 :
604 0 : test();
605 0 : test();
606 0 : if ( ( GT_32( snr_flux, 53687090 /* 1.6 Q25 */ ) ) && ( GT_16( hVAD_CLDFB->sp_center[3], 2558 /* 2.5 Q10 */ ) ) && ( lt_snr_org_cmp < 0 ) )
607 : {
608 0 : vad_flag = 1;
609 0 : move16();
610 : }
611 :
612 0 : test();
613 0 : test();
614 0 : if ( ( GT_32( snr_flux, 40265317 /* 1.2 Q25 */ ) ) && ( GT_16( hVAD_CLDFB->sp_center[3], 2864 /* 2.8 Q10 */ ) ) && ( lt_snr_org_cmp < 0 ) )
615 : {
616 0 : vad_flag = 1;
617 0 : move16();
618 : }
619 :
620 0 : test();
621 0 : test();
622 0 : if ( ( GT_32( snr_flux, 33554431 /* 1.0 Q25 */ ) ) && ( GT_16( hVAD_CLDFB->sp_center[3], 4604 /* 4.5 Q10 */ ) ) && ( lt_snr_org_cmp < 0 ) )
623 : {
624 0 : vad_flag = 1;
625 0 : move16();
626 : }
627 : }
628 : ELSE
629 : {
630 : Word32 lt_snr_add;
631 :
632 3100 : lt_snr_add = L_add( 0x04333333 /*2.1 Q25*/, MUL_F( lt_snr, 0x28f5 ) );
633 :
634 3100 : if ( ( GT_32( snr_flux, lt_snr_add ) ) )
635 : {
636 2828 : vad_flag = 1;
637 2828 : move16();
638 : }
639 :
640 3100 : test();
641 3100 : test();
642 3100 : if ( ( GT_32( snr_flux, 56371444 /* 1.68 Q25 */ ) ) && ( GT_16( hVAD_CLDFB->sp_center[3], 2823 /* 2.76 Q10 */ ) ) && ( lt_snr_org_cmp < 0 ) )
643 : {
644 0 : vad_flag = 1;
645 0 : move16();
646 : }
647 :
648 3100 : test();
649 3100 : test();
650 3100 : if ( ( GT_32( snr_flux, 41607494 /* 1.24 Q25 */ ) ) && ( GT_16( hVAD_CLDFB->sp_center[3], 2987 /* 2.92 Q10 */ ) ) && ( lt_snr_org_cmp < 0 ) )
651 : {
652 0 : vad_flag = 1;
653 0 : move16();
654 : }
655 :
656 3100 : test();
657 3100 : test();
658 3100 : if ( ( GT_32( snr_flux, 36909874 /* 1.10 Q25 */ ) ) && ( GT_16( hVAD_CLDFB->sp_center[3], 4706 /* 4.6 Q10 */ ) ) && ( lt_snr_org_cmp < 0 ) )
659 : {
660 0 : vad_flag = 1;
661 0 : move16();
662 : }
663 : }
664 :
665 :
666 3100 : IF( hVAD_CLDFB->fg_energy_est_start == 0 )
667 : {
668 36 : tmpout = VAD_L_CMP( frame_energy, frame_energy_Q, 50, 0 );
669 :
670 36 : test();
671 36 : test();
672 36 : if ( GT_16( hVAD_CLDFB->ltd_stable_rate[0], 2621 /* 0.08 Q15 */ ) && EQ_16( vad_flag, 1 ) && ( tmpout > 0 ) )
673 : {
674 3 : hVAD_CLDFB->fg_energy_est_start = 1;
675 3 : move32();
676 : }
677 : }
678 :
679 3100 : speech_flag = comvad_hangover( lt_snr_org,
680 : snr,
681 : l_snr,
682 : snr_flux,
683 3100 : hVAD_CLDFB->bw_index,
684 : vad_flag,
685 : speech_flag,
686 3100 : hVAD_CLDFB->continuous_speech_num2,
687 : noisy_type );
688 :
689 :
690 3100 : test();
691 3100 : IF( vad_flag == 0 && speech_flag > 0 )
692 : {
693 12 : speech_flag = sub( speech_flag, 1 );
694 12 : vad_flag = 1;
695 12 : move16();
696 : }
697 3100 : vadb_flag = vad_flag;
698 3100 : move16();
699 3100 : IF( EQ_16( hVAD_CLDFB->bw_index, CLDFBVAD_SWB_ID ) )
700 : {
701 3100 : test();
702 3100 : test();
703 3100 : test();
704 3100 : IF( EQ_16( SILENCE, noisy_type ) && GT_32( snr, 6710886 /* 0.2 Q25 */ ) && vad_flag == 0 )
705 : {
706 0 : vad_flag = vada_flag;
707 0 : move16();
708 : }
709 3100 : ELSE IF( LT_32( hVAD_CLDFB->lf_snr_smooth, 352321526 /* 10.5 Q25 */ ) || NE_16( SILENCE, noisy_type ) )
710 : {
711 3100 : test();
712 3100 : test();
713 3100 : test();
714 3100 : IF( GT_32( snr_flux, 83886078 /* 2.5 Q25 */ ) || ( hVAD_CLDFB->continuous_speech_num2 > 40 && GT_32( snr_flux, 67108862 /* 2.0 Q25 */ ) ) || EQ_16( music_backgound_f, 1 ) )
715 : {
716 2841 : vad_flag = s_or( vad_flag, vada_flag );
717 : }
718 259 : ELSE IF( EQ_16( SILENCE, noisy_type ) )
719 : {
720 0 : vad_flag = vada_flag;
721 0 : move16();
722 : }
723 : }
724 : }
725 0 : ELSE IF( EQ_16( hVAD_CLDFB->bw_index, CLDFBVAD_WB_ID ) )
726 : {
727 0 : test();
728 0 : test();
729 0 : test();
730 0 : IF( EQ_16( SILENCE, noisy_type ) && GT_32( snr, 6710886 /* 0.2 Q25 */ ) && vad_flag == 0 )
731 : {
732 0 : vad_flag = vada_flag;
733 0 : move16();
734 : }
735 0 : ELSE IF( LT_32( hVAD_CLDFB->lf_snr_smooth, 352321526 /* 10.5 Q25 */ ) || NE_16( SILENCE, noisy_type ) )
736 : {
737 0 : test();
738 0 : test();
739 0 : test();
740 0 : IF( GT_32( snr_flux, 73819748 /* 2.2 Q25 */ ) || ( hVAD_CLDFB->continuous_speech_num2 > 40 && GT_32( snr_flux, 57042532 /* 1.7 Q25 */ ) ) || EQ_16( music_backgound_f, 1 ) )
741 : {
742 0 : vad_flag = s_or( vad_flag, vada_flag );
743 : }
744 0 : ELSE IF( EQ_16( SILENCE, noisy_type ) )
745 : {
746 0 : vad_flag = vada_flag;
747 0 : move16();
748 : }
749 : }
750 : }
751 : ELSE
752 : {
753 0 : IF( EQ_16( SILENCE, noisy_type ) )
754 : {
755 0 : test();
756 0 : IF( GT_32( hVAD_CLDFB->lf_snr_smooth, 419430388 /* 12.5 Q25 */ ) && music_backgound_f == 0 )
757 : {
758 0 : vad_flag = vada_flag;
759 0 : move16();
760 : }
761 : }
762 : ELSE
763 : {
764 0 : test();
765 0 : test();
766 0 : test();
767 0 : IF( GT_32( snr_flux, 67108862 /* 2.0 Q25 */ ) || ( GT_16( hVAD_CLDFB->continuous_speech_num2, 30 ) && GT_32( snr_flux, 50331647 /* 1.5 Q25 */ ) ) || EQ_16( music_backgound_f, 1 ) )
768 : {
769 0 : vad_flag = s_or( vad_flag, vada_flag );
770 : }
771 : }
772 : }
773 :
774 3100 : IF( vad_flag == 0 )
775 : {
776 90 : IF( EQ_32( hVAD_CLDFB->l_silence_snr_count, 512 ) )
777 : {
778 0 : hVAD_CLDFB->l_silence_snr = L_add( MUL_F( hVAD_CLDFB->l_silence_snr, 0x6000 /*.75f Q15*/ ), L_shr( snr, 9 ) );
779 0 : move32();
780 0 : hVAD_CLDFB->l_silence_snr_count = L_deposit_l( 384 + 1 );
781 0 : move32();
782 : }
783 90 : ELSE IF( LT_32( snr, 26843545 /* 0.8 Q25 */ ) )
784 : {
785 90 : hVAD_CLDFB->l_silence_snr = L_add( hVAD_CLDFB->l_silence_snr, L_shr( snr, 9 ) );
786 90 : move32();
787 90 : hVAD_CLDFB->l_silence_snr_count = L_add( hVAD_CLDFB->l_silence_snr_count, 1 );
788 90 : move32();
789 : }
790 : }
791 :
792 3100 : IF( vad_flag == 0 )
793 : {
794 90 : IF( EQ_16( hVAD_CLDFB->bg_energy_count, 512 ) )
795 : {
796 0 : bg_energy = MUL_F( bg_energy, 0x6000 /*.75f Q15*/ );
797 0 : hVAD_CLDFB->bg_energy_count = 384;
798 0 : move16();
799 : }
800 :
801 90 : IF( LT_32( tsnr, 16777216 /* 1.0/2.0 Q25 */ ) )
802 : {
803 72 : bg_energy = VAD_L_ADD( bg_energy, hVAD_CLDFB->bg_energy_scale, frame_energy, frame_energy_Q, &hVAD_CLDFB->bg_energy_scale );
804 72 : hVAD_CLDFB->bg_energy_count = add( hVAD_CLDFB->bg_energy_count, 1 );
805 72 : move16();
806 : }
807 : }
808 :
809 3100 : test();
810 3100 : hVAD_CLDFB->vad_flag_for_bk_update = vad_flag;
811 3100 : move16();
812 3100 : IF( LT_16( hVAD_CLDFB->update_count, 12 ) && EQ_16( vadb_flag, 1 ) )
813 : {
814 3006 : hVAD_CLDFB->warm_hang_num = s_max( 20, speech_flag );
815 3006 : move16();
816 : }
817 3100 : test();
818 3100 : IF( vad_flag == 0 && hVAD_CLDFB->warm_hang_num > 0 )
819 : {
820 60 : hVAD_CLDFB->warm_hang_num = sub( hVAD_CLDFB->warm_hang_num, 1 );
821 60 : vad_flag = 1;
822 60 : move16();
823 60 : move16();
824 : }
825 :
826 :
827 3100 : hVAD_CLDFB->lt_snr_org = lt_snr_org;
828 3100 : move32();
829 3100 : hVAD_CLDFB->fg_energy = fg_energy;
830 3100 : move32();
831 3100 : hVAD_CLDFB->bg_energy = bg_energy;
832 3100 : move32();
833 :
834 3100 : hVAD_CLDFB->speech_flag = speech_flag;
835 3100 : move16();
836 :
837 3100 : test();
838 3100 : IF( EQ_16( noisy_type, SILENCE ) && NE_16( hVAD_CLDFB->bw_index, CLDFBVAD_NB_ID ) )
839 : {
840 1983 : *cldfb_addition = 2;
841 1983 : move16();
842 : }
843 : ELSE
844 : {
845 1117 : *cldfb_addition = 0;
846 1117 : move16();
847 :
848 1117 : if ( EQ_16( hVAD_CLDFB->bw_index, CLDFBVAD_WB_ID ) )
849 : {
850 0 : *cldfb_addition = 3;
851 0 : move16();
852 : }
853 1117 : if ( EQ_16( hVAD_CLDFB->bw_index, CLDFBVAD_SWB_ID ) )
854 : {
855 1117 : *cldfb_addition = 1;
856 1117 : move16();
857 : }
858 1117 : if ( EQ_16( hVAD_CLDFB->bw_index, CLDFBVAD_NB_ID ) )
859 : {
860 0 : *cldfb_addition = 1;
861 0 : move16();
862 : }
863 : }
864 :
865 :
866 3100 : return vad_flag;
867 : }
|