LCOV - code coverage report
Current view: top level - lib_enc - comvad_decision_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 199 428 46.5 %
Date: 2025-05-03 01:55:50 Functions: 2 2 100.0 %

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

Generated by: LCOV version 1.14