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

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : #include <stdint.h>
       5             : #include "options.h" /* Compilation switches                   */
       6             : #include "cnst.h"    /* Common constants                       */
       7             : //#include "prot_fx.h"      /* Function prototypes                    */
       8             : #include "prot_fx.h"     /* Function prototypes                    */
       9             : #include "prot_fx_enc.h" /* Function prototypes                    */
      10             : #include "basop_util.h"
      11             : 
      12             : /*-------------------------------------------------------------------*
      13             :  * find_tilt()
      14             :  *
      15             :  * Find LF/HF energy ratio
      16             :  *-------------------------------------------------------------------*/
      17             : 
      18        3100 : void find_tilt_fx(
      19             :     const Word32 fr_bands[], /* i  : energy in frequency bands                                          Q_new + Q_SCALE*/
      20             :     const Word32 bckr[],     /* i  : per band background noise energy estimate          Q_new + Q_SCALE*/
      21             :     Word32 ee[2],            /* o  : lf/hf E ration for present frame                                                    Q6*/
      22             :     const Word16 pitch[3],   /* i  : open loop pitch values for 3 half-frames                                    Q0*/
      23             :     const Word16 voicing[3], /* i  : normalized correlation for 3 half-frames                                   Q15*/
      24             :     const Word32 *lf_E,      /* i  : per bin energy  for low frequencies         Q_new + Q_SCALE - 2*/
      25             :     const Word16 corr_shift, /* i  : normalized correlation correction                                                  Q15*/
      26             :     const Word16 bwidth,     /* i  : input signal bandwidth                                      Q0*/
      27             :     const Word16 max_band,   /* i  : maximum critical band                                       Q0*/
      28             :     Word32 hp_E[],           /* o  : energy in HF                                    Q_new + Q_SCALE*/
      29             :     const Word16 codec_mode, /* i  : MODE1 or MODE2                                                                                              Q0*/
      30             :     const Word16 Q_new,      /* i  : scaling factor                                                                                                */
      31             :     Word32 *bckr_tilt_lt     /* i/o: lf/hf E ratio of background noise                                                  Q16*/
      32             :     ,
      33             :     Word16 Opt_vbr_mode /* Q0 */
      34             : )
      35             : {
      36        3100 :     Word32 lp_bckr = 0, hp_bckr = 0, lp_E, Ltmp;
      37             :     const Word32 *pt_E, *pt_bands, *pt_bckr, *hf_bands, *tmp_E;
      38             :     Word16 tmp, freq, f0, f1, f2, mean_voi, bin;
      39             :     Word16 i, nb_bands;
      40             :     Word16 e_tmp, m_tmp;
      41             :     Word16 m_Fs, e_Fs;
      42             :     Word16 m_cnt, e_cnt;
      43             :     Word16 m_hpE, e_hpE;
      44             :     Word16 scaling;
      45        3100 :     move32();
      46        3100 :     move32();
      47             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
      48        3100 :     Flag Overflow = 0;
      49        3100 :     move32();
      50             : #endif
      51             :     /*-----------------------------------------------------------------*
      52             :      * Initializations
      53             :      *-----------------------------------------------------------------*/
      54             : 
      55        3100 :     scaling = add( Q_new, QSCALE );
      56        3100 :     IF( NE_16( bwidth, NB ) )
      57             :     {
      58             :         /* WB processing */
      59        3100 :         bin = BIN4_FX;
      60        3100 :         move16();            /* First useful frequency bin ~ 50 Hz     */
      61        3100 :         pt_bands = fr_bands; /* Q_new + QSCALE */
      62        3100 :         tmp_E = lf_E;        /* Q_new + QSCALE - 2 */
      63        3100 :         pt_bckr = bckr;      /* Q_new + QSCALE */
      64        3100 :         nb_bands = 10;
      65        3100 :         move16();
      66             :     }
      67             :     ELSE
      68             :     {
      69             :         /* NB processing */
      70           0 :         bin = add( shl( BIN4_FX, 1 ), BIN4_FX ); /* First useful frequency bin ~ 150 Hz    */
      71           0 :         pt_bands = fr_bands + 1;                 /* Exlcude 1st critical band              Q_new + QSCALE*/
      72           0 :         tmp_E = lf_E + 2;                        /* Start at the 3rd bin (150 Hz)          Q_new + QSCALE - 2*/
      73           0 :         pt_bckr = bckr + 1;                      /* Exlcude 1st critical band              Q_new + QSCALE*/
      74           0 :         nb_bands = 9;
      75           0 :         move16(); /* Nb. of "low" frequency bands taken into account in NB processing      */
      76             :     }
      77             : 
      78             :     /*-----------------------------------------------------------------*
      79             :      * Find spectrum tilt
      80             :      *-----------------------------------------------------------------*/
      81             : 
      82        3100 :     pt_E = tmp_E;        /* Point at the 1st useful element of the per-bin energy vector  */
      83        3100 :     hf_bands = fr_bands; /* Q_new + QSCALE */
      84             : 
      85             :     /* bckr + voicing */
      86             :     /*lp_bckr = mean( pt_bckr, nb_bands );*/ /* estimated noise E in first critical bands, up to 1270 Hz */
      87        3100 :     lp_bckr = Mean32( pt_bckr, nb_bands );
      88             :     /*hp_bckr = 0.5f * (bckr[max_band-1] + bckr[max_band]);*/              /* estimated noise E in last 2 critical bands */
      89        3100 :     hp_bckr = L_shr( L_add_sat( bckr[max_band - 1], bckr[max_band] ), 1 ); /* Q_new + QSCALE - 1 */
      90        3100 :     if ( hp_bckr == 0 )                                                    /* Avoid division by zero. */
      91             :     {
      92           0 :         hp_bckr = L_deposit_l( 1 );
      93             :     }
      94        3100 :     tmp = BASOP_Util_Divide3232_Scale( lp_bckr, hp_bckr, &e_tmp );
      95             : 
      96        3100 :     Ltmp = L_shr_r_sat( L_deposit_h( tmp ), sub( 15, e_tmp ) );
      97             : 
      98        3100 :     *bckr_tilt_lt = L_add( Mpy_32_16_r( *bckr_tilt_lt, 29491 ), Mpy_32_16_r( Ltmp, 3277 ) ); /* Q16 */
      99             : 
     100        3100 :     test();
     101        3100 :     IF( EQ_16( codec_mode, MODE2 ) || Opt_vbr_mode == 1 )
     102             :     {
     103             :         /*lp_bckr *= FACT;*/
     104             :         /*hp_bckr *= FACT;*/
     105        1050 :         lp_bckr = L_add_sat( L_shl_sat( lp_bckr, 1 ), lp_bckr ); /* Q_new + QSCALE */
     106        1050 :         hp_bckr = L_add_sat( L_shl_sat( hp_bckr, 1 ), hp_bckr );
     107             :     }
     108             :     /*mean_voi = 0.5f * (voicing[1] + voicing[2]) + corr_shift;*/
     109        3100 :     Ltmp = L_mult( voicing[1], 16384 /* 0.5 in Q15 */ );      /* Q31 */
     110        3100 :     Ltmp = L_mac( Ltmp, voicing[2], 16384 /* 0.5 in Q15 */ ); /* Q31 */
     111        3100 :     Ltmp = L_mac_o( Ltmp, corr_shift, 32767, &Overflow );     /* Q31 */
     112        3100 :     mean_voi = round_fx_o( Ltmp, &Overflow );                 /* Q15 */
     113             : 
     114             :     /*f0 = INT_FS_FX / pitch[2];*/
     115        3100 :     e_tmp = norm_s( pitch[2] );
     116        3100 :     m_tmp = shl( pitch[2], e_tmp );
     117             : 
     118        3100 :     m_Fs = div_s( INT_FS_FX, m_tmp ); /* exp(e_tmp) */
     119        3100 :     e_Fs = sub( 15, e_tmp );
     120        3100 :     f0 = shr( m_Fs, sub( e_Fs, 4 ) ); /* Q4 */
     121             : 
     122        9300 :     FOR( i = 0; i < 2; i++ )
     123             :     {
     124             :         /*hp_E[i] = 0.5f * (hf_bands[max_band-1] + hf_bands[max_band]) - hp_bckr; */        /* averaged E in last 2 critical bands */
     125        6200 :         Ltmp = L_add( L_shr( hf_bands[max_band - 1], 1 ), L_shr( hf_bands[max_band], 1 ) ); /* Q_new + QSCALE */
     126        6200 :         hp_E[i] = L_sub( Ltmp, hp_bckr );                                                   /* Q_new + QSCALE */
     127        6200 :         IF( Opt_vbr_mode == 0 )
     128             :         {
     129        6200 :             hp_E[i] = L_max( hp_E[i], L_shl( E_MIN_FX, Q_new ) ); /* Q_new + QSCALE */
     130        6200 :             move32();
     131             :         }
     132             :         ELSE
     133             :         {
     134           0 :             hp_E[i] = L_max( hp_E[i], L_shl( 1, scaling ) ); /* Q_new + QSCALE */
     135           0 :             move32();
     136             :         }
     137             : 
     138        6200 :         test();
     139        6200 :         IF( GT_16( mean_voi, TH_COR_FX ) && LT_16( pitch[2], TH_PIT_FX ) ) /* High-pitched voiced frames */
     140             :         {
     141        4428 :             freq = bin;
     142        4428 :             move16(); /* 1st useful frequency bin */
     143        4428 :             m_cnt = 0;
     144        4428 :             move16();
     145        4428 :             lp_E = L_deposit_l( 0 );
     146             : 
     147        4428 :             f1 = add( shr( f0, 1 ), f0 ); /* Middle between 2 harmonics */
     148        4428 :             f2 = f0;
     149        4428 :             move16();
     150       29846 :             WHILE( LE_16( freq, 20320 ) ) /* End frequency of 10th critical band */
     151             :             {
     152      145778 :                 FOR( ; freq <= f1; freq += BIN4_FX )
     153             :                 {
     154             :                     /* include only bins sufficiently close to harmonics */
     155      120360 :                     tmp = sub( freq, f2 );
     156      120360 :                     IF( L_mac0( -(Word32) TH_D_FX * TH_D_FX, tmp, tmp ) < 0 )
     157             :                     {
     158       49302 :                         lp_E = L_add_o( *pt_E, lp_E, &Overflow ); /* Q_new + QSCALE - 2 */
     159       49302 :                         m_cnt = add( m_cnt, 1 );                  /* Q0 */
     160             :                     }
     161      120360 :                     pt_E++;
     162             :                 }
     163       25418 :                 f1 = add_o( f1, f0, &Overflow );
     164       25418 :                 f2 = add_o( f2, f0, &Overflow );
     165             :             }
     166             :             /*lp_E = lp_E / (float)cnt - lp_bckr;*/
     167        4428 :             e_tmp = sub( norm_l( lp_E ), 1 );
     168        4428 :             m_tmp = extract_h( L_shl( lp_E, e_tmp ) );
     169             : 
     170        4428 :             e_tmp = sub( e_tmp, 2 ); /* lf_e divided by 4 in anal_sp */
     171             : 
     172        4428 :             e_cnt = norm_s( m_cnt );
     173        4428 :             m_cnt = shl( m_cnt, e_cnt );
     174             : 
     175        4428 :             m_tmp = div_s( m_tmp, m_cnt ); /* exp(e_tmp + e_cnt) */
     176        4428 :             e_tmp = sub( e_tmp, e_cnt );
     177             : 
     178        4428 :             lp_E = L_sub_o( L_shr_o( m_tmp, sub( e_tmp, 1 ), &Overflow ), lp_bckr, &Overflow ); /* Q_new + QSCALE */
     179             : 
     180        4428 :             pt_E = tmp_E + VOIC_BINS; /* Update for next half-frame */
     181             :         }
     182             :         ELSE /* Other than high-pitched voiced frames */
     183             :         {
     184             :             /*lp_E = mean( pt_bands, nb_bands ) - lp_bckr;*/       /* averaged E in first critical bands, up to 1270 Hz */
     185        1772 :             lp_E = L_sub( Mean32( pt_bands, nb_bands ), lp_bckr ); /* Q_new + QSCALE */
     186             :         }
     187        6200 :         IF( Opt_vbr_mode == 0 )
     188             :         {
     189        6200 :             lp_E = L_max( lp_E, L_shl( E_MIN_FX, Q_new ) );
     190             :         }
     191             :         ELSE
     192             :         {
     193           0 :             lp_E = L_max( lp_E, 0 );
     194             :         }
     195             :         /*ee[i] = lp_E / hp_E[i];*/ /* LF/HF ratio */
     196        6200 :         test();
     197        6200 :         IF( lp_E != 0 && hp_E[i] != 0 )
     198             :         {
     199        6200 :             e_tmp = sub( norm_l( lp_E ), 1 );
     200        6200 :             m_tmp = extract_h( L_shl( lp_E, e_tmp ) );
     201        6200 :             e_hpE = norm_l( hp_E[i] );
     202        6200 :             m_hpE = extract_h( L_shl( hp_E[i], e_hpE ) );
     203        6200 :             m_tmp = div_s( m_tmp, m_hpE ); /* exp(e_tmp + e_hpE) */
     204        6200 :             e_tmp = sub( e_tmp, e_hpE );
     205             : 
     206        6200 :             ee[i] = L_shr_o( m_tmp, add( e_tmp, 15 - 6 ), &Overflow ); /* ee in Q6 */
     207             :         }
     208           0 :         ELSE IF( lp_E == 0 )
     209             :         {
     210           0 :             ee[i] = L_deposit_l( 0 );
     211             :         }
     212             :         ELSE
     213             :         {
     214           0 :             ee[i] = MAX_32;
     215             :         }
     216             : 
     217        6200 :         IF( EQ_16( bwidth, NB ) ) /* For NB input, compensate for the missing bands */
     218             :         {
     219           0 :             Ltmp = L_shl_o( ee[i], 3, &Overflow );
     220           0 :             IF( EQ_32( Ltmp, MAX_32 ) ) /* if Overflow: Compute with less precision */
     221             :             {
     222           0 :                 Ltmp = Mult_32_16( ee[i], 24576 /* 0.75 in Q15 */ ); /* 6/8             Q6*/
     223           0 :                 ee[i] = L_shl_sat( Ltmp, 3 );
     224           0 :                 move32(); /* x8  */
     225             :             }
     226             :             ELSE
     227             :             {
     228           0 :                 ee[i] = Mult_32_16( Ltmp, 24576 /* 0.75 in Q15 */ ); /* Q6 */
     229           0 :                 move32();                                            /* 6/8  */
     230             :             }
     231             :         }
     232             : 
     233        6200 :         pt_bands += NB_BANDS; /* Update for next half-frame */
     234        6200 :         hf_bands += NB_BANDS;
     235             :     }
     236             : 
     237        3100 :     return;
     238             : }
     239             : 
     240             : /*-------------------------------------------------------------------*
     241             :  * find_tilt()
     242             :  *
     243             :  * Find LF/HF energy ratio
     244             :  *-------------------------------------------------------------------*/
     245     1111210 : void find_tilt_ivas_fx(
     246             :     const Word32 fr_bands[], /* i  : energy in frequency bands                                          q_fr_bands*/
     247             :     const Word16 q_fr_bands, /* i  : Q of fr_bands                                              Q0*/
     248             :     const Word32 bckr[],     /* i  : per band background noise energy estimate    q_bckr*/
     249             :     const Word16 q_bckr,     /* i  : Q of bckr    Q0*/
     250             :     Word32 ee[2],            /* o  : lf/hf E ration for present frame                                                    Q6*/
     251             :     const Word16 pitch[3],   /* i  : open loop pitch values for 3 half-frames                                    Q0*/
     252             :     const Word16 voicing[3], /* i  : normalized correlation for 3 half-frames                                   Q15*/
     253             :     const Word32 *lf_E,      /* i  : per bin energy  for low frequencies         q_lf_E*/
     254             :     const Word16 q_lf_E,     /* i  : Q of lf_E         */
     255             :     const Word16 corr_shift, /* i  : normalized correlation correction                                                  Q15*/
     256             :     const Word16 bwidth,     /* i  : input signal bandwidth                                         */
     257             :     const Word16 max_band,   /* i  : maximum critical band                                          */
     258             :     Word32 hp_E[],           /* o  : energy in HF                                    Q_new*/
     259             :     const Word16 codec_mode, /* i  : MODE1 or MODE2                                      */
     260             :     Word32 *bckr_tilt_lt,    /* i/o: lf/hf E ratio of background noise  Q16                        */
     261             :     Word16 Opt_vbr_mode )
     262             : {
     263     1111210 :     Word32 lp_bckr = 0, hp_bckr = 0, lp_E, Ltmp;
     264             :     const Word32 *pt_E, *pt_bands, *pt_bckr, *hf_bands, *tmp_E;
     265             :     Word16 tmp, freq, f0, f1, f2, mean_voi, bin;
     266             :     Word16 i, nb_bands;
     267             :     Word16 e_tmp, m_tmp;
     268             :     Word16 m_Fs, e_Fs;
     269             :     Word16 m_cnt, e_cnt;
     270             :     Word16 m_hpE, e_hpE;
     271             :     Word64 sum;
     272             :     Word16 inv_bands, q_lp_E;
     273             :     Word32 Le_min_scaled, Ltmp2;
     274             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
     275     1111210 :     Flag Overflow = 0;
     276     1111210 :     move32();
     277             : #endif
     278     1111210 :     move32();
     279     1111210 :     move32();
     280             :     /*-----------------------------------------------------------------*
     281             :      * Initializations
     282             :      *-----------------------------------------------------------------*/
     283             : 
     284     1111210 :     IF( ( bwidth != NB ) )
     285             :     {
     286             :         /* WB processing */
     287     1107375 :         bin = BIN4_FX;
     288     1107375 :         move16();            /* First useful frequency bin ~ 50 Hz     */
     289     1107375 :         pt_bands = fr_bands; /* Q_new */
     290     1107375 :         tmp_E = lf_E;        /* Q_new - 2 */
     291     1107375 :         pt_bckr = bckr;      /* Q_new */
     292     1107375 :         nb_bands = 10;
     293     1107375 :         inv_bands = 3277 /* 1/10 in Q15 */;
     294     1107375 :         move16();
     295     1107375 :         move16();
     296             :     }
     297             :     ELSE
     298             :     {
     299             :         /* NB processing */
     300        3835 :         bin = 3 * BIN4_FX;       /* First useful frequency bin ~ 150 Hz    */
     301        3835 :         pt_bands = fr_bands + 1; /* Exlcude 1st critical band              */
     302        3835 :         tmp_E = lf_E + 2;        /* Start at the 3rd bin (150 Hz)          */
     303        3835 :         pt_bckr = bckr + 1;      /* Exlcude 1st critical band              */
     304        3835 :         nb_bands = 9;
     305        3835 :         inv_bands = 3641; /* 1/9 in Q15 */
     306        3835 :         move16();
     307        3835 :         move16(); /* Nb. of "low" frequency bands taken into account in NB processing      */
     308             :     }
     309             : 
     310             :     /*-----------------------------------------------------------------*
     311             :      * Find spectrum tilt
     312             :      *-----------------------------------------------------------------*/
     313             : 
     314     1111210 :     pt_E = tmp_E; /* Point at the 1st useful element of the per-bin energy vector  */
     315     1111210 :     hf_bands = fr_bands;
     316             : 
     317             :     /* bckr + voicing */
     318             :     /*lp_bckr = mean( pt_bckr, nb_bands );*/ /* estimated noise E in first critical bands, up to 1270 Hz */
     319     1111210 :     sum = 0;
     320     1111210 :     move64();
     321    12219475 :     FOR( i = 0; i < nb_bands; i++ )
     322             :     {
     323    11108265 :         sum = W_mac_32_16( sum, pt_bckr[i], inv_bands ); // q_bckr+16
     324             :     }
     325     1111210 :     lp_bckr = W_shl_sat_l( sum, -16 );                                                                                  // q_bckr
     326             :     /*hp_bckr = 0.5f * (bckr[max_band-1] + bckr[max_band]);*/                                                           /* estimated noise E in last 2 critical bands */
     327     1111210 :     hp_bckr = W_extract_h( W_mac_32_32( W_mult_32_32( bckr[max_band - 1], ONE_IN_Q30 ), bckr[max_band], ONE_IN_Q30 ) ); // q_bckr
     328     1111210 :     if ( hp_bckr == 0 )                                                                                                 /* Avoid division by zero. */
     329             :     {
     330      238592 :         hp_bckr = L_deposit_l( 1 );
     331             :     }
     332     1111210 :     Ltmp = BASOP_Util_Divide3232_Scale_newton( lp_bckr, hp_bckr, &e_tmp );
     333     1111210 :     Ltmp = Mpy_32_16_r( Ltmp, 3277 /* 0.1f in Q15 */ );
     334     1111210 :     Ltmp = L_shr_sat( Ltmp, sub( 15, e_tmp ) );
     335     1111210 :     *bckr_tilt_lt = L_add_sat( Mpy_32_16_r( *bckr_tilt_lt, 29491 /* 0.9f in Q15 */ ), Ltmp ); // Q16
     336     1111210 :     move32();
     337             : 
     338     1111210 :     test();
     339     1111210 :     IF( EQ_16( codec_mode, MODE2 ) || EQ_16( Opt_vbr_mode, 1 ) )
     340             :     {
     341             :         /*lp_bckr *= FACT;*/
     342             :         /*hp_bckr *= FACT;*/
     343           0 :         lp_bckr = L_add_sat( L_shl_sat( lp_bckr, 1 ), lp_bckr ); /* Q_new */
     344           0 :         hp_bckr = L_add_sat( L_shl_sat( hp_bckr, 1 ), hp_bckr ); /* Q_new */
     345             :     }
     346             :     /*mean_voi = 0.5f * (voicing[1] + voicing[2]) + corr_shift;*/
     347     1111210 :     Ltmp = L_mult( voicing[1], 16384 /* 0.5 in Q15 */ );                    // Q31
     348     1111210 :     Ltmp = L_mac( Ltmp, voicing[2], 16384 /* 0.5 in Q15 */ );               // Q31
     349     1111210 :     Ltmp = L_mac_o( Ltmp, corr_shift, 32767 /* 1.0f in Q15 */, &Overflow ); // Q31
     350     1111210 :     mean_voi = round_fx_o( Ltmp, &Overflow );                               // Q15
     351             : 
     352             :     /*f0 = INT_FS_FX / pitch[2];*/
     353     1111210 :     e_tmp = norm_s( pitch[2] );
     354     1111210 :     m_tmp = shl( pitch[2], e_tmp );
     355             : 
     356     1111210 :     m_Fs = div_s( INT_FS_FX, m_tmp ); /* exp(e_tmp) */
     357     1111210 :     e_Fs = sub( 15, e_tmp );
     358     1111210 :     f0 = shr( m_Fs, sub( e_Fs, 4 ) ); /* Q4 */
     359             : 
     360     1111210 :     Le_min_scaled = L_shl( E_MIN_FXQ31, sub( q_fr_bands, Q31 ) ); // q_fr_bands=q_bckr
     361             : 
     362     3333630 :     FOR( i = 0; i < 2; i++ )
     363             :     {
     364             :         /*hp_E[i] = 0.5f * (hf_bands[max_band-1] + hf_bands[max_band]) - hp_bckr; */                                             /* averaged E in last 2 critical bands */
     365     2222420 :         Ltmp = W_extract_h( W_mac_32_32( W_mult_32_32( hf_bands[max_band - 1], ONE_IN_Q30 ), hf_bands[max_band], ONE_IN_Q30 ) ); // q_fr_bands
     366     2222420 :         Ltmp = L_sub( Ltmp, hp_bckr );                                                                                           // q_fr_bands
     367             : 
     368     2222420 :         Ltmp2 = L_max( Ltmp, L_shl_sat( 1, q_fr_bands ) ); // q_fr_bands, saturation is added because q_fr_bands is limited to 31
     369     2222420 :         if ( Opt_vbr_mode == 0 )
     370             :         {
     371     2222420 :             Ltmp2 = L_max( Ltmp, Le_min_scaled ); // q_fr_bands
     372             :         }
     373     2222420 :         hp_E[i] = L_max( Ltmp2, 1 ); // to prevent division by zero
     374     2222420 :         move32();
     375             : 
     376     2222420 :         test();
     377     2222420 :         IF( GT_16( mean_voi, TH_COR_FX ) && LT_16( pitch[2], TH_PIT_FX ) ) /* High-pitched voiced frames */
     378             :         {
     379     1200316 :             freq = bin; // Q4
     380     1200316 :             move16();   /* 1st useful frequency bin */
     381     1200316 :             m_cnt = 0;
     382     1200316 :             move16();
     383     1200316 :             sum = 0;
     384     1200316 :             move64();
     385             : 
     386     1200316 :             f1 = add( shr( f0, 1 ), f0 ); /* Middle between 2 harmonics */
     387     1200316 :             f2 = f0;
     388     1200316 :             move16();
     389     8609956 :             WHILE( LE_16( freq, 20320 /* 1270.0f in Q4 */ ) ) /* End frequency of 10th critical band */
     390             :             {
     391    39728900 :                 FOR( ; freq <= f1; freq += BIN4_FX )
     392             :                 {
     393             :                     /* include only bins sufficiently close to harmonics */
     394    32319260 :                     tmp = sub( freq, f2 );
     395    32319260 :                     IF( L_mac0( -TH_D_FX * TH_D_FX, tmp, tmp ) < 0 )
     396             :                     {
     397    14573958 :                         sum = W_mac_32_16( sum, *pt_E, 1 ); // q_lf_E+1
     398    14573958 :                         m_cnt = add( m_cnt, 1 );
     399             :                     }
     400    32319260 :                     pt_E++;
     401             :                 }
     402     7409640 :                 f1 = add_o( f1, f0, &Overflow );
     403     7409640 :                 f2 = add_o( f2, f0, &Overflow );
     404             :             }
     405             :             /*lp_E = lp_E / (float)cnt - lp_bckr;*/
     406     1200316 :             e_tmp = sub( W_norm( sum ), 1 );
     407     1200316 :             m_tmp = extract_h( W_extract_h( W_shl( sum, e_tmp ) ) ); // q_lf_E+1+e_tmp-32-16
     408     1200316 :             e_tmp = sub( add( q_lf_E, e_tmp ), 47 );
     409             : 
     410     1200316 :             e_cnt = norm_s( m_cnt );
     411     1200316 :             m_cnt = shl( m_cnt, e_cnt ); // e_cnt
     412             : 
     413     1200316 :             m_tmp = div_s( m_tmp, m_cnt ); // Q15+e_tmp-e_cnt
     414     1200316 :             e_tmp = add( Q15, sub( e_tmp, e_cnt ) );
     415     1200316 :             sum = W_shl( m_tmp, sub( add( q_bckr, 1 ), e_tmp ) ); // q_bckr+1
     416     1200316 :             sum = W_msu_32_16( sum, lp_bckr, 1 );                 // q_bckr+1
     417     1200316 :             q_lp_E = W_norm( sum );
     418     1200316 :             lp_E = W_extract_h( W_shl( sum, q_lp_E ) ); // q_bckr+1+q_lp_E-32
     419     1200316 :             q_lp_E = sub( add( q_lp_E, q_bckr ), Q31 );
     420             : 
     421     1200316 :             pt_E = tmp_E + VOIC_BINS; /* Update for next half-frame             Q_new - 1 */
     422             :         }
     423             :         ELSE /* Other than high-pitched voiced frames */
     424             :         {
     425             :             /*lp_E = mean( pt_bands, nb_bands ) - lp_bckr;*/ /* averaged E in first critical bands, up to 1270 Hz */
     426     1022104 :             sum = 0;
     427     1022104 :             move64();
     428    11241142 :             FOR( Word16 j = 0; j < nb_bands; j++ )
     429             :             {
     430    10219038 :                 sum = W_mac_32_16( sum, pt_bands[j], inv_bands ); // q_fr_bands+16
     431             :             }
     432     1022104 :             sum = W_mac_32_16( sum, lp_bckr, -ONE_IN_Q15 ); // q_fr_bands+16
     433     1022104 :             lp_E = W_round48_L( sum );                      // q_fr_bands=q_bckr
     434     1022104 :             q_lp_E = q_bckr;                                // q_fr_bands=q_bckr
     435     1022104 :             move16();
     436             :         }
     437     2222420 :         test();
     438     2222420 :         IF( Opt_vbr_mode == 0 && GT_32( L_shl_sat( Le_min_scaled, sub( q_lp_E, q_bckr ) ), lp_E ) )
     439             :         {
     440      304422 :             lp_E = E_MIN_FXQ31;
     441      304422 :             q_lp_E = Q31;
     442      304422 :             move32();
     443      304422 :             move16();
     444             :         }
     445     2222420 :         if ( Opt_vbr_mode != 0 )
     446             :         {
     447           0 :             lp_E = L_max( lp_E, 0 ); // q_lp_E
     448             :         }
     449             :         /*ee[i] = lp_E / hp_E[i];*/ /* LF/HF ratio */
     450             : 
     451     2222420 :         if ( lp_E == 0 )
     452             :         {
     453           1 :             ee[i] = 0;
     454           1 :             move32();
     455             :         }
     456     2222420 :         test();
     457     2222420 :         IF( lp_E != 0 )
     458             :         {
     459     2222419 :             e_tmp = sub( norm_l( lp_E ), 1 );
     460     2222419 :             m_tmp = extract_h( L_shl( lp_E, e_tmp ) ); // e_tmp+q_lp_E-16
     461     2222419 :             e_hpE = norm_l( hp_E[i] );
     462     2222419 :             m_hpE = extract_h( L_shl( hp_E[i], e_hpE ) ); // e_hpE+q_bckr-16
     463     2222419 :             m_tmp = div_s( m_tmp, m_hpE );                // Q15+(e_tmp+q_lp_E)-(e_hpE+q_bckr)
     464     2222419 :             e_tmp = sub( add( e_tmp, q_lp_E ), add( e_hpE, q_bckr ) );
     465     2222419 :             ee[i] = L_shr_o( m_tmp, add( e_tmp, 15 - 6 ), &Overflow ); /* ee in Q6 */
     466     2222419 :             move32();
     467             :         }
     468             : 
     469     2222420 :         IF( bwidth == NB ) /* For NB input, compensate for the missing bands */
     470             :         {
     471        7670 :             Ltmp = L_shl_o( ee[i], 3, &Overflow ); /* Q6 */
     472        7670 :             IF( EQ_32( Ltmp, MAX_32 ) )            /* if Overflow: Compute with less precision */
     473             :             {
     474           0 :                 Ltmp = Mult_32_16( ee[i], 24576 /* 0.75 in Q15 */ ); /* 6/8     Q6*/
     475           0 :                 ee[i] = L_shl_sat( Ltmp, 3 );                        /* Q6 */
     476           0 :                 move32();                                            /* x8  */
     477             :             }
     478             :             ELSE
     479             :             {
     480        7670 :                 ee[i] = Mult_32_16( Ltmp, 24576 /* 0.75 in Q15 */ );
     481        7670 :                 move32(); /* 6/8  */
     482             :             }
     483             :         }
     484             : 
     485     2222420 :         pt_bands += NB_BANDS; /* Update for next half-frame */
     486     2222420 :         hf_bands += NB_BANDS;
     487             :     }
     488             : 
     489     1111210 :     return;
     490             : }

Generated by: LCOV version 1.14