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

Generated by: LCOV version 1.14