LCOV - code coverage report
Current view: top level - lib_enc - energy_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main @ e95243e9e67ddeb69dddf129509de1b3d95b402e Lines: 166 230 72.2 %
Date: 2025-09-14 03:13:15 Functions: 4 4 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 "basop_util.h"
       9             : #include "rom_enc.h"
      10             : #include "vad_basop.h"
      11             : //#include "prot_fx.h"
      12             : #include "prot_fx.h"     /* Function prototypes                    */
      13             : #include "prot_fx_enc.h" /* Function prototypes                    */
      14             : /*-------------------------------------------------------------------*
      15             :  * est_energy_fx()
      16             :  *
      17             :  *
      18             :  *-------------------------------------------------------------------*/
      19        3100 : void est_energy_fx(
      20             :     Word32 enerBuffer[CLDFB_NO_CHANNELS_MAX], /* i  : energy vector per band                                    enerBuffer_exp*/
      21             :     Word16 enerBuffer_exp,                    /* i  : exponent of energy vector                                 */
      22             :     Word32 *frame_sb_energy,                  /* o : energy of sub-band divided non-uniformly   frame_sb_energy_scale*/
      23             :     Word32 *frame_energy2_p,                  /* o : frame energy 2                                                             frame_energy2_Q*/
      24             :     Word32 *HB_Power_p,                       /* o : high frequency energy                                              HB_Power_Q*/
      25             :     Word32 *frame_energy_p,                   /* o : frame energy 1                                                             frame_energy_Q*/
      26             :     Word16 *sb_power_Q,                       /* o : the scaling of sb_power                                    */
      27             :     Word16 *frame_energy2_Q,                  /* o : the scaling of frame_energy                                */
      28             :     Word16 *HB_Power_Q,                       /* o : the scaling of HB_Power                                    */
      29             :     Word16 *frame_energy_Q,                   /* o : the Scaling of frame_energy                                */
      30             :     Word16 *frame_sb_energy_scale,            /* o : the Scaling of frame_sb_energy[]                   */
      31             :     const Word32 bandwidth                    /* i : band width                                                                 Q0*/
      32             : )
      33             : {
      34             :     Word32 i, j;
      35             :     Word32 frame_energy2, HB_Power, tmpspec_amp;
      36             :     Word32 sb_power_tmp;
      37             :     Word32 frame_energy, s32CopyPower;
      38             :     Word32 SNR_sb_num;
      39             :     Word16 shr_tmp;
      40             :     Word32 BandNum;
      41             :     Word16 widthsb, s16MaxCoefNorm;
      42             :     const Word16 *Nregion_index;
      43        3100 :     Word32 *sb_power = enerBuffer;
      44        3100 :     Word32 Ltmp32 = 0;
      45        3100 :     move32();
      46        3100 :     SNR_sb_num = SNR_SUB_BAND_NUM[bandwidth - CLDFBVAD_NB_ID];
      47        3100 :     move16();
      48        3100 :     Nregion_index = REGION_INDEX[bandwidth - CLDFBVAD_NB_ID];
      49        3100 :     move16();
      50             : 
      51        3100 :     shr_tmp = BAND_SCALE_AJ[bandwidth];
      52        3100 :     move16();
      53        3100 :     BandNum = BAND_NUM_TAB[bandwidth];
      54        3100 :     move16();
      55             : 
      56        3100 :     frame_energy2 = L_shr( sb_power[1], shr_tmp ); /* 31 - enerBuffer_exp - shr_tmp */
      57        3100 :     HB_Power = L_shr( sb_power[6], shr_tmp );      /* 31 - enerBuffer_exp - shr_tmp */
      58      120900 :     FOR( i = 2; i < BandNum; i++ )
      59             :     {
      60      117800 :         Ltmp32 = L_shr( sb_power[i], shr_tmp );             /* 31 - enerBuffer_exp - shr_tmp */
      61      117800 :         frame_energy2 = L_add_sat( frame_energy2, Ltmp32 ); /* 31 - enerBuffer_exp - shr_tmp */
      62      117800 :         if ( i > 6 )
      63      102300 :             HB_Power = L_add_sat( HB_Power, Ltmp32 );
      64             :     }
      65        3100 :     frame_energy2 = L_sub( frame_energy2, Ltmp32 ); /* 31 - enerBuffer_exp - shr_tmp */
      66             : 
      67        3100 :     sb_power_tmp = L_shr( sb_power[0], shr_tmp ); /* 31 - enerBuffer_exp - shr_tmp */
      68             : 
      69        3100 :     IF( EQ_32( bandwidth, 1 ) )
      70             :     {
      71           0 :         frame_energy = L_add( frame_energy2, MUL_F( sb_power_tmp, 0x147a /* 0.16 in Q15 */ ) );
      72             :     }
      73        3100 :     ELSE IF( EQ_32( bandwidth, 2 ) )
      74             :     {
      75           0 :         frame_energy = L_add( frame_energy2, MUL_F( sb_power_tmp, 0x1eb8 /* 0.24 in Q15 */ ) );
      76             :     }
      77        3100 :     ELSE IF( EQ_32( bandwidth, 3 ) )
      78             :     {
      79        3100 :         frame_energy = L_add( frame_energy2, MUL_F( sb_power_tmp, 0x23d7 /* 0.28 in Q15 */ ) );
      80             :     }
      81           0 :     ELSE IF( EQ_32( bandwidth, 4 ) )
      82             :     {
      83           0 :         frame_energy = L_add( frame_energy2, MUL_F( sb_power_tmp, 0x23d7 /* 0.28 in Q15 */ ) );
      84             :     }
      85             :     ELSE
      86             :     {
      87           0 :         frame_energy = L_add( frame_energy2, MUL_F( sb_power_tmp, 0x23d7 /* 0.28 in Q15 */ ) );
      88             :     }
      89             : 
      90        3100 :     *frame_energy2_p = frame_energy2;
      91        3100 :     move32();
      92        3100 :     *HB_Power_p = HB_Power;
      93        3100 :     move32();
      94        3100 :     *frame_energy_p = frame_energy;
      95        3100 :     move32();
      96             :     /* enerBuffer(float) = enerBuffer(fixed) * 2^(-(31-enerBuffer_exp)) */
      97             :     /* +30 is to keep original precision */
      98        3100 :     *sb_power_Q = sub( 31 + 30, enerBuffer_exp );
      99        3100 :     move16();
     100        3100 :     *frame_energy2_Q = sub( *sb_power_Q, shr_tmp );
     101        3100 :     move16();
     102        3100 :     *HB_Power_Q = sub( *sb_power_Q, shr_tmp );
     103        3100 :     move16();
     104        3100 :     *frame_energy_Q = sub( *sb_power_Q, shr_tmp );
     105        3100 :     move16();
     106             : 
     107       21700 :     FOR( i = 0; i < 6; i++ )
     108             :     {
     109       18600 :         frame_sb_energy[i] = sb_power[i]; /* sb_power_Q */
     110       18600 :         move32();
     111             :     }
     112             : 
     113       21700 :     FOR( i = 6; i < SNR_sb_num; i++ )
     114             :     {
     115       18600 :         s32CopyPower = 0;
     116       18600 :         move32();
     117       18600 :         widthsb = sub( Nregion_index[i + 1], Nregion_index[i] ); /* Q0 */
     118       18600 :         s16MaxCoefNorm = sub( ffr_getSfWord32( ( sb_power + Nregion_index[i] ), widthsb ), NREGION_PREOFF[i] );
     119             : 
     120      111600 :         FOR( j = Nregion_index[i]; j < Nregion_index[i + 1]; j++ )
     121             :         {
     122       93000 :             tmpspec_amp = L_shl( sb_power[j], s16MaxCoefNorm ); /* sb_power_Q + s16MaxCoefNorm */
     123       93000 :             s32CopyPower = L_add( s32CopyPower, tmpspec_amp );
     124             :         }
     125       18600 :         frame_sb_energy[i] = L_shr_sat( s32CopyPower, s16MaxCoefNorm ); /* sb_power_Q */
     126       18600 :         move32();
     127             :     }
     128             : 
     129        3100 :     *frame_sb_energy_scale = *sb_power_Q;
     130        3100 :     move16();
     131        3100 :     return;
     132             : }
     133             : /*-------------------------------------------------------------------*
     134             :  * NormEnergyWord32()
     135             :  *
     136             :  *
     137             :  *-------------------------------------------------------------------*/
     138        3100 : static void NormEnergyWord32(
     139             :     Word32 *vector,
     140             :     const Word32 len,
     141             :     const Word16 *pi_scale,
     142             :     Word16 *normscale )
     143             : {
     144             :     Word16 minVal;
     145             :     Word16 i;
     146             : 
     147             : 
     148        3100 :     minVal = pi_scale[0];
     149        3100 :     move16();
     150             : 
     151       37200 :     FOR( i = 1; i < len; i++ )
     152             :     {
     153       34100 :         minVal = s_min( minVal, pi_scale[i] );
     154             :     }
     155             : 
     156       40300 :     FOR( i = 0; i < len; i++ )
     157             :     {
     158       37200 :         vector[i] = L_shr( vector[i], sub( pi_scale[i], minVal ) );
     159       37200 :         move32();
     160             :     }
     161        3100 :     *normscale = minVal;
     162        3100 :     move16();
     163        3100 : }
     164             : /*-------------------------------------------------------------------*
     165             :  * update_sb_bg_energy()
     166             :  *
     167             :  *
     168             :  *-------------------------------------------------------------------*/
     169          39 : static void update_sb_bg_energy(
     170             :     Word32 *sb_bg_energy,     /* p_scale_sb_energy */
     171             :     Word16 *tbg_energy_count, /* Q0 */
     172             :     Word16 *p_scale_sb_energy,
     173             :     const Word32 SNR_sb_num,       /* Q0 */
     174             :     const Word32 *frame_sb_energy, /* frame_sb_energy_scale */
     175             :     const Word16 frame_sb_energy_scale,
     176             :     const Word16 FAC_16Q15_a, /* Q15 */
     177             :     const Word16 tmp_Q_add,
     178             :     const Word16 FAC_16Q19_b /* Q19 */
     179             : )
     180             : {
     181             :     Word32 sb_bg_energy_ti, tmp;
     182             :     Word16 tmpQ, i;
     183             : 
     184          39 :     *tbg_energy_count = add_sat( *tbg_energy_count, 1 ); /* Q0 */
     185          39 :     move16();
     186          39 :     tmpQ = add( tmp_Q_add, frame_sb_energy_scale );
     187             : 
     188         507 :     FOR( i = 0; i < SNR_sb_num; i++ )
     189             :     {
     190         468 :         sb_bg_energy_ti = MUL_F( sb_bg_energy[i], FAC_16Q15_a ); /* p_scale_sb_energy */
     191         468 :         tmp = MUL_F( frame_sb_energy[i], FAC_16Q19_b );
     192         468 :         sb_bg_energy[i] = VAD_L_ADD( sb_bg_energy_ti, p_scale_sb_energy[i], tmp, tmpQ, &p_scale_sb_energy[i] ); /* p_scale_sb_energy */
     193         468 :         move32();
     194             :     }
     195          39 : }
     196             : 
     197             : /*-------------------------------------------------------------------*
     198             :  * update_sb_bg_energy()
     199             :  *
     200             :  *
     201             :  *-------------------------------------------------------------------*/
     202        3100 : void background_update_fx(
     203             :     VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state                                */
     204             :     Word16 scale,                /* i  : the scaling of frame energy    */
     205             :     Word32 frame_energy,         /* i  : current frame energy                   scale*/
     206             :     Word32 update_flag,          /* i  : update flag                                    Q0*/
     207             :     Word16 music_backgound_f,    /* i  : background music flag                  Q0*/
     208             :     Word32 snr                   /* Q25 */
     209             : )
     210             : {
     211             :     Word32 tmp;
     212             :     Word16 i, tmpQ, cmp_lt_frame, cmp_pre_frame;
     213             :     Word32 SNR_sb_num;
     214             :     Word16 normscal, scale_sb_energy;
     215             :     Word32 *sb_bg_energy;
     216             :     Word32 *frame_sb_energy;
     217             :     Word32 t_bg_energy;
     218             :     Word32 sb_bg_energy_ti;
     219             :     Word16 q_divout;
     220             :     T_VAD_EXP exp_frame_energy, CONST32fix;
     221             :     T_VAD_EXP t_bg_energy_sum;
     222             :     Word16 p_scale_sb_energy[12];
     223        3100 :     Word16 *f_tonality_rate = hVAD_CLDFB->f_tonality_rate;
     224        3100 :     Word16 *ltd_stable_rate = hVAD_CLDFB->ltd_stable_rate;
     225        3100 :     Word32 bandwith = hVAD_CLDFB->bw_index;
     226             :     Word16 cmp_tmp;
     227             :     T_VAD_EXP exp_frame_energy_amendment;
     228             : 
     229        3100 :     move32();
     230        3100 :     move16();
     231        3100 :     move16();
     232             : 
     233             : 
     234        3100 :     tmp = L_deposit_l( -1 );
     235             : 
     236        3100 :     CONST32fix.s16Exp = 44;
     237        3100 :     move16();
     238        3100 :     CONST32fix.s32Mantissa = 1759218560;
     239        3100 :     move32();
     240        3100 :     SNR_sb_num = SNR_SUB_BAND_NUM[bandwith - CLDFBVAD_NB_ID];
     241        3100 :     move16();
     242        3100 :     scale_sb_energy = hVAD_CLDFB->sb_bg_energy_scale;
     243        3100 :     move16();
     244             : 
     245        3100 :     sb_bg_energy = hVAD_CLDFB->sb_bg_energy;
     246        3100 :     move32();
     247        3100 :     frame_sb_energy = hVAD_CLDFB->frame_sb_energy;
     248        3100 :     move32();
     249        3100 :     t_bg_energy = hVAD_CLDFB->t_bg_energy;
     250        3100 :     move32();
     251             : 
     252        3100 :     t_bg_energy_sum = hVAD_CLDFB->t_bg_energy_sum;
     253        3100 :     move32();
     254        3100 :     normscal = norm_l( frame_energy );
     255        3100 :     exp_frame_energy.s16Exp = add( scale, normscal );
     256        3100 :     exp_frame_energy.s32Mantissa = L_shl( frame_energy, normscal );
     257        3100 :     exp_frame_energy = VAD_AddExp( exp_frame_energy, CONST32fix );
     258        3100 :     cmp_lt_frame = VAD_L_CMP( exp_frame_energy.s32Mantissa, exp_frame_energy.s16Exp, 46, 0 );
     259             : 
     260       40300 :     FOR( i = 0; i < SNR_sb_num; i++ )
     261             :     {
     262       37200 :         p_scale_sb_energy[i] = scale_sb_energy;
     263       37200 :         move16();
     264             :     }
     265             : 
     266        3100 :     test();
     267        3100 :     test();
     268        3100 :     test();
     269        3100 :     test();
     270        3100 :     test();
     271        3100 :     IF( ( LT_16( hVAD_CLDFB->frameloop, 60 ) ) && ( GT_16( hVAD_CLDFB->frameloop, 5 ) ) && ( LT_16( f_tonality_rate[0], 9174 /* 0.56 Q14 */ ) ) && ( LT_16( f_tonality_rate[1], 8192 /* 0.5 Q14 */ ) ) && ( LT_16( ltd_stable_rate[1], 1966 /* 0.06 Q15 */ ) ) && LT_32( snr, 83886080 /* 2.5f in Q25 */ ) )
     272             :     {
     273          15 :         IF( LT_16( hVAD_CLDFB->frameloop, 50 ) )
     274             :         {
     275          15 :             exp_frame_energy_amendment.s32Mantissa = VAD_L_div( exp_frame_energy.s32Mantissa, 10, exp_frame_energy.s16Exp, 0, &q_divout ); /* exp(divout) */
     276          15 :             exp_frame_energy_amendment.s16Exp = q_divout;
     277          15 :             move16();
     278          15 :             t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy_amendment );
     279             :         }
     280             :         ELSE
     281             :         {
     282           0 :             t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy );
     283             :         }
     284          15 :         update_sb_bg_energy( sb_bg_energy, &hVAD_CLDFB->tbg_energy_count, p_scale_sb_energy, SNR_sb_num, frame_sb_energy, hVAD_CLDFB->frame_sb_energy_scale,
     285             :                              29490 /* 0.90 Q15 */, 3, 5242 /* 0.01 Q19 */ ); // 5243
     286             :     }
     287             : 
     288        3100 :     test();
     289        3100 :     test();
     290        3100 :     IF( ( EQ_32( update_flag, 1 ) ) && ( GT_16( hVAD_CLDFB->frameloop, 2 ) ) && music_backgound_f == 0 )
     291             :     {
     292          24 :         IF( LT_16( hVAD_CLDFB->bg_update_count, 16 ) )
     293             :         {
     294          24 :             IF( LT_16( hVAD_CLDFB->frameloop, 50 ) )
     295             :             {
     296          24 :                 exp_frame_energy_amendment.s32Mantissa = VAD_L_div( exp_frame_energy.s32Mantissa, 10, exp_frame_energy.s16Exp, 0, &q_divout ); /* exp(q_divout) */
     297          24 :                 exp_frame_energy_amendment.s16Exp = q_divout;
     298          24 :                 move16();
     299          24 :                 t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy_amendment );
     300             :             }
     301             :             ELSE
     302             :             {
     303           0 :                 t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy );
     304             :             }
     305          24 :             update_sb_bg_energy( sb_bg_energy, &hVAD_CLDFB->tbg_energy_count, p_scale_sb_energy, SNR_sb_num, frame_sb_energy, hVAD_CLDFB->frame_sb_energy_scale,
     306             :                                  31456 /* 0.96 Q15 */, 4, 20971 /* 0.04 Q19 */ );
     307             : 
     308          24 :             hVAD_CLDFB->bg_update_count = add( hVAD_CLDFB->bg_update_count, 1 ); /* Q0 */
     309          24 :             move16();
     310             :         }
     311             :         ELSE
     312             :         {
     313             : 
     314           0 :             cmp_lt_frame = VAD_L_CMP( t_bg_energy, hVAD_CLDFB->scale_t_bg_energy, exp_frame_energy.s32Mantissa, exp_frame_energy.s16Exp );
     315           0 :             cmp_pre_frame = VAD_L_CMP( MUL_F( hVAD_CLDFB->frame_energy_smooth, 24576 ), sub( hVAD_CLDFB->frame_energy_smooth_scale, 5 ), exp_frame_energy.s32Mantissa, exp_frame_energy.s16Exp );
     316           0 :             cmp_tmp = VAD_L_CMP( MUL_F( t_bg_energy, 24576 ), sub( hVAD_CLDFB->scale_t_bg_energy, 4 ), exp_frame_energy.s32Mantissa, exp_frame_energy.s16Exp );
     317             : 
     318           0 :             test();
     319           0 :             IF( ( cmp_lt_frame < 0 ) && ( cmp_pre_frame < 0 ) )
     320             :             {
     321           0 :                 tmpQ = add( 9, hVAD_CLDFB->frame_sb_energy_scale );
     322           0 :                 FOR( i = 0; i < SNR_sb_num; i++ )
     323             :                 {
     324           0 :                     sb_bg_energy_ti = MUL_F( sb_bg_energy[i], 32734 /* 0.999 Q15 */ ); /* p_scale_sb_energy */
     325           0 :                     tmp = MUL_F( frame_sb_energy[i], 16777 /* 0.001 Q24 */ );
     326           0 :                     sb_bg_energy[i] = VAD_L_ADD( sb_bg_energy_ti, p_scale_sb_energy[i], tmp, tmpQ, &p_scale_sb_energy[i] ); /* p_scale_sb_energy */
     327           0 :                     move32();
     328             :                 }
     329             :             }
     330             :             /*ELSE IF(L_sub(tmp, -1) == 0) fixed bug*/
     331           0 :             ELSE IF( cmp_tmp < 0 )
     332             :             {
     333           0 :                 IF( LT_16( hVAD_CLDFB->frameloop, 50 ) )
     334             :                 {
     335           0 :                     exp_frame_energy_amendment.s32Mantissa = VAD_L_div( exp_frame_energy.s32Mantissa, 10, exp_frame_energy.s16Exp, 0, &q_divout ); /* exp(q_divout) */
     336           0 :                     exp_frame_energy_amendment.s16Exp = q_divout;
     337           0 :                     move16();
     338           0 :                     t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy_amendment );
     339             :                 }
     340             :                 ELSE
     341             :                 {
     342           0 :                     t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy );
     343             :                 }
     344           0 :                 update_sb_bg_energy( sb_bg_energy, &hVAD_CLDFB->tbg_energy_count, p_scale_sb_energy, SNR_sb_num, frame_sb_energy, hVAD_CLDFB->frame_sb_energy_scale,
     345             :                                      31456 /* 0.96 Q15 */, 4, 20971 /* 0.04 Q19 */ );
     346             :             }
     347             :             ELSE
     348             :             {
     349           0 :                 cmp_pre_frame = VAD_L_CMP( t_bg_energy, hVAD_CLDFB->scale_t_bg_energy, exp_frame_energy.s32Mantissa, exp_frame_energy.s16Exp );
     350           0 :                 IF( cmp_pre_frame > 0 )
     351             :                 {
     352           0 :                     IF( LT_16( hVAD_CLDFB->frameloop, 50 ) )
     353             :                     {
     354           0 :                         exp_frame_energy_amendment.s32Mantissa = VAD_L_div( exp_frame_energy.s32Mantissa, 10, exp_frame_energy.s16Exp, 0, &q_divout ); /* exp(q_divout) */
     355           0 :                         exp_frame_energy_amendment.s16Exp = q_divout;
     356           0 :                         move16();
     357           0 :                         t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy_amendment );
     358             :                     }
     359             :                     ELSE
     360             :                     {
     361           0 :                         t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy );
     362             :                     }
     363           0 :                     update_sb_bg_energy( sb_bg_energy, &hVAD_CLDFB->tbg_energy_count, p_scale_sb_energy, SNR_sb_num, frame_sb_energy, hVAD_CLDFB->frame_sb_energy_scale,
     364             :                                          31129 /* 0.95 Q15 */, 4, 26214 /* 0.05 Q19 */ );
     365             :                 }
     366             :                 ELSE
     367             :                 {
     368           0 :                     IF( LT_16( hVAD_CLDFB->frameloop, 50 ) )
     369             :                     {
     370           0 :                         exp_frame_energy_amendment.s32Mantissa = VAD_L_div( exp_frame_energy.s32Mantissa, 10, exp_frame_energy.s16Exp, 0, &q_divout ); /* exp(q_divout) */
     371           0 :                         exp_frame_energy_amendment.s16Exp = q_divout;
     372           0 :                         t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy_amendment );
     373             :                     }
     374             :                     ELSE
     375             :                     {
     376           0 :                         t_bg_energy_sum = VAD_AddExp( t_bg_energy_sum, exp_frame_energy );
     377             :                     }
     378           0 :                     update_sb_bg_energy( sb_bg_energy, &hVAD_CLDFB->tbg_energy_count, p_scale_sb_energy, SNR_sb_num, frame_sb_energy, hVAD_CLDFB->frame_sb_energy_scale,
     379             :                                          31456 /* 0.96 Q15 */, 4, 20971 /* 0.04 Q19 */ );
     380             :                 }
     381             :             }
     382             :         }
     383             :     }
     384             :     ELSE
     385             :     {
     386        3076 :         cmp_pre_frame = VAD_L_CMP( t_bg_energy, hVAD_CLDFB->scale_t_bg_energy, MUL_F( exp_frame_energy.s32Mantissa, 32000 ), sub( exp_frame_energy.s16Exp, 9 ) );
     387        3076 :         cmp_lt_frame = VAD_L_CMP( sb_bg_energy[0], scale_sb_energy, MUL_F( frame_sb_energy[0], 20480 /* 10 in Q11 */ ), sub( hVAD_CLDFB->frame_sb_energy_scale, 4 ) );
     388             : 
     389        3076 :         test();
     390        3076 :         IF( ( cmp_pre_frame > 0 ) && ( cmp_lt_frame > 0 ) )
     391             :         {
     392           0 :             tmpQ = add( 3, hVAD_CLDFB->frame_sb_energy_scale );
     393           0 :             FOR( i = 0; i < SNR_sb_num; i++ )
     394             :             {
     395           0 :                 sb_bg_energy_ti = MUL_F( sb_bg_energy[i], 29490 /* 0.90 Q15 */ ); /* p_scale_sb_energy */
     396           0 :                 tmp = MUL_F( frame_sb_energy[i], 26214 /* 0.10 Q18 */ );
     397           0 :                 sb_bg_energy[i] = VAD_L_ADD( sb_bg_energy_ti, p_scale_sb_energy[i], tmp, tmpQ, &p_scale_sb_energy[i] ); /* p_scale_sb_energy */
     398           0 :                 move32();
     399             :             }
     400             :         }
     401             :         ELSE
     402             :         {
     403        3076 :             cmp_pre_frame = VAD_L_CMP( t_bg_energy, hVAD_CLDFB->scale_t_bg_energy, MUL_F( exp_frame_energy.s32Mantissa, 20480 ), sub( exp_frame_energy.s16Exp, 4 ) );
     404        3076 :             IF( cmp_pre_frame > 0 )
     405             :             {
     406          12 :                 tmpQ = add( 9, hVAD_CLDFB->frame_sb_energy_scale );
     407         156 :                 FOR( i = 0; i < SNR_sb_num; i++ )
     408             :                 {
     409         144 :                     sb_bg_energy_ti = MUL_F( sb_bg_energy[i], 32734 /* 0.999 Q15 */ ); /* exp(p_scale_sb_energy) */
     410         144 :                     tmp = MUL_F( frame_sb_energy[i], 16777 /* 0.001 Q24 */ );
     411         144 :                     sb_bg_energy[i] = VAD_L_ADD( sb_bg_energy_ti, p_scale_sb_energy[i], tmp, tmpQ, &p_scale_sb_energy[i] ); /* exp(p_scale_sb_energy) */
     412         144 :                     move32();
     413             :                 }
     414             :             }
     415             :         }
     416             :     }
     417             : 
     418        3100 :     tmp = L_mult0( 160, (Word16) hVAD_CLDFB->tbg_energy_count ); /* Q31 */
     419        3100 :     cmp_pre_frame = VAD_L_CMP( t_bg_energy_sum.s32Mantissa, t_bg_energy_sum.s16Exp, tmp, 0 );
     420        3100 :     IF( cmp_pre_frame > 0 )
     421             :     {
     422           0 :         i = norm_l( tmp );
     423           0 :         t_bg_energy_sum.s32Mantissa = L_shl( tmp, i );
     424           0 :         t_bg_energy_sum.s16Exp = i;
     425           0 :         move16();
     426             :     }
     427        3100 :     NormEnergyWord32( sb_bg_energy, SNR_sb_num, p_scale_sb_energy, &scale_sb_energy );
     428        3100 :     cmp_pre_frame = VAD_L_CMP( t_bg_energy, hVAD_CLDFB->scale_t_bg_energy, 1, 0 );
     429             : 
     430        3100 :     test();
     431        3100 :     test();
     432        3100 :     test();
     433        3100 :     IF( ( EQ_16( music_backgound_f, 1 ) ) && ( LT_32( hVAD_CLDFB->lt_snr_org, 107374179 /* 3.2 Q25 */ ) ) && ( cmp_pre_frame > 0 ) && update_flag == 0 )
     434             :     {
     435           0 :         tmp = L_shr( 2147 /* 0.000001 Q31 */, sub( 31, scale_sb_energy ) ); /* scale_sb_energy */
     436           0 :         FOR( i = 0; i < SNR_sb_num; i++ )
     437             :         {
     438           0 :             sb_bg_energy[i] = L_add( MUL_F( sb_bg_energy[i], 32112 /* 0.98 Q15 */ ), tmp ); /* scale_sb_energy */
     439           0 :             move32();
     440             :         }
     441             :     }
     442             : 
     443        3100 :     IF( EQ_16( music_backgound_f, 1 ) )
     444             :     {
     445           0 :         cmp_pre_frame = VAD_L_CMP( exp_frame_energy.s32Mantissa, exp_frame_energy.s16Exp, MUL_F( t_bg_energy, 5000 ), sub( hVAD_CLDFB->scale_t_bg_energy, 15 ) );
     446           0 :         IF( cmp_pre_frame < 0 )
     447             :         {
     448           0 :             tmp = L_shr( 2147 /* 0.000001 Q31 */, sub( 31, scale_sb_energy ) ); /* scale_sb_energy */
     449           0 :             FOR( i = 0; i < SNR_sb_num; i++ )
     450             :             {
     451           0 :                 sb_bg_energy[i] = L_add_sat( MUL_F( sb_bg_energy[i], 32112 /* 0.98 Q15 */ ), tmp ); /* scale_sb_energy */
     452           0 :                 move32();
     453             :             }
     454             :         }
     455             :     }
     456             : 
     457        3100 :     IF( ( EQ_32( hVAD_CLDFB->tbg_energy_count, 64 ) ) )
     458             :     {
     459           0 :         hVAD_CLDFB->tbg_energy_count = 48;
     460           0 :         move16();
     461           0 :         t_bg_energy_sum.s32Mantissa = MUL_F( t_bg_energy_sum.s32Mantissa, 24575 /* 0.75 Q15 */ );
     462             :     }
     463             : 
     464        3100 :     t_bg_energy = VAD_L_div( t_bg_energy_sum.s32Mantissa, hVAD_CLDFB->tbg_energy_count, t_bg_energy_sum.s16Exp, 0, &q_divout ); /* exp(q_divout) */
     465        3100 :     hVAD_CLDFB->scale_t_bg_energy = q_divout;
     466        3100 :     move16();
     467        3100 :     hVAD_CLDFB->t_bg_energy = t_bg_energy;
     468        3100 :     move32();
     469        3100 :     hVAD_CLDFB->sb_bg_energy_scale = scale_sb_energy;
     470        3100 :     move16();
     471        3100 :     hVAD_CLDFB->t_bg_energy_sum = t_bg_energy_sum;
     472        3100 :     move16();
     473        3100 :     move32();
     474             : 
     475        3100 :     return;
     476             : }

Generated by: LCOV version 1.14