LCOV - code coverage report
Current view: top level - lib_enc - vad_proc_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main @ e95243e9e67ddeb69dddf129509de1b3d95b402e Lines: 190 201 94.5 %
Date: 2025-09-14 03:13:15 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : 
       5             : 
       6             : #include <stdint.h>
       7             : #include "options.h"
       8             : #include "cnst.h"
       9             : #include "basop_util.h"
      10             : #include "vad_basop.h"
      11             : //#include "prot_fx.h"
      12             : #include "stat_enc.h"
      13             : #include "rom_enc.h"
      14             : #include "rom_com.h"     /* Common constants                       */
      15             : #include "prot_fx.h"     /* Function prototypes                    */
      16             : #include "prot_fx_enc.h" /* Function prototypes                    */
      17             : #include "basop_util.h"  /* Function prototypes                    */
      18             : 
      19             : /*-------------------------------------------------------------------*
      20             :  * vad_init_fx()
      21             :  *
      22             :  *
      23             :  *-------------------------------------------------------------------*/
      24           3 : Word16 vad_init_fx(
      25             :     VAD_CLDFB_HANDLE hVAD_CLDFB /* i/o: CLDFB VAD state     */
      26             : )
      27             : {
      28           3 :     Word16 i = 0;
      29           3 :     move16();
      30           3 :     if ( hVAD_CLDFB == NULL )
      31             :     {
      32           0 :         return -1;
      33             :     }
      34             : 
      35           3 :     hVAD_CLDFB->frameloop = 0;
      36           3 :     move16();
      37           3 :     hVAD_CLDFB->lt_snr_org = 33554432;
      38           3 :     move32();
      39           3 :     hVAD_CLDFB->lf_snr_smooth = 167772155 /* 5.0 Q25 */;
      40           3 :     move32();
      41           3 :     hVAD_CLDFB->l_silence_snr = 32768 /* 0.5 Q16 */;
      42           3 :     move32();
      43           3 :     hVAD_CLDFB->l_speech_snr = 327675 /* 5.0 Q16 */;
      44           3 :     move32();
      45           3 :     hVAD_CLDFB->l_silence_snr_count = L_deposit_l( 1 );
      46           3 :     move32();
      47           3 :     hVAD_CLDFB->l_speech_snr_count = L_deposit_l( 1 );
      48           3 :     move32();
      49           3 :     hVAD_CLDFB->fg_energy = 1073741824;
      50           3 :     move32();
      51           3 :     hVAD_CLDFB->fg_energy_scale = 41;
      52           3 :     move16();
      53           3 :     hVAD_CLDFB->bg_energy = 1073741824;
      54           3 :     move32();
      55           3 :     hVAD_CLDFB->bg_energy_scale = 57;
      56           3 :     move16();
      57           3 :     hVAD_CLDFB->fg_energy_count = 16;
      58           3 :     move16();
      59           3 :     hVAD_CLDFB->bg_energy_count = 16;
      60           3 :     move16();
      61           3 :     hVAD_CLDFB->tonality_rate3 = 15073 /* 0.46 Q15 */;
      62           3 :     move16();
      63           3 :     hVAD_CLDFB->music_background_rate = 15073 /* 0.46 Q15 */;
      64           3 :     move16();
      65           3 :     hVAD_CLDFB->lt_noise_sp_center_diff_sum = 409 /* 0.4 Q10 */;
      66           3 :     move32();
      67           3 :     hVAD_CLDFB->lt_noise_sp_center_diff_counter = L_deposit_l( 4 );
      68           3 :     move32();
      69           3 :     hVAD_CLDFB->lt_noise_sp_center0 = 1841 /* 0.4 Q10 */;
      70           3 :     move16();
      71           3 :     hVAD_CLDFB->lt_noise_sp_center3 = 2046 /* 0.4 Q10 */;
      72           3 :     move16();
      73           3 :     hVAD_CLDFB->lt_bg_highf_eng = 131070 /* 2.0 Q16 */;
      74           3 :     move32();
      75           3 :     hVAD_CLDFB->t_bg_energy = 1374389535;
      76           3 :     move32();
      77           3 :     hVAD_CLDFB->scale_t_bg_energy = 37;
      78           3 :     move16();
      79           3 :     hVAD_CLDFB->t_bg_energy_sum.s16Exp = 37;
      80           3 :     move16();
      81           3 :     hVAD_CLDFB->t_bg_energy_sum.s32Mantissa = 1374389535;
      82           3 :     move32();
      83           3 :     hVAD_CLDFB->tbg_energy_count = 1;
      84           3 :     move16();
      85           3 :     hVAD_CLDFB->bg_update_count = 0;
      86           3 :     move16();
      87           3 :     hVAD_CLDFB->frame_energy_smooth = 1073741824;
      88           3 :     move32();
      89           3 :     hVAD_CLDFB->frame_energy_smooth_scale = 30;
      90           3 :     move16();
      91           3 :     hVAD_CLDFB->fg_energy_est_start = L_deposit_l( 0 );
      92           3 :     move32();
      93           3 :     hVAD_CLDFB->speech_flag = 0;
      94           3 :     move16();
      95           3 :     hVAD_CLDFB->continuous_noise_num = 0;
      96           3 :     move16();
      97           3 :     hVAD_CLDFB->continuous_speech_num = 0;
      98           3 :     move16();
      99           3 :     hVAD_CLDFB->continuous_speech_num2 = 0;
     100           3 :     move16();
     101           3 :     hVAD_CLDFB->update_num_with_snr = 0; /* the number of the background update with SNR*/
     102           3 :     move16();
     103           3 :     hVAD_CLDFB->update_count = 0;
     104           3 :     move16();
     105           3 :     hVAD_CLDFB->warm_hang_num = 0;
     106           3 :     move16();
     107             : 
     108           3 :     hVAD_CLDFB->frame_sb_energy_scale = 0;
     109           3 :     move16();
     110             : 
     111          99 :     FOR( i = 0; i < PRE_SNR_NUM; i++ )
     112             :     {
     113          96 :         hVAD_CLDFB->pre_snr[i] = L_deposit_l( 0 );
     114          96 :         move32();
     115             :     }
     116             : 
     117         171 :     FOR( i = 0; i < 56; i++ )
     118             :     {
     119         168 :         hVAD_CLDFB->frames_power_32[i] = L_deposit_l( 0 );
     120         168 :         move32();
     121             :     }
     122             : 
     123           3 :     hVAD_CLDFB->Q_frames_power_32 = 31;
     124           3 :     move16();
     125             : 
     126         183 :     FOR( i = 0; i < SPEC_AMP_NUM; i++ )
     127             :     {
     128         180 :         hVAD_CLDFB->smooth_spec_amp[i] = L_deposit_l( 0 );
     129         180 :         move32();
     130             :     }
     131             : 
     132           3 :     hVAD_CLDFB->sfm[0] = 28835 /* 0.88 Q15 */;
     133           3 :     move16();
     134           3 :     hVAD_CLDFB->sfm[1] = 30146 /* 0.92 Q15 */;
     135           3 :     move16();
     136           3 :     hVAD_CLDFB->sfm[2] = 30146 /* 0.92 Q15 */;
     137           3 :     move16();
     138             : 
     139          15 :     FOR( i = 0; i < SP_CENTER_NUM; i++ )
     140             :     {
     141          12 :         hVAD_CLDFB->sp_center[i] = 1228 /* 1.2 Q10 */;
     142          12 :         move16();
     143             :     }
     144             : 
     145          15 :     FOR( i = 0; i < STABLE_NUM; i++ )
     146             :     {
     147          12 :         hVAD_CLDFB->ltd_stable_rate[i] = 2294 /* 0.07 Q15 */;
     148          12 :         move16();
     149             :     }
     150             : 
     151          39 :     FOR( i = 0; i < BG_ENG_NUM; i++ )
     152             :     {
     153          36 :         hVAD_CLDFB->sb_bg_energy[i] = 1374389535;
     154          36 :         move32();
     155          36 :         hVAD_CLDFB->frame_sb_energy[i] = L_deposit_l( 0 );
     156          36 :         move32();
     157             :     }
     158             : 
     159           3 :     hVAD_CLDFB->sb_bg_energy_scale = 37;
     160           3 :     move16();
     161             : 
     162           3 :     hVAD_CLDFB->f_tonality_rate[0] = 7864 /* 0.48 Q14 */;
     163           3 :     move16();
     164           3 :     hVAD_CLDFB->f_tonality_rate[1] = 7864 /* 0.48 Q14 */;
     165           3 :     move16();
     166           3 :     hVAD_CLDFB->f_tonality_rate[2] = 7864 /* 0.48 Q14 */;
     167           3 :     move16();
     168             : 
     169         171 :     FOR( i = 0; i < PRE_SPEC_DIF_NUM; i++ )
     170             :     {
     171         168 :         hVAD_CLDFB->pre_spec_low_dif[i] = 4095;
     172         168 :         move16();
     173             :     }
     174           3 :     hVAD_CLDFB->scale_spec_low_dif = 12;
     175           3 :     move16();
     176             : 
     177             : 
     178           3 :     return 0;
     179             : }
     180             : 
     181        3100 : static void UpdateState_fx(
     182             :     VAD_CLDFB_HANDLE hVAD_CLDFB, /* i/o: CLDFB VAD state     */
     183             :     Word16 vad_flag,             /* i  : VAD flag                               */
     184             :     Word32 frame_energy,         /* i  : current frame energy                   */
     185             :     Word16 sacle_sbpower,        /* i  : the Scaling of current frame energy    */
     186             :     Word32 update_flag,          /* i  : current frame update flag              */
     187             :     Word16 music_backgound_f,    /* i  : background music flag                  */
     188             :     Word32 HB_Power,             /* i  : current frame high frequency energy    */
     189             :     Word16 HB_Power_Q,           /* i  : the Scaling of current frame high frequency energy*/
     190             :     Word32 snr )
     191             : {
     192             :     Word16 lt_bg_energy_scal;
     193             :     Word32 tmp, tmp2;
     194             : 
     195             : 
     196        3100 :     tmp = MUL_F( hVAD_CLDFB->frame_energy_smooth, 31129 /* 0.95 Q15 */ );
     197        3100 :     tmp2 = MUL_F( frame_energy, 26214 );
     198        3100 :     hVAD_CLDFB->frame_energy_smooth = VAD_L_ADD( tmp, hVAD_CLDFB->frame_energy_smooth_scale, tmp2, add( 4, sacle_sbpower ), &lt_bg_energy_scal );
     199        3100 :     move32();
     200        3100 :     hVAD_CLDFB->frame_energy_smooth_scale = lt_bg_energy_scal;
     201        3100 :     move16();
     202             : 
     203             : 
     204        3100 :     IF( vad_flag == 0 )
     205             :     {
     206          88 :         hVAD_CLDFB->lt_bg_highf_eng = L_add( MUL_F( hVAD_CLDFB->lt_bg_highf_eng, 31130 ), L_shr( MUL_F( HB_Power, 1638 ), sub( HB_Power_Q, lt_bg_highf_eng_Q ) ) );
     207             :     }
     208             : 
     209        3100 :     IF( LT_16( hVAD_CLDFB->frameloop, 1000 ) )
     210             :     {
     211        3000 :         hVAD_CLDFB->frameloop = add( hVAD_CLDFB->frameloop, 1 );
     212        3000 :         move16();
     213             :     }
     214             : 
     215        3100 :     background_update_fx( hVAD_CLDFB, sacle_sbpower, frame_energy, update_flag, music_backgound_f, snr );
     216             : 
     217        3100 :     IF( vad_flag == 0 )
     218             :     {
     219          88 :         hVAD_CLDFB->continuous_speech_num2 = 0;
     220          88 :         move16();
     221          88 :         IF( GT_16( hVAD_CLDFB->continuous_noise_num, 10 ) )
     222             :         {
     223           6 :             hVAD_CLDFB->continuous_speech_num = 0;
     224           6 :             move16();
     225             :         }
     226          82 :         ELSE IF( GT_32( hVAD_CLDFB->continuous_speech_num, 9 ) )
     227             :         {
     228           8 :             hVAD_CLDFB->continuous_speech_num = 9;
     229           8 :             move16();
     230             :         }
     231          88 :         hVAD_CLDFB->continuous_noise_num = add( hVAD_CLDFB->continuous_noise_num, 1 );
     232          88 :         move16();
     233             : 
     234          88 :         if ( GT_16( hVAD_CLDFB->continuous_noise_num, 2048 ) )
     235             :         {
     236           0 :             hVAD_CLDFB->continuous_noise_num = 2048;
     237           0 :             move16();
     238             :         }
     239             :     }
     240             :     ELSE
     241             :     {
     242        3012 :         hVAD_CLDFB->continuous_noise_num = 0;
     243        3012 :         move16();
     244             : 
     245        3012 :         hVAD_CLDFB->continuous_speech_num2 = add( hVAD_CLDFB->continuous_speech_num2, 1 );
     246        3012 :         move16();
     247        3012 :         hVAD_CLDFB->continuous_speech_num = add( hVAD_CLDFB->continuous_speech_num, 1 );
     248        3012 :         move16();
     249        3012 :         if ( GT_16( hVAD_CLDFB->continuous_speech_num, 2048 ) )
     250             :         {
     251           0 :             hVAD_CLDFB->continuous_speech_num = 2048;
     252           0 :             move16();
     253             :         }
     254             : 
     255        3012 :         if ( GT_16( hVAD_CLDFB->continuous_speech_num2, 2048 ) )
     256             :         {
     257           0 :             hVAD_CLDFB->continuous_speech_num2 = 2048;
     258           0 :             move16();
     259             :         }
     260             :     }
     261        3100 : }
     262             : 
     263             : 
     264        3100 : Word16 vad_proc_fx(
     265             :     VAD_CLDFB_HANDLE hVAD_CLDFB,                                /* i/o: CLDFB VAD state     */
     266             :     Word32 realBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i  : real values */
     267             :     Word32 imagBuffer[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], /* i  : imag values */
     268             :     Word16 riBuffer_exp,                                        /* i  : exponent of real & imag Buffer */
     269             :     Word16 *cldfb_addition,                                     /* o  : adjust the harmonized hangover */
     270             :     Word32 enerBuffer[CLDFB_NO_CHANNELS_MAX],                   /* i  : energy vector per band */
     271             :     Word16 enerBuffer_exp,                                      /* i  : exponent of energy vector */
     272             :     Word16 numBands,                                            /* i  : band width 1: NB; 2:WB;3:SWB;4:FB*/
     273             :     Word16 vada_flag                                            /* i  : VAD flag            */
     274             : )
     275             : {
     276             :     Word16 i;
     277             :     Word16 bw_index;
     278             :     Word16 music_backgound_f;
     279             :     Word16 Q_cldfb;
     280             :     Word16 frame_energy2_Q, HB_Power_Q;
     281             :     Word16 sb_power_Q, frame_energy_Q;
     282             :     Word32 frame_energy, frame_energy2, HB_Power;
     283             :     Word32 spec_amp[120];
     284             :     Word32 update_flag, snr_flux, lt_snr_org, lt_snr, lf_snr;
     285             :     Word32 snr, tsnr;
     286             :     Word16 vad_flag;
     287             :     Word32 *cldfbBufferReal[CLDFB_NO_COL_MAX]; /* dynamic scaling; cldfbBufferReal_float[x][y] = cldfbBufferReal[x][y] * 2^(-Q_cldfb) */
     288             :     Word32 *cldfbBufferImag[CLDFB_NO_COL_MAX]; /* dynamic scaling; cldfbBufferImag_float[x][y] = cldfbBufferReal[x][y] * 2^(-Q_cldfb) */
     289             : 
     290             : 
     291        3100 :     music_backgound_f = 0;
     292        3100 :     move16();
     293        3100 :     frame_energy = 0;
     294        3100 :     move32();
     295             : 
     296             : 
     297        3100 :     IF( LT_16( numBands, 20 ) )
     298             :     {
     299           0 :         bw_index = 1;
     300           0 :         move16();
     301             :     }
     302        3100 :     ELSE IF( LT_16( numBands, 40 ) )
     303             :     {
     304           0 :         bw_index = 2;
     305           0 :         move16();
     306             :     }
     307             :     ELSE
     308             :     {
     309        3100 :         bw_index = 3;
     310        3100 :         move16();
     311             :     }
     312             : 
     313        3100 :     hVAD_CLDFB->bw_index = bw_index;
     314        3100 :     move16();
     315       52700 :     FOR( i = 0; i < CLDFB_NO_COL_MAX; i++ )
     316             :     {
     317       49600 :         cldfbBufferReal[i] = realBuffer[i];
     318       49600 :         move16();
     319       49600 :         cldfbBufferImag[i] = imagBuffer[i];
     320       49600 :         move16();
     321             :     }
     322             : 
     323             : 
     324        3100 :     Q_cldfb = sub( 31, riBuffer_exp );
     325             : 
     326        3100 :     Q_cldfb = sub( Q_cldfb, 16 );
     327             : 
     328             : 
     329        3100 :     est_energy_fx( enerBuffer, enerBuffer_exp, hVAD_CLDFB->frame_sb_energy, &frame_energy2, &HB_Power, &frame_energy, &sb_power_Q, &frame_energy2_Q, &HB_Power_Q, &frame_energy_Q,
     330             :                    &hVAD_CLDFB->frame_sb_energy_scale, bw_index );
     331             : 
     332        3100 :     subband_FFT_fx( cldfbBufferReal, cldfbBufferImag, spec_amp, 0, &Q_cldfb );
     333             : 
     334        3100 :     frame_spec_dif_cor_rate_fx( hVAD_CLDFB, spec_amp, add( Q_cldfb, 8 ), hVAD_CLDFB->f_tonality_rate );
     335             : 
     336        3100 :     spec_center_fx( enerBuffer, hVAD_CLDFB->sp_center, bw_index, sb_power_Q );
     337             : 
     338        3100 :     ltd_stable_fx( hVAD_CLDFB, hVAD_CLDFB->ltd_stable_rate, frame_energy, hVAD_CLDFB->frameloop, frame_energy_Q );
     339             : 
     340        3100 :     spec_flatness_fx( spec_amp, hVAD_CLDFB->smooth_spec_amp, hVAD_CLDFB->sfm );
     341             : 
     342        3100 :     bg_music_decision_fx( hVAD_CLDFB, &music_backgound_f, frame_energy, frame_energy_Q );
     343             : 
     344        3100 :     snr_calc( hVAD_CLDFB, frame_energy2_Q, &snr, &tsnr, frame_energy2, bw_index );
     345             : 
     346        3100 :     calc_snr_flux_fx( tsnr, hVAD_CLDFB->pre_snr, &snr_flux );
     347             : 
     348        3100 :     calc_lt_snr_fx( hVAD_CLDFB, &lt_snr_org, &lt_snr, hVAD_CLDFB->fg_energy, hVAD_CLDFB->fg_energy_count, hVAD_CLDFB->bg_energy,
     349        3100 :                     hVAD_CLDFB->bg_energy_count, bw_index, hVAD_CLDFB->lt_noise_sp_center0 );
     350             : 
     351        3100 :     calc_lf_snr_fx( &hVAD_CLDFB->lf_snr_smooth, &lf_snr, hVAD_CLDFB->l_speech_snr, hVAD_CLDFB->l_speech_snr_count, hVAD_CLDFB->l_silence_snr,
     352        3100 :                     hVAD_CLDFB->l_silence_snr_count, hVAD_CLDFB->fg_energy_count, hVAD_CLDFB->bg_energy_count, bw_index );
     353             : 
     354             : 
     355        3100 :     vad_flag = comvad_decision_fx( hVAD_CLDFB, lf_snr, lt_snr_org, lt_snr, snr_flux, snr, tsnr, frame_energy2, music_backgound_f, frame_energy2_Q,
     356             :                                    cldfb_addition, vada_flag );
     357             : 
     358             : 
     359        6200 :     update_flag = update_decision_fx( hVAD_CLDFB, frame_energy, HB_Power, hVAD_CLDFB->frameloop, bw_index, frame_energy_Q,
     360        3100 :                                       HB_Power_Q, snr, tsnr, hVAD_CLDFB->vad_flag_for_bk_update, music_backgound_f );
     361             : 
     362             : 
     363        3100 :     UpdateState_fx( hVAD_CLDFB, hVAD_CLDFB->vad_flag_for_bk_update, frame_energy2, frame_energy2_Q, update_flag, music_backgound_f, HB_Power, HB_Power_Q, snr );
     364             : 
     365             : 
     366        3100 :     return vad_flag;
     367             : }

Generated by: LCOV version 1.14