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

Generated by: LCOV version 1.14