LCOV - code coverage report
Current view: top level - lib_enc - comvad_decision.c (source / functions) Hit Total Coverage
Test: Coverage on main -- short test vectors @ 6c9ddc4024a9c0e1ecb8f643f114a84a0e26ec6b Lines: 149 324 46.0 %
Date: 2025-05-23 08:37:30 Functions: 3 3 100.0 %

          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             : }

Generated by: LCOV version 1.14