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 3100 : 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 3100 : int16_t speech_flag = hVAD_CLDFB->speech_flag;
71 3100 : int16_t fg_energy_count = hVAD_CLDFB->fg_energy_count;
72 3100 : int16_t bg_energy_count = hVAD_CLDFB->bg_energy_count;
73 3100 : float fg_energy = hVAD_CLDFB->fg_energy;
74 3100 : float bg_energy = hVAD_CLDFB->bg_energy;
75 3100 : int16_t l_speech_snr_count = hVAD_CLDFB->l_speech_snr_count;
76 : int16_t vad_flag;
77 3100 : float snr_thresh = 0.2f;
78 3100 : float *ltd_stable_rate = hVAD_CLDFB->ltd_stable_rate;
79 3100 : float *sp_center = hVAD_CLDFB->sp_center;
80 3100 : int16_t frameloop = hVAD_CLDFB->frameloop;
81 3100 : int16_t bw_index = hVAD_CLDFB->bw_index;
82 3100 : int16_t noisy_type = UNKNOWN_NOISE;
83 3100 : 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 3100 : 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 1209 : noisy_type = SILENCE;
108 : }
109 :
110 3100 : 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 3100 : if ( snr > snr_thresh )
113 : {
114 2602 : vad_flag = 1;
115 : }
116 : else
117 : {
118 498 : vad_flag = 0;
119 : }
120 :
121 3100 : if ( bw_index == CLDFBVAD_WB_ID )
122 : {
123 0 : if ( tsnr > 2.8 )
124 : {
125 0 : vad_flag = 1;
126 : }
127 : }
128 : else
129 : {
130 3100 : if ( tsnr > 2.6 )
131 : {
132 2883 : vad_flag = 1;
133 : }
134 : }
135 :
136 3100 : if ( frameloop > 25 )
137 : {
138 3022 : if ( vad_flag == 1 && hVAD_CLDFB->fg_energy_est_start == 1 )
139 : {
140 2835 : if ( fg_energy_count == 512 )
141 : {
142 12 : fg_energy = fg_energy * 0.75f;
143 12 : fg_energy_count = 384;
144 : }
145 2835 : if ( ( frame_energy * bg_energy_count ) > 6 * bg_energy )
146 : {
147 2835 : fg_energy = fg_energy + frame_energy;
148 2835 : fg_energy_count = fg_energy_count + 1;
149 : }
150 : }
151 : }
152 :
153 3100 : if ( music_backgound_f )
154 : {
155 0 : vad_flag = 1;
156 : }
157 :
158 3100 : if ( vad_flag == 1 )
159 : {
160 2883 : if ( snr > hVAD_CLDFB->l_silence_snr / hVAD_CLDFB->l_silence_snr_count + 1.5 )
161 : {
162 2558 : if ( l_speech_snr_count == 512 )
163 : {
164 9 : hVAD_CLDFB->l_speech_snr = hVAD_CLDFB->l_speech_snr * 0.75f;
165 9 : l_speech_snr_count = 384;
166 :
167 9 : hVAD_CLDFB->l_speech_snr += snr;
168 9 : l_speech_snr_count++;
169 : }
170 : else
171 : {
172 2549 : hVAD_CLDFB->l_speech_snr += snr;
173 2549 : l_speech_snr_count++;
174 : }
175 : }
176 : }
177 :
178 3100 : if ( bw_index == CLDFBVAD_NB_ID )
179 : {
180 0 : if ( snr_flux > 1.9 + lt_snr * 0.28 )
181 : {
182 0 : vad_flag = 1;
183 : }
184 0 : if ( ( snr_flux > 1.5 ) && sp_center[3] > 1.6 && lt_snr_org < 3.5 )
185 : {
186 0 : vad_flag = 1;
187 : }
188 0 : if ( ( snr_flux > 1.2 ) && sp_center[3] > 1.9 && lt_snr_org < 3.5 )
189 : {
190 0 : vad_flag = 1;
191 : }
192 0 : if ( ( snr_flux > 1.00f ) && sp_center[3] > 3.2 && lt_snr_org < 3.5 )
193 : {
194 0 : vad_flag = 1;
195 : }
196 : }
197 :
198 3100 : if ( bw_index == CLDFBVAD_WB_ID )
199 : {
200 0 : if ( ( snr_flux > 2.1 + lt_snr * 0.24 ) )
201 : {
202 0 : vad_flag = 1;
203 : }
204 0 : if ( ( snr_flux > 1.6 ) && sp_center[3] > 2.5 && lt_snr_org < 3.5 )
205 : {
206 0 : vad_flag = 1;
207 : }
208 0 : if ( ( snr_flux > 1.2 ) && sp_center[3] > 2.8 && lt_snr_org < 3.5 )
209 : {
210 0 : vad_flag = 1;
211 : }
212 0 : if ( ( snr_flux > 1.0 ) && sp_center[3] > 4.5 && lt_snr_org < 3.5 )
213 : {
214 0 : vad_flag = 1;
215 : }
216 : }
217 :
218 3100 : if ( bw_index == CLDFBVAD_SWB_ID )
219 : {
220 3100 : if ( ( snr_flux > 2.1 + lt_snr * 0.32 ) )
221 : {
222 2816 : vad_flag = 1;
223 : }
224 3100 : if ( ( snr_flux > 1.68 ) && sp_center[3] > 2.76 && lt_snr_org < 3.5 )
225 : {
226 0 : vad_flag = 1;
227 : }
228 3100 : if ( ( snr_flux > 1.24 ) && sp_center[3] > 2.92 && lt_snr_org < 3.5 )
229 : {
230 0 : vad_flag = 1;
231 : }
232 3100 : if ( ( snr_flux > 1.10f ) && sp_center[3] > 4.6 && lt_snr_org < 3.5 )
233 : {
234 0 : vad_flag = 1;
235 : }
236 : }
237 :
238 3100 : if ( hVAD_CLDFB->fg_energy_est_start == 0 )
239 : {
240 36 : if ( ltd_stable_rate[0] > 0.08 && vad_flag == 1 && frame_energy > 50 )
241 : {
242 3 : hVAD_CLDFB->fg_energy_est_start = 1;
243 : }
244 : }
245 :
246 : /************************************************************************/
247 : /* hangover */
248 : /************************************************************************/
249 :
250 3100 : 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 3100 : if ( vad_flag == 0 && speech_flag > 0 )
253 : {
254 12 : speech_flag--;
255 12 : vad_flag = 1;
256 : }
257 :
258 3100 : vadb_flag = vad_flag;
259 :
260 3100 : if ( bw_index == CLDFBVAD_SWB_ID )
261 : {
262 3100 : if ( SILENCE == noisy_type && snr > 0.2 && vad_flag == 0 )
263 : {
264 0 : vad_flag = vada_flag;
265 : }
266 3100 : else if ( hVAD_CLDFB->lf_snr_smooth < 10.5 || SILENCE != noisy_type )
267 : {
268 3100 : if ( ( snr_flux > 1.8 ) || ( ( hVAD_CLDFB->continuous_speech_num2 > 40 ) && ( snr_flux > 1.6 ) ) || music_backgound_f == 1 )
269 : {
270 2923 : vad_flag = vada_flag | vadb_flag;
271 : }
272 : /*only use for silence*/
273 177 : else if ( noisy_type == SILENCE )
274 : {
275 0 : vad_flag = vada_flag;
276 : }
277 : }
278 : }
279 0 : else if ( bw_index == CLDFBVAD_WB_ID )
280 : {
281 0 : if ( SILENCE == noisy_type && snr > 0.2 && vad_flag == 0 )
282 : {
283 0 : vad_flag = vada_flag;
284 : }
285 : else
286 : {
287 0 : if ( hVAD_CLDFB->lf_snr_smooth < 10.5 || SILENCE != noisy_type )
288 : {
289 0 : if ( ( snr_flux > 2.2 ) || ( ( hVAD_CLDFB->continuous_speech_num2 > 40 ) && ( snr_flux > 1.6 ) ) || music_backgound_f == 1 )
290 : {
291 0 : vad_flag = vada_flag | vadb_flag;
292 : }
293 0 : else if ( SILENCE == noisy_type )
294 : {
295 0 : vad_flag = vada_flag;
296 : }
297 : }
298 : }
299 : }
300 : else
301 : {
302 0 : if ( noisy_type == SILENCE )
303 : {
304 0 : 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 0 : if ( ( snr_flux > 2.0 ) || ( hVAD_CLDFB->continuous_speech_num2 > 30 && ( snr_flux > 1.5 ) ) || music_backgound_f == 1 )
312 : {
313 0 : vad_flag = vada_flag | vadb_flag;
314 : }
315 : }
316 : }
317 :
318 3100 : if ( vad_flag == 0 )
319 : {
320 88 : if ( hVAD_CLDFB->l_silence_snr_count == 512 )
321 : {
322 0 : hVAD_CLDFB->l_silence_snr = hVAD_CLDFB->l_silence_snr * 0.75f;
323 0 : hVAD_CLDFB->l_silence_snr_count = 384;
324 :
325 0 : hVAD_CLDFB->l_silence_snr += snr;
326 0 : hVAD_CLDFB->l_silence_snr_count++;
327 : }
328 88 : else if ( snr < 0.8 )
329 : {
330 88 : hVAD_CLDFB->l_silence_snr += snr;
331 88 : hVAD_CLDFB->l_silence_snr_count++;
332 : }
333 : }
334 :
335 3100 : if ( vad_flag == 0 )
336 : {
337 88 : if ( bg_energy_count == 512 )
338 : {
339 0 : bg_energy = bg_energy * 0.75f;
340 0 : bg_energy_count = 384;
341 : }
342 :
343 88 : if ( tsnr < 1.0 )
344 : {
345 75 : bg_energy = bg_energy + frame_energy;
346 75 : bg_energy_count = bg_energy_count + 1;
347 : }
348 : }
349 :
350 3100 : hVAD_CLDFB->lt_snr_org = lt_snr_org;
351 3100 : hVAD_CLDFB->speech_flag = speech_flag;
352 :
353 3100 : hVAD_CLDFB->fg_energy_count = fg_energy_count;
354 3100 : hVAD_CLDFB->bg_energy_count = bg_energy_count;
355 3100 : hVAD_CLDFB->fg_energy = fg_energy;
356 3100 : hVAD_CLDFB->bg_energy = bg_energy;
357 3100 : hVAD_CLDFB->l_speech_snr_count = l_speech_snr_count;
358 :
359 3100 : hVAD_CLDFB->vad_flag_for_bk_update = vad_flag;
360 3100 : if ( hVAD_CLDFB->update_count < 12 && vadb_flag == 1 )
361 : {
362 2998 : hVAD_CLDFB->warm_hang_num = max( 20, speech_flag );
363 : }
364 :
365 3100 : if ( vad_flag == 0 && hVAD_CLDFB->warm_hang_num > 0 )
366 : {
367 58 : hVAD_CLDFB->warm_hang_num--;
368 58 : vad_flag = 1;
369 : }
370 :
371 3100 : if ( noisy_type == SILENCE && bw_index != CLDFBVAD_NB_ID )
372 :
373 : {
374 1209 : *cldfb_addition = 2;
375 : }
376 : else
377 : {
378 1891 : *cldfb_addition = 0;
379 :
380 1891 : if ( bw_index == CLDFBVAD_WB_ID )
381 : {
382 0 : *cldfb_addition = 3;
383 : }
384 :
385 1891 : if ( bw_index == CLDFBVAD_SWB_ID )
386 : {
387 1891 : *cldfb_addition = 1;
388 : }
389 :
390 1891 : if ( hVAD_CLDFB->bw_index == CLDFBVAD_NB_ID )
391 : {
392 0 : *cldfb_addition = 1;
393 : }
394 : }
395 :
396 3100 : return vad_flag;
397 : }
398 :
399 :
400 : /*-------------------------------------------------------------------*
401 : * construct_snr_thresh()
402 : *
403 : *
404 : *-------------------------------------------------------------------*/
405 :
406 3100 : 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 3100 : float test_l_snr = 0.f;
418 : float snr_delta;
419 : float snr_thresh;
420 : float bw_snr;
421 :
422 3100 : snr_delta = COMVAD_INIT_SNR_DELTA[bw_index];
423 3100 : bw_snr = lt_snr;
424 :
425 3100 : if ( bw_index == CLDFBVAD_SWB_ID )
426 : {
427 3100 : test_l_snr = lt_snr;
428 3100 : test_l_snr = test_l_snr * 1.0f;
429 :
430 3100 : if ( sp_center[3] > 2.80f )
431 : {
432 794 : snr_delta = snr_delta + 0.00f;
433 : }
434 2306 : else if ( sp_center[2] > 2.6 )
435 : {
436 113 : snr_delta = snr_delta + 0.03f;
437 : }
438 2193 : else if ( sp_center[2] > 1.6 )
439 : {
440 744 : snr_delta = snr_delta + 0.05f;
441 : }
442 1449 : else if ( sp_center[3] > 1.4 )
443 : {
444 447 : snr_delta = snr_delta + 0.10f;
445 : }
446 : else
447 : {
448 1002 : snr_delta = snr_delta + 0.40f;
449 : }
450 :
451 3100 : if ( continuous_speech_num > 8 && fg_energy_est_start == 1 )
452 : {
453 3017 : snr_delta = snr_delta - 0.2f;
454 : }
455 83 : else if ( continuous_noise_num > 12 && ( snr_flux > 0.6 + lf_snr * 0.1 ) )
456 : {
457 0 : snr_delta = snr_delta + 0.1f;
458 : }
459 83 : else if ( continuous_noise_num > 24 )
460 : {
461 0 : snr_delta = snr_delta + 0.2f;
462 : }
463 83 : else if ( ( continuous_noise_num > 4 ) )
464 : {
465 24 : snr_delta = snr_delta + 0.1f;
466 : }
467 : }
468 0 : else if ( bw_index == CLDFBVAD_WB_ID )
469 : {
470 0 : test_l_snr = lt_snr;
471 0 : if ( sp_center[3] > 2.80f )
472 : {
473 0 : snr_delta = snr_delta + 0.00f;
474 : }
475 0 : else if ( sp_center[2] > 2.6 )
476 : {
477 0 : snr_delta = snr_delta + 0.03f;
478 : }
479 0 : else if ( sp_center[2] > 1.6 )
480 : {
481 0 : snr_delta = snr_delta + 0.05f;
482 : }
483 0 : else if ( sp_center[3] > 1.4 )
484 : {
485 0 : snr_delta = snr_delta + 0.10f;
486 : }
487 : else
488 : {
489 0 : snr_delta = snr_delta + 0.30f;
490 : }
491 :
492 0 : if ( continuous_speech_num > 8 && fg_energy_est_start == 1 )
493 : {
494 0 : snr_delta = snr_delta - 0.1f;
495 : }
496 0 : else if ( continuous_noise_num > 12 && ( snr_flux > 0.6 + bw_snr * 0.1 ) )
497 : {
498 0 : snr_delta = snr_delta + 0.1f;
499 : }
500 0 : else if ( continuous_noise_num > 24 )
501 : {
502 0 : snr_delta = snr_delta + 0.2f;
503 : }
504 0 : else if ( ( continuous_noise_num > 4 ) )
505 : {
506 0 : snr_delta = snr_delta + 0.1f;
507 : }
508 : }
509 0 : else if ( bw_index == CLDFBVAD_NB_ID )
510 : {
511 0 : test_l_snr = lt_snr;
512 :
513 0 : if ( sp_center[3] > 3.0 )
514 : {
515 0 : snr_delta = snr_delta + 0.00f;
516 : }
517 0 : else if ( sp_center[2] > 2.6 )
518 : {
519 0 : snr_delta = snr_delta + 0.02f;
520 : }
521 0 : else if ( sp_center[2] > 1.6 )
522 : {
523 0 : snr_delta = snr_delta + 0.04f;
524 : }
525 0 : else if ( sp_center[2] > 1.46 )
526 : {
527 0 : snr_delta = snr_delta + 0.10f;
528 : }
529 : else
530 : {
531 0 : snr_delta = snr_delta + 0.18f;
532 : }
533 :
534 0 : if ( continuous_speech_num > 80 && fg_energy_est_start == 1 && ( sp_center[0] > 1.4 ) )
535 : {
536 0 : snr_delta = snr_delta - 0.32f;
537 : }
538 0 : else if ( continuous_speech_num > 8 && fg_energy_est_start == 1 && ( snr_flux > 0.2 + lf_snr * 0.1 ) )
539 : {
540 0 : snr_delta = snr_delta - 0.1f;
541 : }
542 0 : else if ( continuous_noise_num > 12 && ( snr_flux > 0.6 + lf_snr * 0.1 ) )
543 : {
544 0 : snr_delta = snr_delta + 0.1f;
545 : }
546 0 : else if ( continuous_noise_num > 24 )
547 : {
548 0 : snr_delta = snr_delta + 0.2f;
549 : }
550 : }
551 : else
552 : {
553 0 : snr_delta = 1.0f;
554 : }
555 :
556 3100 : snr_thresh = snr_delta + test_l_snr;
557 :
558 :
559 3100 : return snr_thresh;
560 : }
561 :
562 :
563 : /*-------------------------------------------------------------------*
564 : * comvad_hangover()
565 : *
566 : *
567 : *-------------------------------------------------------------------*/
568 :
569 3100 : 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 3100 : int16_t speech_flag = pre_res_hang_num;
582 :
583 3100 : if ( bw_index == CLDFBVAD_SWB_ID )
584 : {
585 3100 : if ( vad_flag )
586 : {
587 2986 : if ( lt_snr_org > 3.5f )
588 : {
589 2935 : speech_flag = 3;
590 : }
591 : else
592 : {
593 51 : speech_flag = 4;
594 : }
595 :
596 2986 : if ( ( continuous_speech_num2 < 8 ) && ( lt_snr_org < 4.0f ) )
597 : {
598 24 : speech_flag = 8 - continuous_speech_num2;
599 : }
600 2962 : else if ( ( snr_flux > 0.8 ) && ( continuous_speech_num2 > 24 ) )
601 : {
602 2837 : if ( lt_snr_org > 3.6f )
603 : {
604 2837 : speech_flag = 3;
605 : }
606 0 : else if ( lt_snr_org > 2.6f )
607 : {
608 0 : speech_flag = 3;
609 : }
610 0 : else if ( lt_snr_org > 1.6f )
611 : {
612 0 : speech_flag = 4;
613 : }
614 : else
615 : {
616 0 : speech_flag = 5;
617 : }
618 2837 : speech_flag = speech_flag - 1;
619 : }
620 :
621 2986 : if ( continuous_speech_num2 < 120 )
622 : {
623 624 : if ( snr > 1.5 )
624 : {
625 598 : speech_flag = 9;
626 : }
627 26 : else if ( snr > 1.0 && speech_flag < 7 )
628 : {
629 6 : speech_flag = 7;
630 : }
631 20 : else if ( speech_flag < 3 )
632 : {
633 0 : speech_flag = 3;
634 : }
635 624 : if ( speech_flag > 3 )
636 : {
637 604 : speech_flag -= 2;
638 : }
639 : }
640 : else
641 : {
642 2362 : if ( lt_snr_org > 3.6f )
643 : {
644 2362 : speech_flag = 1;
645 : }
646 0 : else if ( lt_snr_org > 3.0f )
647 : {
648 0 : speech_flag = 2;
649 : }
650 0 : else if ( lt_snr_org > 2.5f )
651 : {
652 0 : speech_flag = 3;
653 : }
654 0 : else if ( lt_snr_org > 2.0f )
655 : {
656 0 : speech_flag = 3;
657 : }
658 0 : else if ( lt_snr_org > 1.5f )
659 : {
660 0 : speech_flag = 4;
661 : }
662 : else
663 : {
664 0 : speech_flag = 5;
665 : }
666 : }
667 :
668 2986 : if ( noisy_type == SILENCE )
669 : {
670 1209 : speech_flag = 6;
671 : }
672 : }
673 : }
674 0 : else if ( bw_index == CLDFBVAD_WB_ID )
675 : {
676 0 : if ( vad_flag )
677 : {
678 0 : if ( lt_snr_org > 3.5f )
679 : {
680 0 : speech_flag = 1;
681 : }
682 : else
683 : {
684 0 : speech_flag = 2;
685 : }
686 :
687 0 : if ( ( continuous_speech_num2 < 8 ) && ( lt_snr_org < 4.0f ) )
688 : {
689 0 : speech_flag = 8 - continuous_speech_num2;
690 : }
691 0 : else if ( ( snr_flux > 0.9 ) && ( continuous_speech_num2 > 50 ) )
692 : {
693 0 : if ( lt_snr_org > 3.6f )
694 : {
695 0 : speech_flag = 1;
696 : }
697 0 : else if ( lt_snr_org > 2.6f )
698 : {
699 0 : speech_flag = 5;
700 : }
701 0 : else if ( lt_snr_org > 1.6f )
702 : {
703 0 : speech_flag = 6;
704 : }
705 : else
706 : {
707 0 : speech_flag = 7;
708 : }
709 :
710 0 : if ( speech_flag > 1 )
711 : {
712 0 : speech_flag = speech_flag - 1;
713 : }
714 : }
715 :
716 0 : if ( continuous_speech_num2 < 120 )
717 : {
718 0 : if ( snr > 1.5 )
719 : {
720 0 : speech_flag = 6;
721 : }
722 0 : else if ( snr > 1.0 && speech_flag < 5 )
723 : {
724 0 : speech_flag = 5;
725 : }
726 0 : else if ( snr > 0.8 && lt_snr_org < 2 && speech_flag < 4 )
727 : {
728 0 : speech_flag = 4;
729 : }
730 0 : else if ( speech_flag < 3 )
731 : {
732 0 : speech_flag = 3;
733 : }
734 : }
735 : else
736 : {
737 0 : if ( lt_snr_org > 3.6f )
738 : {
739 0 : speech_flag = 1;
740 : }
741 0 : else if ( lt_snr_org > 3.0f )
742 : {
743 0 : speech_flag = 2;
744 : }
745 0 : else if ( lt_snr_org > 2.5f )
746 : {
747 0 : speech_flag = 2;
748 : }
749 0 : else if ( lt_snr_org > 2.0f )
750 : {
751 0 : speech_flag = 3;
752 : }
753 : else
754 : {
755 0 : speech_flag = 3;
756 : }
757 : }
758 :
759 0 : if ( noisy_type == SILENCE )
760 : {
761 0 : speech_flag = 6;
762 : }
763 : }
764 : }
765 : else
766 : {
767 0 : if ( vad_flag )
768 : {
769 0 : if ( lt_snr_org > 3.5f )
770 : {
771 0 : speech_flag = 3;
772 : }
773 : else
774 : {
775 0 : speech_flag = 4;
776 : }
777 :
778 0 : if ( ( continuous_speech_num2 < 8 ) && ( lt_snr_org < 4.0f ) )
779 : {
780 0 : speech_flag = 8 - continuous_speech_num2;
781 : }
782 0 : else if ( ( snr_flux > 0.8 + lf_snr * 0.1 ) && ( continuous_speech_num2 > 24 ) )
783 : {
784 0 : if ( lt_snr_org > 3.6f )
785 : {
786 0 : speech_flag = 3;
787 : }
788 0 : else if ( lt_snr_org > 2.6f )
789 : {
790 0 : speech_flag = 8;
791 : }
792 0 : else if ( lt_snr_org > 1.2f )
793 : {
794 0 : speech_flag = 10;
795 : }
796 : else
797 : {
798 0 : speech_flag = 12;
799 : }
800 :
801 0 : if ( speech_flag > 2 )
802 : {
803 0 : speech_flag = speech_flag - 2;
804 : }
805 : }
806 :
807 0 : if ( continuous_speech_num2 < 120 )
808 : {
809 0 : if ( snr > 1.5 )
810 : {
811 0 : speech_flag = 10;
812 : }
813 0 : else if ( snr > 1.0 && speech_flag < 7 )
814 : {
815 0 : speech_flag = 7;
816 : }
817 0 : else if ( speech_flag < 3 && continuous_speech_num2 > 12 )
818 : {
819 0 : speech_flag = 3;
820 : }
821 : }
822 : else
823 : {
824 0 : if ( lt_snr_org > 3.6f )
825 : {
826 0 : speech_flag = 2;
827 : }
828 0 : else if ( lt_snr_org > 3.0f )
829 : {
830 0 : speech_flag = 2;
831 : }
832 0 : else if ( lt_snr_org > 2.5f )
833 : {
834 0 : speech_flag = 3;
835 : }
836 0 : else if ( lt_snr_org > 2.0f )
837 : {
838 0 : speech_flag = 3;
839 : }
840 0 : else if ( lt_snr_org > 1.5f )
841 : {
842 0 : speech_flag = 4;
843 : }
844 : else
845 : {
846 0 : speech_flag = 4;
847 : }
848 : }
849 :
850 0 : if ( noisy_type == SILENCE )
851 : {
852 0 : speech_flag = 2;
853 : }
854 : }
855 : }
856 :
857 3100 : if ( vad_flag == 1 )
858 : {
859 2986 : if ( noisy_type != SILENCE )
860 : {
861 1777 : speech_flag--;
862 : }
863 : else
864 : {
865 1209 : speech_flag = speech_flag - 3;
866 : }
867 :
868 2986 : if ( speech_flag < 0 )
869 : {
870 0 : speech_flag = 0;
871 : }
872 : }
873 :
874 3100 : return speech_flag;
875 : }
|