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 @ 574a190e3c6896c6c4ed10d7f23649709a0c4347 Lines: 212 240 88.3 %
Date: 2025-06-27 02:59:36 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        4432 :             freq = bin;
     142        4432 :             move16(); /* 1st useful frequency bin */
     143        4432 :             m_cnt = 0;
     144        4432 :             move16();
     145        4432 :             lp_E = L_deposit_l( 0 );
     146             : 
     147        4432 :             f1 = add( shr( f0, 1 ), f0 ); /* Middle between 2 harmonics */
     148        4432 :             f2 = f0;
     149        4432 :             move16();
     150       30214 :             WHILE( LE_16( freq, 20320 ) ) /* End frequency of 10th critical band */
     151             :             {
     152      146054 :                 FOR( ; freq <= f1; freq += BIN4_FX )
     153             :                 {
     154             :                     /* include only bins sufficiently close to harmonics */
     155      120272 :                     tmp = sub( freq, f2 );
     156      120272 :                     IF( L_mac0( -(Word32) TH_D_FX * TH_D_FX, tmp, tmp ) < 0 )
     157             :                     {
     158       50014 :                         lp_E = L_add_o( *pt_E, lp_E, &Overflow ); /* Q_new + QSCALE - 2 */
     159       50014 :                         m_cnt = add( m_cnt, 1 );                  /* Q0 */
     160             :                     }
     161      120272 :                     pt_E++;
     162             :                 }
     163       25782 :                 f1 = add_o( f1, f0, &Overflow );
     164       25782 :                 f2 = add_o( f2, f0, &Overflow );
     165             :             }
     166             :             /*lp_E = lp_E / (float)cnt - lp_bckr;*/
     167        4432 :             e_tmp = sub( norm_l( lp_E ), 1 );
     168        4432 :             m_tmp = extract_h( L_shl( lp_E, e_tmp ) );
     169             : 
     170        4432 :             e_tmp = sub( e_tmp, 2 ); /* lf_e divided by 4 in anal_sp */
     171             : 
     172        4432 :             e_cnt = norm_s( m_cnt );
     173        4432 :             m_cnt = shl( m_cnt, e_cnt );
     174             : 
     175        4432 :             m_tmp = div_s( m_tmp, m_cnt ); /* exp(e_tmp + e_cnt) */
     176        4432 :             e_tmp = sub( e_tmp, e_cnt );
     177             : 
     178        4432 :             lp_E = L_sub_o( L_shr_o( m_tmp, sub( e_tmp, 1 ), &Overflow ), lp_bckr, &Overflow ); /* Q_new + QSCALE */
     179             : 
     180        4432 :             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        1768 :             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     1111194 : 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     1111194 :     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     1111194 :     Flag Overflow = 0;
     276     1111194 :     move32();
     277             : #endif
     278     1111194 :     move32();
     279     1111194 :     move32();
     280             :     /*-----------------------------------------------------------------*
     281             :      * Initializations
     282             :      *-----------------------------------------------------------------*/
     283             : 
     284     1111194 :     IF( ( bwidth != NB ) )
     285             :     {
     286             :         /* WB processing */
     287     1106904 :         bin = BIN4_FX;
     288     1106904 :         move16();            /* First useful frequency bin ~ 50 Hz     */
     289     1106904 :         pt_bands = fr_bands; /* Q_new */
     290     1106904 :         tmp_E = lf_E;        /* Q_new - 2 */
     291     1106904 :         pt_bckr = bckr;      /* Q_new */
     292     1106904 :         nb_bands = 10;
     293     1106904 :         inv_bands = 3277 /* 1/10 in Q15 */;
     294     1106904 :         move16();
     295     1106904 :         move16();
     296             :     }
     297             :     ELSE
     298             :     {
     299             :         /* NB processing */
     300        4290 :         bin = 3 * BIN4_FX;       /* First useful frequency bin ~ 150 Hz    */
     301        4290 :         pt_bands = fr_bands + 1; /* Exlcude 1st critical band              */
     302        4290 :         tmp_E = lf_E + 2;        /* Start at the 3rd bin (150 Hz)          */
     303        4290 :         pt_bckr = bckr + 1;      /* Exlcude 1st critical band              */
     304        4290 :         nb_bands = 9;
     305        4290 :         inv_bands = 3641; /* 1/9 in Q15 */
     306        4290 :         move16();
     307        4290 :         move16(); /* Nb. of "low" frequency bands taken into account in NB processing      */
     308             :     }
     309             : 
     310             :     /*-----------------------------------------------------------------*
     311             :      * Find spectrum tilt
     312             :      *-----------------------------------------------------------------*/
     313             : 
     314     1111194 :     pt_E = tmp_E; /* Point at the 1st useful element of the per-bin energy vector  */
     315     1111194 :     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     1111194 :     sum = 0;
     320     1111194 :     move64();
     321    12218844 :     FOR( i = 0; i < nb_bands; i++ )
     322             :     {
     323    11107650 :         sum = W_mac_32_16( sum, pt_bckr[i], inv_bands ); // q_bckr+16
     324             :     }
     325     1111194 :     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             : #ifndef FIX_1762_COMPILER_ISSUE
     328             :     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
     329             : #else
     330     1111194 :     hp_bckr = W_extract_h( W_shl( W_add( W_deposit32_l( bckr[max_band - 1] ), W_deposit32_l( bckr[max_band] ) ), 31 ) ); // q_bckr
     331             : #endif
     332     1111194 :     if ( hp_bckr == 0 ) /* Avoid division by zero. */
     333             :     {
     334        4393 :         hp_bckr = L_deposit_l( 1 );
     335             :     }
     336     1111194 :     Ltmp = BASOP_Util_Divide3232_Scale_newton( lp_bckr, hp_bckr, &e_tmp );
     337     1111194 :     Ltmp = Mpy_32_16_r( Ltmp, 3277 /* 0.1f in Q15 */ );
     338     1111194 :     Ltmp = L_shr_sat( Ltmp, sub( 15, e_tmp ) );
     339     1111194 :     *bckr_tilt_lt = L_add_sat( Mpy_32_16_r( *bckr_tilt_lt, 29491 /* 0.9f in Q15 */ ), Ltmp ); // Q16
     340     1111194 :     move32();
     341             : 
     342     1111194 :     test();
     343     1111194 :     IF( EQ_16( codec_mode, MODE2 ) || EQ_16( Opt_vbr_mode, 1 ) )
     344             :     {
     345             :         /*lp_bckr *= FACT;*/
     346             :         /*hp_bckr *= FACT;*/
     347           0 :         lp_bckr = L_add_sat( L_shl_sat( lp_bckr, 1 ), lp_bckr ); /* Q_new */
     348           0 :         hp_bckr = L_add_sat( L_shl_sat( hp_bckr, 1 ), hp_bckr ); /* Q_new */
     349             :     }
     350             :     /*mean_voi = 0.5f * (voicing[1] + voicing[2]) + corr_shift;*/
     351     1111194 :     Ltmp = L_mult( voicing[1], 16384 /* 0.5 in Q15 */ );                    // Q31
     352     1111194 :     Ltmp = L_mac( Ltmp, voicing[2], 16384 /* 0.5 in Q15 */ );               // Q31
     353     1111194 :     Ltmp = L_mac_o( Ltmp, corr_shift, 32767 /* 1.0f in Q15 */, &Overflow ); // Q31
     354     1111194 :     mean_voi = round_fx_o( Ltmp, &Overflow );                               // Q15
     355             : 
     356             :     /*f0 = INT_FS_FX / pitch[2];*/
     357     1111194 :     e_tmp = norm_s( pitch[2] );
     358     1111194 :     m_tmp = shl( pitch[2], e_tmp );
     359             : 
     360     1111194 :     m_Fs = div_s( INT_FS_FX, m_tmp ); /* exp(e_tmp) */
     361     1111194 :     e_Fs = sub( 15, e_tmp );
     362     1111194 :     f0 = shr( m_Fs, sub( e_Fs, 4 ) ); /* Q4 */
     363             : 
     364     1111194 :     Le_min_scaled = L_shl( E_MIN_FXQ31, sub( q_fr_bands, Q31 ) ); // q_fr_bands=q_bckr
     365             : 
     366     3333582 :     FOR( i = 0; i < 2; i++ )
     367             :     {
     368             :         /*hp_E[i] = 0.5f * (hf_bands[max_band-1] + hf_bands[max_band]) - hp_bckr; */                                             /* averaged E in last 2 critical bands */
     369     2222388 :         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
     370     2222388 :         Ltmp = L_sub( Ltmp, hp_bckr );                                                                                           // q_fr_bands
     371             : 
     372     2222388 :         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
     373     2222388 :         if ( Opt_vbr_mode == 0 )
     374             :         {
     375     2222388 :             Ltmp2 = L_max( Ltmp, Le_min_scaled ); // q_fr_bands
     376             :         }
     377     2222388 :         hp_E[i] = L_max( Ltmp2, 1 ); // to prevent division by zero
     378     2222388 :         move32();
     379             : 
     380     2222388 :         test();
     381     2222388 :         IF( GT_16( mean_voi, TH_COR_FX ) && LT_16( pitch[2], TH_PIT_FX ) ) /* High-pitched voiced frames */
     382             :         {
     383     1201518 :             freq = bin; // Q4
     384     1201518 :             move16();   /* 1st useful frequency bin */
     385     1201518 :             m_cnt = 0;
     386     1201518 :             move16();
     387     1201518 :             sum = 0;
     388     1201518 :             move64();
     389             : 
     390     1201518 :             f1 = add( shr( f0, 1 ), f0 ); /* Middle between 2 harmonics */
     391     1201518 :             f2 = f0;
     392     1201518 :             move16();
     393     8613478 :             WHILE( LE_16( freq, 20320 /* 1270.0f in Q4 */ ) ) /* End frequency of 10th critical band */
     394             :             {
     395    39765130 :                 FOR( ; freq <= f1; freq += BIN4_FX )
     396             :                 {
     397             :                     /* include only bins sufficiently close to harmonics */
     398    32353170 :                     tmp = sub( freq, f2 );
     399    32353170 :                     IF( L_mac0( -TH_D_FX * TH_D_FX, tmp, tmp ) < 0 )
     400             :                     {
     401    14577996 :                         sum = W_mac_32_16( sum, *pt_E, 1 ); // q_lf_E+1
     402    14577996 :                         m_cnt = add( m_cnt, 1 );
     403             :                     }
     404    32353170 :                     pt_E++;
     405             :                 }
     406     7411960 :                 f1 = add_o( f1, f0, &Overflow );
     407     7411960 :                 f2 = add_o( f2, f0, &Overflow );
     408             :             }
     409             :             /*lp_E = lp_E / (float)cnt - lp_bckr;*/
     410     1201518 :             e_tmp = sub( W_norm( sum ), 1 );
     411     1201518 :             m_tmp = extract_h( W_extract_h( W_shl( sum, e_tmp ) ) ); // q_lf_E+1+e_tmp-32-16
     412     1201518 :             e_tmp = sub( add( q_lf_E, e_tmp ), 47 );
     413             : 
     414     1201518 :             e_cnt = norm_s( m_cnt );
     415     1201518 :             m_cnt = shl( m_cnt, e_cnt ); // e_cnt
     416             : 
     417     1201518 :             m_tmp = div_s( m_tmp, m_cnt ); // Q15+e_tmp-e_cnt
     418     1201518 :             e_tmp = add( Q15, sub( e_tmp, e_cnt ) );
     419     1201518 :             sum = W_shl( m_tmp, sub( add( q_bckr, 1 ), e_tmp ) ); // q_bckr+1
     420     1201518 :             sum = W_msu_32_16( sum, lp_bckr, 1 );                 // q_bckr+1
     421     1201518 :             q_lp_E = W_norm( sum );
     422     1201518 :             lp_E = W_extract_h( W_shl( sum, q_lp_E ) ); // q_bckr+1+q_lp_E-32
     423     1201518 :             q_lp_E = sub( add( q_lp_E, q_bckr ), Q31 );
     424             : 
     425     1201518 :             pt_E = tmp_E + VOIC_BINS; /* Update for next half-frame             Q_new - 1 */
     426             :         }
     427             :         ELSE /* Other than high-pitched voiced frames */
     428             :         {
     429             :             /*lp_E = mean( pt_bands, nb_bands ) - lp_bckr;*/ /* averaged E in first critical bands, up to 1270 Hz */
     430     1020870 :             sum = 0;
     431     1020870 :             move64();
     432    11227122 :             FOR( Word16 j = 0; j < nb_bands; j++ )
     433             :             {
     434    10206252 :                 sum = W_mac_32_16( sum, pt_bands[j], inv_bands ); // q_fr_bands+16
     435             :             }
     436     1020870 :             sum = W_mac_32_16( sum, lp_bckr, -ONE_IN_Q15 ); // q_fr_bands+16
     437     1020870 :             lp_E = W_round48_L( sum );                      // q_fr_bands=q_bckr
     438     1020870 :             q_lp_E = q_bckr;                                // q_fr_bands=q_bckr
     439     1020870 :             move16();
     440             :         }
     441     2222388 :         test();
     442     2222388 :         IF( Opt_vbr_mode == 0 && GT_32( L_shl_sat( Le_min_scaled, sub( q_lp_E, q_bckr ) ), lp_E ) )
     443             :         {
     444      309763 :             lp_E = E_MIN_FXQ31;
     445      309763 :             q_lp_E = Q31;
     446      309763 :             move32();
     447      309763 :             move16();
     448             :         }
     449     2222388 :         if ( Opt_vbr_mode != 0 )
     450             :         {
     451           0 :             lp_E = L_max( lp_E, 0 ); // q_lp_E
     452             :         }
     453             :         /*ee[i] = lp_E / hp_E[i];*/ /* LF/HF ratio */
     454             : 
     455     2222388 :         if ( lp_E == 0 )
     456             :         {
     457           0 :             ee[i] = 0;
     458           0 :             move32();
     459             :         }
     460     2222388 :         test();
     461     2222388 :         IF( lp_E != 0 )
     462             :         {
     463     2222388 :             e_tmp = sub( norm_l( lp_E ), 1 );
     464     2222388 :             m_tmp = extract_h( L_shl( lp_E, e_tmp ) ); // e_tmp+q_lp_E-16
     465     2222388 :             e_hpE = norm_l( hp_E[i] );
     466     2222388 :             m_hpE = extract_h( L_shl( hp_E[i], e_hpE ) ); // e_hpE+q_bckr-16
     467     2222388 :             m_tmp = div_s( m_tmp, m_hpE );                // Q15+(e_tmp+q_lp_E)-(e_hpE+q_bckr)
     468     2222388 :             e_tmp = sub( add( e_tmp, q_lp_E ), add( e_hpE, q_bckr ) );
     469     2222388 :             ee[i] = L_shr_o( m_tmp, add( e_tmp, 15 - 6 ), &Overflow ); /* ee in Q6 */
     470     2222388 :             move32();
     471             :         }
     472             : 
     473     2222388 :         IF( bwidth == NB ) /* For NB input, compensate for the missing bands */
     474             :         {
     475        8580 :             Ltmp = L_shl_o( ee[i], 3, &Overflow ); /* Q6 */
     476        8580 :             IF( EQ_32( Ltmp, MAX_32 ) )            /* if Overflow: Compute with less precision */
     477             :             {
     478           0 :                 Ltmp = Mult_32_16( ee[i], 24576 /* 0.75 in Q15 */ ); /* 6/8     Q6*/
     479           0 :                 ee[i] = L_shl_sat( Ltmp, 3 );                        /* Q6 */
     480           0 :                 move32();                                            /* x8  */
     481             :             }
     482             :             ELSE
     483             :             {
     484        8580 :                 ee[i] = Mult_32_16( Ltmp, 24576 /* 0.75 in Q15 */ );
     485        8580 :                 move32(); /* 6/8  */
     486             :             }
     487             :         }
     488             : 
     489     2222388 :         pt_bands += NB_BANDS; /* Update for next half-frame */
     490     2222388 :         hf_bands += NB_BANDS;
     491             :     }
     492             : 
     493     1111194 :     return;
     494             : }

Generated by: LCOV version 1.14