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

          Line data    Source code
       1             : /*====================================================================================
       2             :         EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : 
       5             : #include <stdint.h>
       6             : #include "options.h"
       7             : #include "basop_util.h"
       8             : #include "vad_basop.h"
       9             : #include "prot_fx.h"     /* Function prototypes                    */
      10             : #include "prot_fx_enc.h" /* Function prototypes                    */
      11             : #include "rom_enc.h"
      12             : #include "rom_com.h"
      13             : 
      14             : 
      15             : /*-------------------------------------------------------------------*
      16             :  * calc_lf_snr_fx()
      17             :  *
      18             :  *
      19             :  *-------------------------------------------------------------------*/
      20             : 
      21        3100 : void calc_lf_snr_fx(
      22             :     Word32 *lf_snr_smooth,            /* o  : smoothed lf_snr   Q25*/
      23             :     Word32 *lf_snr,                   /* o  : long time frequency domain SNR calculated by l_speech_snr and l_silence_snr       Q25*/
      24             :     const Word32 l_speech_snr,        /* i  : sum of active frames snr                          Q16*/
      25             :     const Word32 l_speech_snr_count,  /* i  : amount of the active frame                         Q0*/
      26             :     const Word32 l_silence_snr,       /* i  : sum of the nonactive frames snr           Q16*/
      27             :     const Word32 l_silence_snr_count, /* i  : amount of the nonactive frame                      Q0*/
      28             :     const Word16 fg_energy_count,     /* i  : amount of the foreground energy frame  Q0*/
      29             :     const Word16 bg_energy_count,     /* i  : amount of the background energy frame  Q0*/
      30             :     const Word16 bw_index             /* i  : band width index                                           Q0*/
      31             : )
      32             : {
      33             : 
      34             :     Word32 l_snr, div1, div2, tmp;
      35             :     Word16 q_divout, q_divout1;
      36             : 
      37             : 
      38        3100 :     div1 = VAD_L_div( l_speech_snr, l_speech_snr_count, 16, 0, &q_divout );      /* q_divout */
      39        3100 :     div2 = VAD_L_div( l_silence_snr, l_silence_snr_count, 16, 0, &q_divout1 );   /* q_divout1 */
      40        3100 :     l_snr = VAD_L_ADD( div1, q_divout, L_negate( div2 ), q_divout1, &q_divout ); /* q_divout */
      41             : 
      42        3100 :     *lf_snr_smooth = MUL_F( *lf_snr_smooth, 29490 /* 0.9 Q15 */ );
      43        3100 :     move32();
      44        3100 :     tmp = MUL_F( l_snr, 26214 /* 0.8 in Q15 */ );
      45        3100 :     *lf_snr_smooth = VAD_L_ADD( *lf_snr_smooth, 25, tmp, add( 3, q_divout ), &q_divout1 ); /* q_divout1 */
      46        3100 :     move32();
      47        3100 :     *lf_snr_smooth = L_shr( *lf_snr_smooth, sub( q_divout1, 25 ) ); /* Q25 */
      48        3100 :     move32();
      49        3100 :     l_snr = L_shr( l_snr, sub( q_divout, 25 ) ); /* Q25 */
      50             : 
      51        3100 :     test();
      52        3100 :     if ( ( LT_16( bg_energy_count, 56 ) ) || ( LT_16( fg_energy_count, 56 ) ) )
      53             :     {
      54        3100 :         l_snr = 161061275 /* 4.8 Q25 */;
      55        3100 :         move32();
      56             :     }
      57             : 
      58        3100 :     l_snr = MUL_F( l_snr, 3932 /* 0.12 Q15 */ );
      59        3100 :     l_snr = L_sub( l_snr, 12079595 /* 0.36 Q25 */ );
      60             : 
      61        3100 :     l_snr = L_max( 0, l_snr );
      62        3100 :     l_snr = L_min( l_snr, MAX_LF_SNR_TAB_FX[bw_index] ); /* Q25 */
      63             : 
      64        3100 :     *lf_snr = l_snr; /* Q25 */
      65        3100 :     move32();
      66        3100 :     return;
      67             : }
      68             : /*-------------------------------------------------------------------*
      69             :  * calc_lt_snr_fx()
      70             :  *
      71             :  *
      72             :  *-------------------------------------------------------------------*/
      73        3100 : void calc_lt_snr_fx(
      74             :     VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state     */
      75             :     Word32 *lt_snr_org_fp,       /* o  : original long time SNR                                         Q25*/
      76             :     Word32 *lt_snr_fp,           /* o  : long time SNR calculated by fg_energy and bg_energy    Q25*/
      77             :     Word32 fg_energy,            /* i  : foreground energy sum                                           Qx*/
      78             :     Word16 fg_energy_count,      /* i  : amount of the foreground energy frame           Q0*/
      79             :     Word32 bg_energy,            /* i  : background energy sum                                           Qx*/
      80             :     Word16 bg_energy_count,      /* i  : amount of the background energy frame           Q0*/
      81             :     Word16 bw_index,             /* i  : band width index                                                        Q0*/
      82             :     Word16 lt_noise_sp_center0   /* i  : long time noise spectral center by 0           Q10*/
      83             : )
      84             : {
      85             :     Word16 tmp_lt_noise_sp_center;
      86             :     Word16 q_div1, q_div2, q_divout, q_divout1;
      87             :     Word32 lt_snr_org;
      88             :     Word32 lt_snr, div1, div2, tmp;
      89             : 
      90             : 
      91        3100 :     tmp_lt_noise_sp_center = sub( lt_noise_sp_center0, 1432 /* 1.4 Q10 */ ); /* Q10 */
      92        3100 :     if ( GT_16( tmp_lt_noise_sp_center, 818 /* 0.8 Q10 */ ) )
      93             :     {
      94           0 :         tmp_lt_noise_sp_center = 818 /* 0.8 Q10 */;
      95           0 :         move16();
      96             :     }
      97             : 
      98        3100 :     if ( tmp_lt_noise_sp_center < 0 )
      99             :     {
     100          71 :         tmp_lt_noise_sp_center = 0;
     101          71 :         move16();
     102             :     }
     103             : 
     104        3100 :     div1 = MUL_F( fg_energy, bg_energy_count );
     105        3100 :     div1 = VAD_L_ADD( div1, hVAD_CLDFB->fg_energy_scale, 1, 126, &q_div1 ); /* q_div1 */
     106        3100 :     div2 = MUL_F( bg_energy, fg_energy_count );
     107        3100 :     div2 = VAD_L_ADD( div2, hVAD_CLDFB->bg_energy_scale, 1, 126, &q_div2 ); /* q_div2 */
     108        3100 :     IF( div2 == 0 )
     109             :     {
     110           0 :         div2 = 1;
     111           0 :         move32(); /* div2==0 , may occur for >30000 frames  all zero input  */
     112           0 :         if ( div1 != 0 )
     113             :         {
     114           0 :             hVAD_CLDFB->bg_energy_scale = add( hVAD_CLDFB->fg_energy_scale, 50 );
     115           0 :             move16();
     116             :         }
     117             :     }
     118        3100 :     div2 = VAD_L_div( div1, div2, q_div1, q_div2, &q_divout ); /* q_divout */
     119        3100 :     lt_snr_org = VAD_Log2( div2, q_divout );
     120        3100 :     lt_snr_org = MUL_F( lt_snr_org, 9864 /* 0.3 in Q15 */ ); /* Q25 */
     121        3100 :     lt_snr = lt_snr_org;                                     /* Q25 */
     122        3100 :     move32();
     123        3100 :     *lt_snr_org_fp = lt_snr; /* Q25 */
     124        3100 :     move32();
     125             : 
     126        3100 :     test();
     127        3100 :     if ( LT_16( bg_energy_count, 56 ) || LT_16( fg_energy_count, 56 ) )
     128             :     {
     129        3100 :         lt_snr = 70464302 /* 2.1 Q25 */;
     130        3100 :         move32();
     131             :     }
     132             : 
     133        3100 :     IF( EQ_16( bw_index, CLDFBVAD_NB_ID ) )
     134             :     {
     135           0 :         lt_snr = L_sub( L_shr( lt_snr, 1 ), 25165823 /* 0.75 Q25 */ ); /* Q25 */
     136             :     }
     137        3100 :     ELSE IF( EQ_16( bw_index, CLDFBVAD_WB_ID ) )
     138             :     {
     139           0 :         lt_snr = L_sub( L_shr( lt_snr, 1 ), 25165823 /* 0.75 Q25 */ ); /* Q25 */
     140             :     }
     141             :     ELSE
     142             :     {
     143        3100 :         lt_snr = MUL_F( lt_snr, 15073 /* 0.46 Q15 */ );    /* Q25 */
     144        3100 :         lt_snr = L_sub( lt_snr, 23152557 /* 0.69 Q25 */ ); /* Q25 */
     145             :     }
     146             : 
     147        3100 :     tmp = MUL_F( lt_snr, 13107 /* 0.4 Q15 */ ); /* Q25 */
     148             : 
     149        3100 :     tmp = L_add( L_shr( tmp, 1 ), -26214 /* 0.0007 in Q25 */ );
     150             : 
     151        3100 :     tmp = MUL_F( tmp, 13107 /* 0.4 Q15 */ ); /* Q25 */
     152        3100 :     tmp = MUL_F( tmp, tmp_lt_noise_sp_center );
     153        3100 :     lt_snr = VAD_L_ADD( lt_snr, 25, tmp, 19, &q_divout1 ); /* q_divout1 */
     154        3100 :     lt_snr = L_shr( lt_snr, sub( q_divout1, 25 ) );        /* Q25 */
     155             : 
     156        3100 :     lt_snr = L_max( 0, lt_snr );
     157             : 
     158        3100 :     if ( GT_32( lt_snr, 67108862 /* 2.0 Q25 */ ) )
     159             :     {
     160           0 :         lt_snr = 67108862 /* 2.0 Q25 */;
     161           0 :         move32();
     162             :     }
     163             : 
     164        3100 :     *lt_snr_fp = lt_snr; /* Q25 */
     165        3100 :     move32();
     166        3100 :     return;
     167             : }
     168             : 
     169             : /*-------------------------------------------------------------------*
     170             :  * calc_snr_flux_fx()
     171             :  *
     172             :  *
     173             :  *-------------------------------------------------------------------*/
     174        3100 : void calc_snr_flux_fx(
     175             :     Word32 tsnr,        /* i  :  time-domain SNR                Q25*/
     176             :     Word32 *pre_snr,    /* i/o: time-domain SNR storage Q25*/
     177             :     Word32 *snr_flux_fp /* o  :  average tsnr                   Q25*/
     178             : )
     179             : {
     180             :     Word32 i;
     181             :     Word32 tmp, snr_flux;
     182             :     Word16 s16MaxCoefNorm;
     183             :     /*save a new time-domain SNR to pre_snr[0]*/
     184             : 
     185             : 
     186        3100 :     test();
     187        3100 :     IF( ( LT_32( L_shr( tsnr, 1 ), 43620759 /* 2.6f/2.0f Q25 */ ) ) && tsnr > 0 )
     188             :     {
     189          64 :         pre_snr[0] = tsnr; /* Q25 */
     190          64 :         move32();
     191             :     }
     192        3036 :     ELSE IF( tsnr <= 0 )
     193             :     {
     194         107 :         pre_snr[0] = 0;
     195         107 :         move32();
     196             :     }
     197             :     ELSE
     198             :     {
     199        2929 :         pre_snr[0] = 87241517 /* 2.6 Q25 */;
     200        2929 :         move32();
     201             :     }
     202             : 
     203             :     /*calculate snr_flux*/
     204        3100 :     snr_flux = 0;
     205        3100 :     move32();
     206        3100 :     s16MaxCoefNorm = sub( ffr_getSfWord32( pre_snr, 32 ), 5 );
     207      102300 :     FOR( i = 0; i < 32; i++ )
     208             :     {
     209       99200 :         tmp = L_shl( pre_snr[i], s16MaxCoefNorm ); /* Q25 + s16MaxCoefNorm */
     210       99200 :         snr_flux = L_add( snr_flux, tmp );
     211             :     }
     212        3100 :     snr_flux = L_shr( snr_flux, add( s16MaxCoefNorm, 5 ) );
     213        3100 :     *snr_flux_fp = snr_flux; /* Q25 */
     214        3100 :     move32();
     215             : 
     216             :     /*update the tsnr storage pre_snr*/
     217       99200 :     FOR( i = PRE_SNR_NUM - 1; i > 0; i-- )
     218             :     {
     219       96100 :         pre_snr[i] = pre_snr[i - 1]; /* Q25 */
     220       96100 :         move32();
     221             :     }
     222        3100 :     return;
     223             : }
     224             : 
     225             : 
     226             : /*-------------------------------------------------------------------*
     227             :  * SNR_calc()
     228             :  *
     229             :  *
     230             :  *-------------------------------------------------------------------*/
     231        3100 : void snr_calc(
     232             :     VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state                   */
     233             :     const Word16 sacle_sbpower,  /* i  : the Scaling of sbpower    */
     234             :     Word32 *snr,                 /* o  : frequency domain SNR   Q25*/
     235             :     Word32 *tsnr,                /* o  : time domain SNR                Q25*/
     236             :     const Word32 frame_energy,   /* i  : current frame energy   sacle_sbpower*/
     237             :     const Word32 bwidth          /* i  : audio band width               Q0*/
     238             : )
     239             : {
     240             :     Word32 i;
     241             :     Word32 tmpframe_eg, tmpsb_eg, constff, div1, div2;
     242             :     Word32 snr_tmp, tmp;
     243             : 
     244             :     Word32 SNR_sb_num;
     245             :     Word32 *sb_bg_energy;
     246             :     Word32 *frame_sb_energy;
     247             :     Word32 t_bg_energy;
     248             :     Word16 tmp_addQ1, tmp_addQ2, minscale, minscale1, minscale2, s16MaxCoefNorm, q_divout;
     249             :     Word32 tmpspec_amp;
     250        3100 :     Word32 const CONSTfix = 1759218560;
     251        3100 :     move32();
     252             :     Word32 snr_tmpidx[12];
     253             : 
     254        3100 :     set_zero_fx( snr_tmpidx, 12 );
     255             : 
     256        3100 :     SNR_sb_num = SNR_SUB_BAND_NUM[bwidth - CLDFBVAD_NB_ID]; /* Q0 */
     257        3100 :     move16();
     258        3100 :     sb_bg_energy = hVAD_CLDFB->sb_bg_energy;
     259        3100 :     frame_sb_energy = hVAD_CLDFB->frame_sb_energy;
     260        3100 :     t_bg_energy = hVAD_CLDFB->t_bg_energy;
     261        3100 :     move32();
     262             : 
     263        3100 :     snr_tmp = 0;
     264        3100 :     move32();
     265       40300 :     FOR( i = 0; i < SNR_sb_num; i++ )
     266             :     {
     267       37200 :         div1 = VAD_L_ADD( frame_sb_energy[i], hVAD_CLDFB->frame_sb_energy_scale, CONSTfix, 44, &tmp_addQ1 ); /* tmp_addQ1 */
     268       37200 :         div2 = VAD_L_ADD( sb_bg_energy[i], hVAD_CLDFB->sb_bg_energy_scale, CONSTfix, 44, &tmp_addQ2 );       /* tmp_addQ2 */
     269       37200 :         tmp = VAD_L_div( div1, div2, tmp_addQ1, tmp_addQ2, &q_divout );                                      /* q_divout */
     270       37200 :         tmp = VAD_Log2( tmp, q_divout );
     271             : 
     272       37200 :         if ( GT_32( tmp, -3355443 /* -0.10 Q25 */ ) )
     273             :         {
     274       29669 :             snr_tmpidx[i] = tmp; /* Q25 */
     275       29669 :             move32();
     276             :         }
     277             :     }
     278             : 
     279        3100 :     s16MaxCoefNorm = sub( ffr_getSfWord32( snr_tmpidx, (Word16) SNR_sb_num ), 4 );
     280       40300 :     FOR( i = 0; i < SNR_sb_num; i++ )
     281             :     {
     282       37200 :         tmpspec_amp = L_shl( snr_tmpidx[i], s16MaxCoefNorm ); /* Q25 + s16MaxCoefNorm */
     283       37200 :         snr_tmp = L_add( snr_tmp, tmpspec_amp );
     284             :     }
     285        3100 :     snr_tmp = L_max( 0, snr_tmp );
     286        3100 :     snr_tmp = MUL_F( snr_tmp, BAND_MUL[bwidth - CLDFBVAD_NB_ID] ); /* Q25 + s16MaxCoefNorm */
     287        3100 :     *snr = L_shr( snr_tmp, s16MaxCoefNorm );                       /* Q25 */
     288        3100 :     move32();
     289             : 
     290        3100 :     IF( EQ_32( bwidth, CLDFBVAD_SWB_ID ) )
     291             :     {
     292        3100 :         IF( t_bg_energy )
     293             :         {
     294        3100 :             minscale = norm_l( t_bg_energy );
     295        3100 :             minscale2 = sub( s_min( add( minscale, hVAD_CLDFB->scale_t_bg_energy ), 31 ), 1 );
     296        3100 :             tmpsb_eg = L_shr( t_bg_energy, sub( hVAD_CLDFB->scale_t_bg_energy, minscale2 ) ); /* minscale2 */
     297        3100 :             constff = L_shr( 1, sub( 31, minscale2 ) );
     298             :         }
     299             :         ELSE
     300             :         {
     301           0 :             tmpsb_eg = 0;
     302           0 :             move32();
     303           0 :             constff = 1;
     304           0 :             move32();
     305           0 :             minscale2 = 31;
     306           0 :             move16();
     307             :         }
     308        3100 :         div2 = L_add( tmpsb_eg, constff );
     309        3100 :         tmp = VAD_L_div( frame_energy, div2, sacle_sbpower, minscale2, &q_divout ); /* q_divout */
     310        3100 :         IF( tmp )
     311             :         {
     312        3100 :             minscale = norm_l( tmp );
     313        3100 :             minscale2 = sub( s_min( add( minscale, q_divout ), 31 ), 1 );
     314        3100 :             tmpsb_eg = L_shr( tmp, limitScale32( sub( q_divout, minscale2 ) ) ); /* minscale2 */
     315        3100 :             constff = L_shr( 1, sub( 31, minscale2 ) );
     316        3100 :             tmp = L_add( tmpsb_eg, constff );
     317             :         }
     318             :         ELSE
     319             :         {
     320           0 :             tmp = 1;
     321           0 :             move32();
     322           0 :             minscale2 = 31;
     323           0 :             move16();
     324             :         }
     325        3100 :         *tsnr = VAD_Log2( tmp, minscale2 );
     326        3100 :         move32();
     327        3100 :         *tsnr = L_add_sat( *tsnr, MUL_F( *tsnr, 6226 ) ); /* *tsnr *= 1.2;   Q25*/
     328        3100 :         move32();
     329             :     }
     330             :     ELSE
     331             :     {
     332           0 :         IF( frame_energy )
     333             :         {
     334           0 :             minscale = norm_l( frame_energy );
     335           0 :             minscale1 = sub( s_min( add( minscale, sacle_sbpower ), 44 ), 1 );
     336           0 :             tmpframe_eg = L_shr( frame_energy, sub( sacle_sbpower, minscale1 ) ); /* minscale1 */
     337           0 :             constff = L_shr( CONSTfix, sub( 44, minscale1 ) );
     338             :         }
     339             :         ELSE
     340             :         {
     341           0 :             tmpframe_eg = 0;
     342           0 :             move32();
     343           0 :             constff = CONSTfix;
     344           0 :             move32();
     345           0 :             minscale1 = 44;
     346           0 :             move16();
     347             :         }
     348           0 :         div1 = L_add( tmpframe_eg, constff );
     349           0 :         IF( t_bg_energy )
     350             :         {
     351           0 :             minscale = norm_l( t_bg_energy );
     352           0 :             minscale2 = sub( s_min( add( minscale, hVAD_CLDFB->scale_t_bg_energy ), 44 ), 1 );
     353           0 :             tmpsb_eg = L_shr( t_bg_energy, sub( hVAD_CLDFB->scale_t_bg_energy, minscale2 ) ); /* minscale2 */
     354           0 :             constff = L_shr( CONSTfix, sub( 44, minscale2 ) );
     355             :         }
     356             :         ELSE
     357             :         {
     358           0 :             tmpsb_eg = 0;
     359           0 :             move32();
     360           0 :             constff = CONSTfix;
     361           0 :             move32();
     362           0 :             minscale2 = 44;
     363           0 :             move16();
     364             :         }
     365           0 :         div2 = L_add( tmpsb_eg, constff );
     366           0 :         tmp = VAD_L_div( div1, div2, minscale1, minscale2, &q_divout ); /* q_divout */
     367           0 :         *tsnr = VAD_Log2( tmp, q_divout );                              /* Q25 */
     368           0 :         move32();
     369             :     }
     370        3100 :     return;
     371             : }
     372             : 
     373        3100 : Word32 construct_snr_thresh_fx(
     374             :     Word16 sp_center[],           /* i  : spectral center                                               Q10*/
     375             :     Word32 snr_flux,              /* i  : snr flux                                                              Q25*/
     376             :     Word32 lt_snr,                /* i  : long time time domain snr                             Q25*/
     377             :     Word32 l_snr,                 /* i  : long time frequency domain snr                Q25*/
     378             :     Word32 continuous_speech_num, /* i  : amount of continuous speech frames    Q0*/
     379             :     Word16 continuous_noise_num,  /* i  : amount of continuous noise frames             Q0*/
     380             :     Word32 fg_energy_est_start,   /* i  : whether if estimated energy                   Q0*/
     381             :     Word16 bw_index               /* i  : band width index                                              Q0*/
     382             : )
     383             : {
     384             : 
     385             :     Word32 bw_snr, tmp_snr, snr_delta, test_l_snr, tmp, div1, div2;
     386             : 
     387             : 
     388        3100 :     snr_delta = COMVAD_INIT_SNR_DELTA_FX[bw_index]; /* Q25 */
     389        3100 :     move32();
     390        3100 :     bw_snr = lt_snr;
     391        3100 :     move32();
     392             : 
     393             : 
     394        3100 :     test_l_snr = lt_snr;
     395        3100 :     move32();
     396        3100 :     IF( EQ_16( bw_index, CLDFBVAD_SWB_ID ) )
     397             :     {
     398        3100 :         IF( GT_16( sp_center[2], 2660 /* 2.6 Q10 */ ) )
     399             :         {
     400         489 :             snr_delta = L_add( snr_delta, 1006633 /* 0.03 Q25 */ ); /* Q25 */
     401             :         }
     402        2611 :         ELSE IF( GT_16( sp_center[2], 1637 /* 1.6 Q10 */ ) )
     403             :         {
     404         943 :             snr_delta = L_add( snr_delta, 1677722 /* 0.05 Q25 */ ); /* Q25 */
     405             :         }
     406        1668 :         ELSE IF( GT_16( sp_center[3], 1432 /* 1.4 Q10 */ ) )
     407             :         {
     408         664 :             snr_delta = L_add( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
     409             :         }
     410             :         ELSE
     411             :         {
     412        1004 :             snr_delta = L_add( snr_delta, 13421773 /* 0.40 Q25 */ ); /* Q25 */
     413             :         }
     414             : 
     415        3100 :         tmp = MUL_F( l_snr, 3277 /* 0.1 Q15 */ ); /* Q25 */
     416        3100 :         tmp = L_add( tmp, 20132659 /* 0.6 Q25 */ );
     417             : 
     418        3100 :         test();
     419        3100 :         test();
     420        3100 :         IF( GT_32( continuous_speech_num, 8 ) && EQ_32( fg_energy_est_start, 1 ) )
     421             :         {
     422        3017 :             snr_delta = L_sub( snr_delta, 6710886 /* 0.2 Q25 */ ); /* Q25 */
     423             :         }
     424          83 :         ELSE IF( GT_16( continuous_noise_num, 12 ) && ( GT_32( snr_flux, tmp ) ) )
     425             :         {
     426           0 :             snr_delta = L_add( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
     427             :         }
     428          83 :         ELSE IF( GT_16( continuous_noise_num, 24 ) )
     429             :         {
     430           0 :             snr_delta = L_add( snr_delta, 6710886 /* 0.2 Q25 */ ); /* Q25 */
     431             :         }
     432          83 :         ELSE IF( ( GT_16( continuous_noise_num, 4 ) ) )
     433             :         {
     434          24 :             snr_delta = L_add( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
     435             :         }
     436             :     }
     437           0 :     ELSE IF( EQ_16( bw_index, CLDFBVAD_WB_ID ) )
     438             :     {
     439           0 :         IF( GT_16( sp_center[2], 2660 /* 2.6 Q10 */ ) )
     440             :         {
     441           0 :             snr_delta = L_add( snr_delta, 1006633 /* 0.03 Q25 */ ); /* Q25 */
     442             :         }
     443           0 :         ELSE IF( GT_16( sp_center[2], 1637 /* 1.6 Q10 */ ) )
     444             :         {
     445           0 :             snr_delta = L_add( snr_delta, 1677722 /* 0.05 Q25 */ ); /* Q25 */
     446             :         }
     447           0 :         ELSE IF( GT_16( sp_center[3], 1432 /* 1.4 Q10 */ ) )
     448             :         {
     449           0 :             snr_delta = L_add( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
     450             :         }
     451             :         ELSE
     452             :         {
     453           0 :             snr_delta = L_add( snr_delta, 10066330 /* 0.30 Q25 */ ); /* Q25 */
     454             :         }
     455             : 
     456           0 :         tmp = MUL_F( bw_snr, 3277 /* 0.1 Q15 */ );  /* Q25 */
     457           0 :         tmp = L_add( tmp, 20132659 /* 0.6 Q25 */ ); /* Q25 */
     458             : 
     459           0 :         test();
     460           0 :         test();
     461           0 :         IF( GT_32( continuous_speech_num, 8 ) && EQ_32( fg_energy_est_start, 1 ) )
     462             :         {
     463           0 :             snr_delta = L_sub( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
     464             :         }
     465           0 :         ELSE IF( GT_16( continuous_noise_num, 12 ) && ( GT_32( snr_flux, tmp ) ) )
     466             :         {
     467           0 :             snr_delta = L_add( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
     468             :         }
     469           0 :         ELSE IF( GT_16( continuous_noise_num, 24 ) )
     470             :         {
     471           0 :             snr_delta = L_add( snr_delta, 6710886 /* 0.20 Q25 */ ); /* Q25 */
     472             :         }
     473           0 :         ELSE IF( ( GT_16( continuous_noise_num, 4 ) ) )
     474             :         {
     475           0 :             snr_delta = L_add( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
     476             :         }
     477             :     }
     478           0 :     ELSE IF( EQ_16( bw_index, CLDFBVAD_NB_ID ) )
     479             :     {
     480           0 :         IF( GT_16( sp_center[2], 2660 /* 2.6 Q10 */ ) )
     481             :         {
     482           0 :             snr_delta = L_add( snr_delta, 671089 /* 0.02 Q25 */ ); /* Q25 */
     483             :         }
     484           0 :         ELSE IF( GT_16( sp_center[2], 1637 /* 1.6 Q10 */ ) )
     485             :         {
     486           0 :             snr_delta = L_add( snr_delta, 1342177 /* 0.04 Q25 */ ); /* Q25 */
     487             :         }
     488           0 :         ELSE IF( GT_16( sp_center[2], 1494 /* 1.46 Q10 */ ) )
     489             :         {
     490           0 :             snr_delta = L_add( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
     491             :         }
     492             :         ELSE
     493             :         {
     494           0 :             snr_delta = L_add( snr_delta, 6039798 /* 0.18 Q25 */ ); /* Q25 */
     495             :         }
     496             : 
     497           0 :         tmp = MUL_F( l_snr, 3277 /* 0.1 Q15 */ );    /* Q25 */
     498           0 :         div1 = L_add( tmp, 6710886 /* 0.2 Q25 */ );  /* Q25 */
     499           0 :         div2 = L_add( tmp, 20132659 /* 0.6 Q25 */ ); /* Q25 */
     500             : 
     501           0 :         test();
     502           0 :         test();
     503           0 :         test();
     504           0 :         test();
     505           0 :         test();
     506           0 :         IF( GT_32( continuous_speech_num, 80 ) && EQ_32( fg_energy_est_start, 1 ) && ( GT_16( sp_center[0], 1432 /* 1.4 Q10 */ ) ) )
     507             :         {
     508           0 :             snr_delta = L_sub( snr_delta, 10737418 /* 0.32 Q25 */ ); /* Q25 */
     509             :         }
     510           0 :         ELSE IF( GT_32( continuous_speech_num, 8 ) && EQ_32( fg_energy_est_start, 1 ) && ( GT_32( snr_flux, div1 ) ) )
     511             :         {
     512           0 :             snr_delta = L_sub( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
     513             :         }
     514           0 :         ELSE IF( GT_16( continuous_noise_num, 12 ) && ( GT_32( snr_flux, div2 ) ) )
     515             :         {
     516           0 :             snr_delta = L_add( snr_delta, 3355443 /* 0.10 Q25 */ ); /* Q25 */
     517             :         }
     518           0 :         ELSE IF( GT_16( continuous_noise_num, 24 ) )
     519             :         {
     520           0 :             snr_delta = L_add( snr_delta, 6710886 /* 0.2 Q25 */ ); /* Q25 */
     521             :         }
     522             :     }
     523             :     ELSE
     524             :     {
     525           0 :         snr_delta = 33554431 /* 1.0 Q25 */;
     526           0 :         move32();
     527             :     }
     528        3100 :     tmp_snr = L_add( snr_delta, test_l_snr ); /* Q25 */
     529             : 
     530             : 
     531        3100 :     return tmp_snr;
     532             : }

Generated by: LCOV version 1.14