Line data Source code
1 : /******************************************************************************************************
2 :
3 : (C) 2022-2025 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
4 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
5 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
6 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
7 : contributors to this repository. All Rights Reserved.
8 :
9 : This software is protected by copyright law and by international treaties.
10 : The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
11 : Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
12 : Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
13 : Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
14 : contributors to this repository retain full ownership rights in their respective contributions in
15 : the software. This notice grants no license of any kind, including but not limited to patent
16 : license, nor is any license granted by implication, estoppel or otherwise.
17 :
18 : Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
19 : contributions.
20 :
21 : This software is provided "AS IS", without any express or implied warranties. The software is in the
22 : development stage. It is intended exclusively for experts who have experience with such software and
23 : solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
24 : and fitness for a particular purpose are hereby disclaimed and excluded.
25 :
26 : Any dispute, controversy or claim arising under or in relation to providing this software shall be
27 : submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
28 : accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
29 : the United Nations Convention on Contracts on the International Sales of Goods.
30 :
31 : *******************************************************************************************************/
32 :
33 : /*====================================================================================
34 : EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0
35 : ====================================================================================*/
36 :
37 : #include <stdint.h>
38 : #include "options.h"
39 : #include "prot.h"
40 : #include "rom_enc.h"
41 : #include "wmc_auto.h"
42 :
43 :
44 : /*-------------------------------------------------------------------*
45 : * local function prototypes
46 : *-------------------------------------------------------------------*/
47 :
48 : static int16_t comvad_hangover( const float lt_snr_org, const float snr, const float lf_snr, const float snr_flux, const int16_t bw_index, const int16_t vad_flag, const int16_t pre_res_hang_num, const int16_t continuous_speech_num2, const int16_t noisy_type );
49 :
50 :
51 : /*-------------------------------------------------------------------*
52 : * comvad_decision()
53 : *
54 : *
55 : *-------------------------------------------------------------------*/
56 :
57 96918 : int16_t comvad_decision(
58 : VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state */
59 : const float snr, /* i : frequency domain SNR */
60 : const float tsnr, /* i : time domain SNR */
61 : const float snr_flux, /* i : average tsnr of several frames */
62 : const float lt_snr, /* i : long time SNR calculated by fg_energy and bg_energy*/
63 : const float lt_snr_org, /* i : original long time SNR */
64 : const float lf_snr, /* i : long time frequency domain SNR calculated by l_speech_snr and l_silence_snr*/
65 : const float frame_energy, /* i : current frame energy */
66 : const int16_t music_backgound_f, /* i : background music flag */
67 : int16_t *cldfb_addition,
68 : const int16_t vada_flag )
69 : {
70 96918 : int16_t speech_flag = hVAD_CLDFB->speech_flag;
71 96918 : int16_t fg_energy_count = hVAD_CLDFB->fg_energy_count;
72 96918 : int16_t bg_energy_count = hVAD_CLDFB->bg_energy_count;
73 96918 : float fg_energy = hVAD_CLDFB->fg_energy;
74 96918 : float bg_energy = hVAD_CLDFB->bg_energy;
75 96918 : int16_t l_speech_snr_count = hVAD_CLDFB->l_speech_snr_count;
76 : int16_t vad_flag;
77 96918 : float snr_thresh = 0.2f;
78 96918 : float *ltd_stable_rate = hVAD_CLDFB->ltd_stable_rate;
79 96918 : float *sp_center = hVAD_CLDFB->sp_center;
80 96918 : int16_t frameloop = hVAD_CLDFB->frameloop;
81 96918 : int16_t bw_index = hVAD_CLDFB->bw_index;
82 96918 : int16_t noisy_type = UNKNOWN_NOISE;
83 96918 : int16_t vadb_flag = 0;
84 :
85 : /*
86 : * ls_snr_org
87 : * -------NB---------------WB----------------SWB---------
88 : * l16 [13.5 17] [13.5 16] [13.1 15.2]
89 : * 126 [12 14] [10.7 12.7] [10.3 12.1]
90 : * l36 [9.5 12] [8.5 10.5] [7.8 9.2]
91 : * 15dB [3.5 4.5]
92 : * 20dB [4.5 5.5]
93 : */
94 :
95 : /*
96 : * lt_snr_org
97 : * -------NB---------------WB----------------SWB---------
98 : * l16 [-- --] [-- --] [-- --]
99 : * 126 [-- --] [-- -] [-- --]
100 : * l36 [-- --] [-- --] [- --]
101 : * 15dB [1.2 1.9]
102 : * 20dB [2.1 2.7] [1.8 2.3]
103 : */
104 :
105 96918 : if ( hVAD_CLDFB->lf_snr_smooth > LS_MIN_SELENCE_SNR[bw_index - CLDFBVAD_NB_ID] && lt_snr_org > LT_MIN_SILENCE_SNR[bw_index - CLDFBVAD_NB_ID] )
106 : {
107 19034 : noisy_type = SILENCE;
108 : }
109 :
110 96918 : snr_thresh = construct_snr_thresh( sp_center, snr_flux, lt_snr, lf_snr, hVAD_CLDFB->continuous_speech_num, hVAD_CLDFB->continuous_noise_num, hVAD_CLDFB->fg_energy_est_start, bw_index );
111 :
112 96918 : if ( snr > snr_thresh )
113 : {
114 75038 : vad_flag = 1;
115 : }
116 : else
117 : {
118 21880 : vad_flag = 0;
119 : }
120 :
121 96918 : if ( bw_index == CLDFBVAD_WB_ID )
122 : {
123 21790 : if ( tsnr > 2.8 )
124 : {
125 17562 : vad_flag = 1;
126 : }
127 : }
128 : else
129 : {
130 75128 : if ( tsnr > 2.6 )
131 : {
132 59011 : vad_flag = 1;
133 : }
134 : }
135 :
136 96918 : if ( frameloop > 25 )
137 : {
138 90210 : if ( vad_flag == 1 && hVAD_CLDFB->fg_energy_est_start == 1 )
139 : {
140 73615 : if ( fg_energy_count == 512 )
141 : {
142 323 : fg_energy = fg_energy * 0.75f;
143 323 : fg_energy_count = 384;
144 : }
145 73615 : if ( ( frame_energy * bg_energy_count ) > 6 * bg_energy )
146 : {
147 68316 : fg_energy = fg_energy + frame_energy;
148 68316 : fg_energy_count = fg_energy_count + 1;
149 : }
150 : }
151 : }
152 :
153 96918 : if ( music_backgound_f )
154 : {
155 2841 : vad_flag = 1;
156 : }
157 :
158 96918 : if ( vad_flag == 1 )
159 : {
160 82315 : if ( snr > hVAD_CLDFB->l_silence_snr / hVAD_CLDFB->l_silence_snr_count + 1.5 )
161 : {
162 73313 : if ( l_speech_snr_count == 512 )
163 : {
164 315 : hVAD_CLDFB->l_speech_snr = hVAD_CLDFB->l_speech_snr * 0.75f;
165 315 : l_speech_snr_count = 384;
166 :
167 315 : hVAD_CLDFB->l_speech_snr += snr;
168 315 : l_speech_snr_count++;
169 : }
170 : else
171 : {
172 72998 : hVAD_CLDFB->l_speech_snr += snr;
173 72998 : l_speech_snr_count++;
174 : }
175 : }
176 : }
177 :
178 96918 : if ( bw_index == CLDFBVAD_NB_ID )
179 : {
180 7710 : if ( snr_flux > 1.9 + lt_snr * 0.28 )
181 : {
182 6079 : vad_flag = 1;
183 : }
184 7710 : if ( ( snr_flux > 1.5 ) && sp_center[3] > 1.6 && lt_snr_org < 3.5 )
185 : {
186 473 : vad_flag = 1;
187 : }
188 7710 : if ( ( snr_flux > 1.2 ) && sp_center[3] > 1.9 && lt_snr_org < 3.5 )
189 : {
190 332 : vad_flag = 1;
191 : }
192 7710 : if ( ( snr_flux > 1.00f ) && sp_center[3] > 3.2 && lt_snr_org < 3.5 )
193 : {
194 102 : vad_flag = 1;
195 : }
196 : }
197 :
198 96918 : if ( bw_index == CLDFBVAD_WB_ID )
199 : {
200 21790 : if ( ( snr_flux > 2.1 + lt_snr * 0.24 ) )
201 : {
202 16497 : vad_flag = 1;
203 : }
204 21790 : if ( ( snr_flux > 1.6 ) && sp_center[3] > 2.5 && lt_snr_org < 3.5 )
205 : {
206 630 : vad_flag = 1;
207 : }
208 21790 : if ( ( snr_flux > 1.2 ) && sp_center[3] > 2.8 && lt_snr_org < 3.5 )
209 : {
210 560 : vad_flag = 1;
211 : }
212 21790 : if ( ( snr_flux > 1.0 ) && sp_center[3] > 4.5 && lt_snr_org < 3.5 )
213 : {
214 364 : vad_flag = 1;
215 : }
216 : }
217 :
218 96918 : if ( bw_index == CLDFBVAD_SWB_ID )
219 : {
220 67418 : if ( ( snr_flux > 2.1 + lt_snr * 0.32 ) )
221 : {
222 46489 : vad_flag = 1;
223 : }
224 67418 : if ( ( snr_flux > 1.68 ) && sp_center[3] > 2.76 && lt_snr_org < 3.5 )
225 : {
226 4394 : vad_flag = 1;
227 : }
228 67418 : if ( ( snr_flux > 1.24 ) && sp_center[3] > 2.92 && lt_snr_org < 3.5 )
229 : {
230 4560 : vad_flag = 1;
231 : }
232 67418 : if ( ( snr_flux > 1.10f ) && sp_center[3] > 4.6 && lt_snr_org < 3.5 )
233 : {
234 3444 : vad_flag = 1;
235 : }
236 : }
237 :
238 96918 : if ( hVAD_CLDFB->fg_energy_est_start == 0 )
239 : {
240 9250 : if ( ltd_stable_rate[0] > 0.08 && vad_flag == 1 && frame_energy > 50 )
241 : {
242 258 : hVAD_CLDFB->fg_energy_est_start = 1;
243 : }
244 : }
245 :
246 : /************************************************************************/
247 : /* hangover */
248 : /************************************************************************/
249 :
250 96918 : speech_flag = comvad_hangover( lt_snr_org, snr, lf_snr, snr_flux, bw_index, vad_flag, speech_flag, hVAD_CLDFB->continuous_speech_num2, noisy_type );
251 :
252 96918 : if ( vad_flag == 0 && speech_flag > 0 )
253 : {
254 1634 : speech_flag--;
255 1634 : vad_flag = 1;
256 : }
257 :
258 96918 : vadb_flag = vad_flag;
259 :
260 96918 : if ( bw_index == CLDFBVAD_SWB_ID )
261 : {
262 67418 : if ( SILENCE == noisy_type && snr > 0.2 && vad_flag == 0 )
263 : {
264 20 : vad_flag = vada_flag;
265 : }
266 67398 : else if ( hVAD_CLDFB->lf_snr_smooth < 10.5 || SILENCE != noisy_type )
267 : {
268 67166 : if ( ( snr_flux > 1.8 ) || ( ( hVAD_CLDFB->continuous_speech_num2 > 40 ) && ( snr_flux > 1.6 ) ) || music_backgound_f == 1 )
269 : {
270 53055 : vad_flag = vada_flag | vadb_flag;
271 : }
272 : /*only use for silence*/
273 14111 : else if ( noisy_type == SILENCE )
274 : {
275 0 : vad_flag = vada_flag;
276 : }
277 : }
278 : }
279 29500 : else if ( bw_index == CLDFBVAD_WB_ID )
280 : {
281 21790 : if ( SILENCE == noisy_type && snr > 0.2 && vad_flag == 0 )
282 : {
283 0 : vad_flag = vada_flag;
284 : }
285 : else
286 : {
287 21790 : if ( hVAD_CLDFB->lf_snr_smooth < 10.5 || SILENCE != noisy_type )
288 : {
289 21790 : if ( ( snr_flux > 2.2 ) || ( ( hVAD_CLDFB->continuous_speech_num2 > 40 ) && ( snr_flux > 1.6 ) ) || music_backgound_f == 1 )
290 : {
291 16838 : vad_flag = vada_flag | vadb_flag;
292 : }
293 4952 : else if ( SILENCE == noisy_type )
294 : {
295 0 : vad_flag = vada_flag;
296 : }
297 : }
298 : }
299 : }
300 : else
301 : {
302 7710 : if ( noisy_type == SILENCE )
303 : {
304 1716 : if ( hVAD_CLDFB->lf_snr_smooth > 12.5 && music_backgound_f == 0 )
305 : {
306 0 : vad_flag = vada_flag;
307 : }
308 : }
309 : else
310 : {
311 5994 : if ( ( snr_flux > 2.0 ) || ( hVAD_CLDFB->continuous_speech_num2 > 30 && ( snr_flux > 1.5 ) ) || music_backgound_f == 1 )
312 : {
313 4538 : vad_flag = vada_flag | vadb_flag;
314 : }
315 : }
316 : }
317 :
318 96918 : if ( vad_flag == 0 )
319 : {
320 8370 : if ( hVAD_CLDFB->l_silence_snr_count == 512 )
321 : {
322 22 : hVAD_CLDFB->l_silence_snr = hVAD_CLDFB->l_silence_snr * 0.75f;
323 22 : hVAD_CLDFB->l_silence_snr_count = 384;
324 :
325 22 : hVAD_CLDFB->l_silence_snr += snr;
326 22 : hVAD_CLDFB->l_silence_snr_count++;
327 : }
328 8348 : else if ( snr < 0.8 )
329 : {
330 7813 : hVAD_CLDFB->l_silence_snr += snr;
331 7813 : hVAD_CLDFB->l_silence_snr_count++;
332 : }
333 : }
334 :
335 96918 : if ( vad_flag == 0 )
336 : {
337 8370 : if ( bg_energy_count == 512 )
338 : {
339 23 : bg_energy = bg_energy * 0.75f;
340 23 : bg_energy_count = 384;
341 : }
342 :
343 8370 : if ( tsnr < 1.0 )
344 : {
345 6619 : bg_energy = bg_energy + frame_energy;
346 6619 : bg_energy_count = bg_energy_count + 1;
347 : }
348 : }
349 :
350 96918 : hVAD_CLDFB->lt_snr_org = lt_snr_org;
351 96918 : hVAD_CLDFB->speech_flag = speech_flag;
352 :
353 96918 : hVAD_CLDFB->fg_energy_count = fg_energy_count;
354 96918 : hVAD_CLDFB->bg_energy_count = bg_energy_count;
355 96918 : hVAD_CLDFB->fg_energy = fg_energy;
356 96918 : hVAD_CLDFB->bg_energy = bg_energy;
357 96918 : hVAD_CLDFB->l_speech_snr_count = l_speech_snr_count;
358 :
359 96918 : hVAD_CLDFB->vad_flag_for_bk_update = vad_flag;
360 96918 : if ( hVAD_CLDFB->update_count < 12 && vadb_flag == 1 )
361 : {
362 53804 : hVAD_CLDFB->warm_hang_num = max( 20, speech_flag );
363 : }
364 :
365 96918 : if ( vad_flag == 0 && hVAD_CLDFB->warm_hang_num > 0 )
366 : {
367 370 : hVAD_CLDFB->warm_hang_num--;
368 370 : vad_flag = 1;
369 : }
370 :
371 96918 : if ( noisy_type == SILENCE && bw_index != CLDFBVAD_NB_ID )
372 :
373 : {
374 17318 : *cldfb_addition = 2;
375 : }
376 : else
377 : {
378 79600 : *cldfb_addition = 0;
379 :
380 79600 : if ( bw_index == CLDFBVAD_WB_ID )
381 : {
382 16345 : *cldfb_addition = 3;
383 : }
384 :
385 79600 : if ( bw_index == CLDFBVAD_SWB_ID )
386 : {
387 55545 : *cldfb_addition = 1;
388 : }
389 :
390 79600 : if ( hVAD_CLDFB->bw_index == CLDFBVAD_NB_ID )
391 : {
392 7710 : *cldfb_addition = 1;
393 : }
394 : }
395 :
396 96918 : return vad_flag;
397 : }
398 :
399 :
400 : /*-------------------------------------------------------------------*
401 : * construct_snr_thresh()
402 : *
403 : *
404 : *-------------------------------------------------------------------*/
405 :
406 96918 : float construct_snr_thresh(
407 : const float sp_center[], /* i : spectral center */
408 : const float snr_flux, /* i : snr flux */
409 : const float lt_snr, /* i : long time time domain snr */
410 : const float lf_snr, /* i : long time frequency domain snr */
411 : const int16_t continuous_speech_num, /* i : number of continuous speech frames */
412 : const int16_t continuous_noise_num, /* i : number of continuous noise frames */
413 : const int16_t fg_energy_est_start, /* i : whether if estimated energy */
414 : const int16_t bw_index /* i : band width index */
415 : )
416 : {
417 96918 : float test_l_snr = 0.f;
418 : float snr_delta;
419 : float snr_thresh;
420 : float bw_snr;
421 :
422 96918 : snr_delta = COMVAD_INIT_SNR_DELTA[bw_index];
423 96918 : bw_snr = lt_snr;
424 :
425 96918 : if ( bw_index == CLDFBVAD_SWB_ID )
426 : {
427 67418 : test_l_snr = lt_snr;
428 67418 : test_l_snr = test_l_snr * 1.0f;
429 :
430 67418 : if ( sp_center[3] > 2.80f )
431 : {
432 16510 : snr_delta = snr_delta + 0.00f;
433 : }
434 50908 : else if ( sp_center[2] > 2.6 )
435 : {
436 3064 : snr_delta = snr_delta + 0.03f;
437 : }
438 47844 : else if ( sp_center[2] > 1.6 )
439 : {
440 17023 : snr_delta = snr_delta + 0.05f;
441 : }
442 30821 : else if ( sp_center[3] > 1.4 )
443 : {
444 11267 : snr_delta = snr_delta + 0.10f;
445 : }
446 : else
447 : {
448 19554 : snr_delta = snr_delta + 0.40f;
449 : }
450 :
451 67418 : if ( continuous_speech_num > 8 && fg_energy_est_start == 1 )
452 : {
453 59914 : snr_delta = snr_delta - 0.2f;
454 : }
455 7504 : else if ( continuous_noise_num > 12 && ( snr_flux > 0.6 + lf_snr * 0.1 ) )
456 : {
457 969 : snr_delta = snr_delta + 0.1f;
458 : }
459 6535 : else if ( continuous_noise_num > 24 )
460 : {
461 2326 : snr_delta = snr_delta + 0.2f;
462 : }
463 4209 : else if ( ( continuous_noise_num > 4 ) )
464 : {
465 894 : snr_delta = snr_delta + 0.1f;
466 : }
467 : }
468 29500 : else if ( bw_index == CLDFBVAD_WB_ID )
469 : {
470 21790 : test_l_snr = lt_snr;
471 21790 : if ( sp_center[3] > 2.80f )
472 : {
473 4092 : snr_delta = snr_delta + 0.00f;
474 : }
475 17698 : else if ( sp_center[2] > 2.6 )
476 : {
477 713 : snr_delta = snr_delta + 0.03f;
478 : }
479 16985 : else if ( sp_center[2] > 1.6 )
480 : {
481 4980 : snr_delta = snr_delta + 0.05f;
482 : }
483 12005 : else if ( sp_center[3] > 1.4 )
484 : {
485 3462 : snr_delta = snr_delta + 0.10f;
486 : }
487 : else
488 : {
489 8543 : snr_delta = snr_delta + 0.30f;
490 : }
491 :
492 21790 : if ( continuous_speech_num > 8 && fg_energy_est_start == 1 )
493 : {
494 16563 : snr_delta = snr_delta - 0.1f;
495 : }
496 5227 : else if ( continuous_noise_num > 12 && ( snr_flux > 0.6 + bw_snr * 0.1 ) )
497 : {
498 742 : snr_delta = snr_delta + 0.1f;
499 : }
500 4485 : else if ( continuous_noise_num > 24 )
501 : {
502 595 : snr_delta = snr_delta + 0.2f;
503 : }
504 3890 : else if ( ( continuous_noise_num > 4 ) )
505 : {
506 290 : snr_delta = snr_delta + 0.1f;
507 : }
508 : }
509 7710 : else if ( bw_index == CLDFBVAD_NB_ID )
510 : {
511 7710 : test_l_snr = lt_snr;
512 :
513 7710 : if ( sp_center[3] > 3.0 )
514 : {
515 1005 : snr_delta = snr_delta + 0.00f;
516 : }
517 6705 : else if ( sp_center[2] > 2.6 )
518 : {
519 384 : snr_delta = snr_delta + 0.02f;
520 : }
521 6321 : else if ( sp_center[2] > 1.6 )
522 : {
523 1853 : snr_delta = snr_delta + 0.04f;
524 : }
525 4468 : else if ( sp_center[2] > 1.46 )
526 : {
527 684 : snr_delta = snr_delta + 0.10f;
528 : }
529 : else
530 : {
531 3784 : snr_delta = snr_delta + 0.18f;
532 : }
533 :
534 7710 : if ( continuous_speech_num > 80 && fg_energy_est_start == 1 && ( sp_center[0] > 1.4 ) )
535 : {
536 2964 : snr_delta = snr_delta - 0.32f;
537 : }
538 4746 : else if ( continuous_speech_num > 8 && fg_energy_est_start == 1 && ( snr_flux > 0.2 + lf_snr * 0.1 ) )
539 : {
540 2723 : snr_delta = snr_delta - 0.1f;
541 : }
542 2023 : else if ( continuous_noise_num > 12 && ( snr_flux > 0.6 + lf_snr * 0.1 ) )
543 : {
544 132 : snr_delta = snr_delta + 0.1f;
545 : }
546 1891 : else if ( continuous_noise_num > 24 )
547 : {
548 375 : snr_delta = snr_delta + 0.2f;
549 : }
550 : }
551 : else
552 : {
553 0 : snr_delta = 1.0f;
554 : }
555 :
556 96918 : snr_thresh = snr_delta + test_l_snr;
557 :
558 :
559 96918 : return snr_thresh;
560 : }
561 :
562 :
563 : /*-------------------------------------------------------------------*
564 : * comvad_hangover()
565 : *
566 : *
567 : *-------------------------------------------------------------------*/
568 :
569 96918 : static int16_t comvad_hangover(
570 : const float lt_snr_org, /* i : original long time SNR */
571 : const float snr, /* i : frequency domain SNR */
572 : const float lf_snr, /* i : long time frequency domain SNR calculated by l_speech_snr and l_silence_snr*/
573 : const float snr_flux, /* i : average tsnr */
574 : const int16_t bw_index, /* i : band width index */
575 : const int16_t vad_flag, /* i : VAD flag */
576 : const int16_t pre_res_hang_num, /* i : residual number of previous hangover */
577 : const int16_t continuous_speech_num2, /* i : number of continuous speech frames */
578 : const int16_t noisy_type /* i : noisy type */
579 : )
580 : {
581 96918 : int16_t speech_flag = pre_res_hang_num;
582 :
583 96918 : if ( bw_index == CLDFBVAD_SWB_ID )
584 : {
585 67418 : if ( vad_flag )
586 : {
587 60122 : if ( lt_snr_org > 3.5f )
588 : {
589 38794 : speech_flag = 3;
590 : }
591 : else
592 : {
593 21328 : speech_flag = 4;
594 : }
595 :
596 60122 : if ( ( continuous_speech_num2 < 8 ) && ( lt_snr_org < 4.0f ) )
597 : {
598 1282 : speech_flag = 8 - continuous_speech_num2;
599 : }
600 58840 : else if ( ( snr_flux > 0.8 ) && ( continuous_speech_num2 > 24 ) )
601 : {
602 52702 : if ( lt_snr_org > 3.6f )
603 : {
604 34864 : speech_flag = 3;
605 : }
606 17838 : else if ( lt_snr_org > 2.6f )
607 : {
608 9637 : speech_flag = 3;
609 : }
610 8201 : else if ( lt_snr_org > 1.6f )
611 : {
612 7023 : speech_flag = 4;
613 : }
614 : else
615 : {
616 1178 : speech_flag = 5;
617 : }
618 52702 : speech_flag = speech_flag - 1;
619 : }
620 :
621 60122 : if ( continuous_speech_num2 < 120 )
622 : {
623 20819 : if ( snr > 1.5 )
624 : {
625 19493 : speech_flag = 9;
626 : }
627 1326 : else if ( snr > 1.0 && speech_flag < 7 )
628 : {
629 751 : speech_flag = 7;
630 : }
631 575 : else if ( speech_flag < 3 )
632 : {
633 76 : speech_flag = 3;
634 : }
635 20819 : if ( speech_flag > 3 )
636 : {
637 20515 : speech_flag -= 2;
638 : }
639 : }
640 : else
641 : {
642 39303 : if ( lt_snr_org > 3.6f )
643 : {
644 28782 : speech_flag = 1;
645 : }
646 10521 : else if ( lt_snr_org > 3.0f )
647 : {
648 3171 : speech_flag = 2;
649 : }
650 7350 : else if ( lt_snr_org > 2.5f )
651 : {
652 3539 : speech_flag = 3;
653 : }
654 3811 : else if ( lt_snr_org > 2.0f )
655 : {
656 1881 : speech_flag = 3;
657 : }
658 1930 : else if ( lt_snr_org > 1.5f )
659 : {
660 1444 : speech_flag = 4;
661 : }
662 : else
663 : {
664 486 : speech_flag = 5;
665 : }
666 : }
667 :
668 60122 : if ( noisy_type == SILENCE )
669 : {
670 11815 : speech_flag = 6;
671 : }
672 : }
673 : }
674 29500 : else if ( bw_index == CLDFBVAD_WB_ID )
675 : {
676 21790 : if ( vad_flag )
677 : {
678 19409 : if ( lt_snr_org > 3.5f )
679 : {
680 15092 : speech_flag = 1;
681 : }
682 : else
683 : {
684 4317 : speech_flag = 2;
685 : }
686 :
687 19409 : if ( ( continuous_speech_num2 < 8 ) && ( lt_snr_org < 4.0f ) )
688 : {
689 214 : speech_flag = 8 - continuous_speech_num2;
690 : }
691 19195 : else if ( ( snr_flux > 0.9 ) && ( continuous_speech_num2 > 50 ) )
692 : {
693 13784 : if ( lt_snr_org > 3.6f )
694 : {
695 10382 : speech_flag = 1;
696 : }
697 3402 : else if ( lt_snr_org > 2.6f )
698 : {
699 1764 : speech_flag = 5;
700 : }
701 1638 : else if ( lt_snr_org > 1.6f )
702 : {
703 14 : speech_flag = 6;
704 : }
705 : else
706 : {
707 1624 : speech_flag = 7;
708 : }
709 :
710 13784 : if ( speech_flag > 1 )
711 : {
712 3402 : speech_flag = speech_flag - 1;
713 : }
714 : }
715 :
716 19409 : if ( continuous_speech_num2 < 120 )
717 : {
718 7469 : if ( snr > 1.5 )
719 : {
720 5926 : speech_flag = 6;
721 : }
722 1543 : else if ( snr > 1.0 && speech_flag < 5 )
723 : {
724 390 : speech_flag = 5;
725 : }
726 1153 : else if ( snr > 0.8 && lt_snr_org < 2 && speech_flag < 4 )
727 : {
728 70 : speech_flag = 4;
729 : }
730 1083 : else if ( speech_flag < 3 )
731 : {
732 537 : speech_flag = 3;
733 : }
734 : }
735 : else
736 : {
737 11940 : if ( lt_snr_org > 3.6f )
738 : {
739 9504 : speech_flag = 1;
740 : }
741 2436 : else if ( lt_snr_org > 3.0f )
742 : {
743 742 : speech_flag = 2;
744 : }
745 1694 : else if ( lt_snr_org > 2.5f )
746 : {
747 546 : speech_flag = 2;
748 : }
749 1148 : else if ( lt_snr_org > 2.0f )
750 : {
751 7 : speech_flag = 3;
752 : }
753 : else
754 : {
755 1141 : speech_flag = 3;
756 : }
757 : }
758 :
759 19409 : if ( noisy_type == SILENCE )
760 : {
761 5445 : speech_flag = 6;
762 : }
763 : }
764 : }
765 : else
766 : {
767 7710 : if ( vad_flag )
768 : {
769 6827 : if ( lt_snr_org > 3.5f )
770 : {
771 4878 : speech_flag = 3;
772 : }
773 : else
774 : {
775 1949 : speech_flag = 4;
776 : }
777 :
778 6827 : if ( ( continuous_speech_num2 < 8 ) && ( lt_snr_org < 4.0f ) )
779 : {
780 146 : speech_flag = 8 - continuous_speech_num2;
781 : }
782 6681 : else if ( ( snr_flux > 0.8 + lf_snr * 0.1 ) && ( continuous_speech_num2 > 24 ) )
783 : {
784 6054 : if ( lt_snr_org > 3.6f )
785 : {
786 4380 : speech_flag = 3;
787 : }
788 1674 : else if ( lt_snr_org > 2.6f )
789 : {
790 885 : speech_flag = 8;
791 : }
792 789 : else if ( lt_snr_org > 1.2f )
793 : {
794 6 : speech_flag = 10;
795 : }
796 : else
797 : {
798 783 : speech_flag = 12;
799 : }
800 :
801 6054 : if ( speech_flag > 2 )
802 : {
803 6054 : speech_flag = speech_flag - 2;
804 : }
805 : }
806 :
807 6827 : if ( continuous_speech_num2 < 120 )
808 : {
809 2255 : if ( snr > 1.5 )
810 : {
811 1600 : speech_flag = 10;
812 : }
813 655 : else if ( snr > 1.0 && speech_flag < 7 )
814 : {
815 64 : speech_flag = 7;
816 : }
817 591 : else if ( speech_flag < 3 && continuous_speech_num2 > 12 )
818 : {
819 103 : speech_flag = 3;
820 : }
821 : }
822 : else
823 : {
824 4572 : if ( lt_snr_org > 3.6f )
825 : {
826 3468 : speech_flag = 2;
827 : }
828 1104 : else if ( lt_snr_org > 3.0f )
829 : {
830 321 : speech_flag = 2;
831 : }
832 783 : else if ( lt_snr_org > 2.5f )
833 : {
834 282 : speech_flag = 3;
835 : }
836 501 : else if ( lt_snr_org > 2.0f )
837 : {
838 3 : speech_flag = 3;
839 : }
840 498 : else if ( lt_snr_org > 1.5f )
841 : {
842 0 : speech_flag = 4;
843 : }
844 : else
845 : {
846 498 : speech_flag = 4;
847 : }
848 : }
849 :
850 6827 : if ( noisy_type == SILENCE )
851 : {
852 1716 : speech_flag = 2;
853 : }
854 : }
855 : }
856 :
857 96918 : if ( vad_flag == 1 )
858 : {
859 86358 : if ( noisy_type != SILENCE )
860 : {
861 67382 : speech_flag--;
862 : }
863 : else
864 : {
865 18976 : speech_flag = speech_flag - 3;
866 : }
867 :
868 86358 : if ( speech_flag < 0 )
869 : {
870 1716 : speech_flag = 0;
871 : }
872 : }
873 :
874 96918 : return speech_flag;
875 : }
|