LCOV - code coverage report
Current view: top level - lib_enc - find_tilt_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main @ e95243e9e67ddeb69dddf129509de1b3d95b402e Lines: 208 236 88.1 %
Date: 2025-09-14 03:13:15 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             : #ifndef ISSUE_1867_replace_overflow_libenc
      48             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
      49             :     Flag Overflow = 0;
      50             :     move32();
      51             : #endif
      52             : #endif
      53             :     /*-----------------------------------------------------------------*
      54             :      * Initializations
      55             :      *-----------------------------------------------------------------*/
      56             : 
      57        3100 :     scaling = add( Q_new, QSCALE );
      58        3100 :     IF( NE_16( bwidth, NB ) )
      59             :     {
      60             :         /* WB processing */
      61        3100 :         bin = BIN4_FX;
      62        3100 :         move16();            /* First useful frequency bin ~ 50 Hz     */
      63        3100 :         pt_bands = fr_bands; /* Q_new + QSCALE */
      64        3100 :         tmp_E = lf_E;        /* Q_new + QSCALE - 2 */
      65        3100 :         pt_bckr = bckr;      /* Q_new + QSCALE */
      66        3100 :         nb_bands = 10;
      67        3100 :         move16();
      68             :     }
      69             :     ELSE
      70             :     {
      71             :         /* NB processing */
      72           0 :         bin = add( shl( BIN4_FX, 1 ), BIN4_FX ); /* First useful frequency bin ~ 150 Hz    */
      73           0 :         pt_bands = fr_bands + 1;                 /* Exlcude 1st critical band              Q_new + QSCALE*/
      74           0 :         tmp_E = lf_E + 2;                        /* Start at the 3rd bin (150 Hz)          Q_new + QSCALE - 2*/
      75           0 :         pt_bckr = bckr + 1;                      /* Exlcude 1st critical band              Q_new + QSCALE*/
      76           0 :         nb_bands = 9;
      77           0 :         move16(); /* Nb. of "low" frequency bands taken into account in NB processing      */
      78             :     }
      79             : 
      80             :     /*-----------------------------------------------------------------*
      81             :      * Find spectrum tilt
      82             :      *-----------------------------------------------------------------*/
      83             : 
      84        3100 :     pt_E = tmp_E;        /* Point at the 1st useful element of the per-bin energy vector  */
      85        3100 :     hf_bands = fr_bands; /* Q_new + QSCALE */
      86             : 
      87             :     /* bckr + voicing */
      88             :     /*lp_bckr = mean( pt_bckr, nb_bands );*/ /* estimated noise E in first critical bands, up to 1270 Hz */
      89        3100 :     lp_bckr = Mean32( pt_bckr, nb_bands );
      90             :     /*hp_bckr = 0.5f * (bckr[max_band-1] + bckr[max_band]);*/              /* estimated noise E in last 2 critical bands */
      91        3100 :     hp_bckr = L_shr( L_add_sat( bckr[max_band - 1], bckr[max_band] ), 1 ); /* Q_new + QSCALE - 1 */
      92        3100 :     if ( hp_bckr == 0 )                                                    /* Avoid division by zero. */
      93             :     {
      94           0 :         hp_bckr = L_deposit_l( 1 );
      95             :     }
      96        3100 :     tmp = BASOP_Util_Divide3232_Scale( lp_bckr, hp_bckr, &e_tmp );
      97             : 
      98        3100 :     Ltmp = L_shr_r_sat( L_deposit_h( tmp ), sub( 15, e_tmp ) );
      99             : 
     100        3100 :     *bckr_tilt_lt = L_add( Mpy_32_16_r( *bckr_tilt_lt, 29491 ), Mpy_32_16_r( Ltmp, 3277 ) ); /* Q16 */
     101             : 
     102        3100 :     test();
     103        3100 :     IF( EQ_16( codec_mode, MODE2 ) || Opt_vbr_mode == 1 )
     104             :     {
     105             :         /*lp_bckr *= FACT;*/
     106             :         /*hp_bckr *= FACT;*/
     107        1050 :         lp_bckr = L_add_sat( L_shl_sat( lp_bckr, 1 ), lp_bckr ); /* Q_new + QSCALE */
     108        1050 :         hp_bckr = L_add_sat( L_shl_sat( hp_bckr, 1 ), hp_bckr );
     109             :     }
     110             :     /*mean_voi = 0.5f * (voicing[1] + voicing[2]) + corr_shift;*/
     111        3100 :     Ltmp = L_mult( voicing[1], 16384 /* 0.5 in Q15 */ );      /* Q31 */
     112        3100 :     Ltmp = L_mac( Ltmp, voicing[2], 16384 /* 0.5 in Q15 */ ); /* Q31 */
     113             : #ifdef ISSUE_1867_replace_overflow_libenc
     114        3100 :     Ltmp = L_mac_sat( Ltmp, corr_shift, 32767 ); /* Q31 */
     115        3100 :     mean_voi = round_fx_sat( Ltmp );             /* Q15 */
     116             : #else
     117             :     Ltmp = L_mac_o( Ltmp, corr_shift, 32767, &Overflow );         /* Q31 */
     118             :     mean_voi = round_fx_o( Ltmp, &Overflow );                     /* Q15 */
     119             : #endif
     120             : 
     121             :     /*f0 = INT_FS_FX / pitch[2];*/
     122        3100 :     e_tmp = norm_s( pitch[2] );
     123        3100 :     m_tmp = shl( pitch[2], e_tmp );
     124             : 
     125        3100 :     m_Fs = div_s( INT_FS_FX, m_tmp ); /* exp(e_tmp) */
     126        3100 :     e_Fs = sub( 15, e_tmp );
     127        3100 :     f0 = shr( m_Fs, sub( e_Fs, 4 ) ); /* Q4 */
     128             : 
     129        9300 :     FOR( i = 0; i < 2; i++ )
     130             :     {
     131             :         /*hp_E[i] = 0.5f * (hf_bands[max_band-1] + hf_bands[max_band]) - hp_bckr; */        /* averaged E in last 2 critical bands */
     132        6200 :         Ltmp = L_add( L_shr( hf_bands[max_band - 1], 1 ), L_shr( hf_bands[max_band], 1 ) ); /* Q_new + QSCALE */
     133        6200 :         hp_E[i] = L_sub( Ltmp, hp_bckr );                                                   /* Q_new + QSCALE */
     134        6200 :         IF( Opt_vbr_mode == 0 )
     135             :         {
     136        6200 :             hp_E[i] = L_max( hp_E[i], L_shl( E_MIN_FX, Q_new ) ); /* Q_new + QSCALE */
     137        6200 :             move32();
     138             :         }
     139             :         ELSE
     140             :         {
     141           0 :             hp_E[i] = L_max( hp_E[i], L_shl( 1, scaling ) ); /* Q_new + QSCALE */
     142           0 :             move32();
     143             :         }
     144             : 
     145        6200 :         test();
     146        6200 :         IF( GT_16( mean_voi, TH_COR_FX ) && LT_16( pitch[2], TH_PIT_FX ) ) /* High-pitched voiced frames */
     147             :         {
     148        4448 :             freq = bin;
     149        4448 :             move16(); /* 1st useful frequency bin */
     150        4448 :             m_cnt = 0;
     151        4448 :             move16();
     152        4448 :             lp_E = L_deposit_l( 0 );
     153             : 
     154        4448 :             f1 = add( shr( f0, 1 ), f0 ); /* Middle between 2 harmonics */
     155        4448 :             f2 = f0;
     156        4448 :             move16();
     157       30284 :             WHILE( LE_16( freq, 20320 ) ) /* End frequency of 10th critical band */
     158             :             {
     159      146622 :                 FOR( ; freq <= f1; freq += BIN4_FX )
     160             :                 {
     161             :                     /* include only bins sufficiently close to harmonics */
     162      120786 :                     tmp = sub( freq, f2 );
     163      120786 :                     IF( L_mac0( -(Word32) TH_D_FX * TH_D_FX, tmp, tmp ) < 0 )
     164             :                     {
     165             : #ifdef ISSUE_1867_replace_overflow_libenc
     166       50084 :                         lp_E = L_add_sat( *pt_E, lp_E ); /* Q_new + QSCALE - 2 */
     167             : #else
     168             :                         lp_E = L_add_o( *pt_E, lp_E, &Overflow ); /* Q_new + QSCALE - 2 */
     169             : #endif
     170       50084 :                         m_cnt = add( m_cnt, 1 ); /* Q0 */
     171             :                     }
     172      120786 :                     pt_E++;
     173             :                 }
     174             : #ifdef ISSUE_1867_replace_overflow_libenc
     175       25836 :                 f1 = add_sat( f1, f0 );
     176       25836 :                 f2 = add_sat( f2, f0 );
     177             : #else
     178             :                 f1 = add_o( f1, f0, &Overflow );
     179             :                 f2 = add_o( f2, f0, &Overflow );
     180             : #endif
     181             :             }
     182             :             /*lp_E = lp_E / (float)cnt - lp_bckr;*/
     183        4448 :             e_tmp = sub( norm_l( lp_E ), 1 );
     184        4448 :             m_tmp = extract_h( L_shl( lp_E, e_tmp ) );
     185             : 
     186        4448 :             e_tmp = sub( e_tmp, 2 ); /* lf_e divided by 4 in anal_sp */
     187             : 
     188        4448 :             e_cnt = norm_s( m_cnt );
     189        4448 :             m_cnt = shl( m_cnt, e_cnt );
     190             : 
     191        4448 :             m_tmp = div_s( m_tmp, m_cnt ); /* exp(e_tmp + e_cnt) */
     192        4448 :             e_tmp = sub( e_tmp, e_cnt );
     193             : 
     194             : #ifdef ISSUE_1867_replace_overflow_libenc
     195        4448 :             lp_E = L_sub_sat( L_shr_sat( m_tmp, sub( e_tmp, 1 ) ), lp_bckr ); /* Q_new + QSCALE */
     196             : #else
     197             :             lp_E = L_sub_o( L_shr_sat( m_tmp, sub( e_tmp, 1 ) ), lp_bckr, &Overflow ); /* Q_new + QSCALE */
     198             : #endif
     199             : 
     200        4448 :             pt_E = tmp_E + VOIC_BINS; /* Update for next half-frame */
     201             :         }
     202             :         ELSE /* Other than high-pitched voiced frames */
     203             :         {
     204             :             /*lp_E = mean( pt_bands, nb_bands ) - lp_bckr;*/       /* averaged E in first critical bands, up to 1270 Hz */
     205        1752 :             lp_E = L_sub( Mean32( pt_bands, nb_bands ), lp_bckr ); /* Q_new + QSCALE */
     206             :         }
     207        6200 :         IF( Opt_vbr_mode == 0 )
     208             :         {
     209        6200 :             lp_E = L_max( lp_E, L_shl( E_MIN_FX, Q_new ) );
     210             :         }
     211             :         ELSE
     212             :         {
     213           0 :             lp_E = L_max( lp_E, 0 );
     214             :         }
     215             :         /*ee[i] = lp_E / hp_E[i];*/ /* LF/HF ratio */
     216        6200 :         test();
     217        6200 :         IF( lp_E != 0 && hp_E[i] != 0 )
     218             :         {
     219        6200 :             e_tmp = sub( norm_l( lp_E ), 1 );
     220        6200 :             m_tmp = extract_h( L_shl( lp_E, e_tmp ) );
     221        6200 :             e_hpE = norm_l( hp_E[i] );
     222        6200 :             m_hpE = extract_h( L_shl( hp_E[i], e_hpE ) );
     223        6200 :             m_tmp = div_s( m_tmp, m_hpE ); /* exp(e_tmp + e_hpE) */
     224        6200 :             e_tmp = sub( e_tmp, e_hpE );
     225             : 
     226        6200 :             ee[i] = L_shr_sat( m_tmp, add( e_tmp, 15 - 6 ) ); /* ee in Q6 */
     227             :         }
     228           0 :         ELSE IF( lp_E == 0 )
     229             :         {
     230           0 :             ee[i] = L_deposit_l( 0 );
     231             :         }
     232             :         ELSE
     233             :         {
     234           0 :             ee[i] = MAX_32;
     235             :         }
     236             : 
     237        6200 :         IF( EQ_16( bwidth, NB ) ) /* For NB input, compensate for the missing bands */
     238             :         {
     239             : #ifdef ISSUE_1867_replace_overflow_libenc
     240           0 :             Ltmp = L_shl_sat( ee[i], 3 );
     241             : #else
     242             :             Ltmp = L_shl_o( ee[i], 3, &Overflow );
     243             : #endif
     244           0 :             IF( EQ_32( Ltmp, MAX_32 ) ) /* if Overflow: Compute with less precision */
     245             :             {
     246           0 :                 Ltmp = Mult_32_16( ee[i], 24576 /* 0.75 in Q15 */ ); /* 6/8             Q6*/
     247           0 :                 ee[i] = L_shl_sat( Ltmp, 3 );
     248           0 :                 move32(); /* x8  */
     249             :             }
     250             :             ELSE
     251             :             {
     252           0 :                 ee[i] = Mult_32_16( Ltmp, 24576 /* 0.75 in Q15 */ ); /* Q6 */
     253           0 :                 move32();                                            /* 6/8  */
     254             :             }
     255             :         }
     256             : 
     257        6200 :         pt_bands += NB_BANDS; /* Update for next half-frame */
     258        6200 :         hf_bands += NB_BANDS;
     259             :     }
     260             : 
     261        3100 :     return;
     262             : }
     263             : 
     264             : /*-------------------------------------------------------------------*
     265             :  * find_tilt()
     266             :  *
     267             :  * Find LF/HF energy ratio
     268             :  *-------------------------------------------------------------------*/
     269     1132964 : void find_tilt_ivas_fx(
     270             :     const Word32 fr_bands[], /* i  : energy in frequency bands                                          q_fr_bands*/
     271             :     const Word16 q_fr_bands, /* i  : Q of fr_bands                                              Q0*/
     272             :     const Word32 bckr[],     /* i  : per band background noise energy estimate    q_bckr*/
     273             :     const Word16 q_bckr,     /* i  : Q of bckr    Q0*/
     274             :     Word32 ee[2],            /* o  : lf/hf E ration for present frame                                                    Q6*/
     275             :     const Word16 pitch[3],   /* i  : open loop pitch values for 3 half-frames                                    Q0*/
     276             :     const Word16 voicing[3], /* i  : normalized correlation for 3 half-frames                                   Q15*/
     277             :     const Word32 *lf_E,      /* i  : per bin energy  for low frequencies         q_lf_E*/
     278             :     const Word16 q_lf_E,     /* i  : Q of lf_E         */
     279             :     const Word16 corr_shift, /* i  : normalized correlation correction                                                  Q15*/
     280             :     const Word16 bwidth,     /* i  : input signal bandwidth                                         */
     281             :     const Word16 max_band,   /* i  : maximum critical band                                          */
     282             :     Word32 hp_E[],           /* o  : energy in HF                                    Q_new*/
     283             :     const Word16 codec_mode, /* i  : MODE1 or MODE2                                      */
     284             :     Word32 *bckr_tilt_lt,    /* i/o: lf/hf E ratio of background noise  Q16                        */
     285             :     Word16 Opt_vbr_mode )
     286             : {
     287     1132964 :     Word32 lp_bckr = 0, hp_bckr = 0, lp_E, Ltmp;
     288             :     const Word32 *pt_E, *pt_bands, *pt_bckr, *hf_bands, *tmp_E;
     289             :     Word16 tmp, freq, f0, f1, f2, mean_voi, bin;
     290             :     Word16 i, nb_bands;
     291             :     Word16 e_tmp, m_tmp;
     292             :     Word16 m_Fs, e_Fs;
     293             :     Word16 m_cnt, e_cnt;
     294             :     Word16 m_hpE, e_hpE;
     295             :     Word64 sum;
     296             :     Word16 inv_bands, q_lp_E;
     297             :     Word32 Le_min_scaled, Ltmp2;
     298             : #ifndef ISSUE_1867_replace_overflow_libenc
     299             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
     300             :     Flag Overflow = 0;
     301             :     move32();
     302             : #endif
     303             : #endif
     304     1132964 :     move32();
     305     1132964 :     move32();
     306             :     /*-----------------------------------------------------------------*
     307             :      * Initializations
     308             :      *-----------------------------------------------------------------*/
     309             : 
     310     1132964 :     IF( ( bwidth != NB ) )
     311             :     {
     312             :         /* WB processing */
     313     1128674 :         bin = BIN4_FX;
     314     1128674 :         move16();            /* First useful frequency bin ~ 50 Hz     */
     315     1128674 :         pt_bands = fr_bands; /* Q_new */
     316     1128674 :         tmp_E = lf_E;        /* Q_new - 2 */
     317     1128674 :         pt_bckr = bckr;      /* Q_new */
     318     1128674 :         nb_bands = 10;
     319     1128674 :         inv_bands = 3277 /* 1/10 in Q15 */;
     320     1128674 :         move16();
     321     1128674 :         move16();
     322             :     }
     323             :     ELSE
     324             :     {
     325             :         /* NB processing */
     326        4290 :         bin = 3 * BIN4_FX;       /* First useful frequency bin ~ 150 Hz    */
     327        4290 :         pt_bands = fr_bands + 1; /* Exlcude 1st critical band              */
     328        4290 :         tmp_E = lf_E + 2;        /* Start at the 3rd bin (150 Hz)          */
     329        4290 :         pt_bckr = bckr + 1;      /* Exlcude 1st critical band              */
     330        4290 :         nb_bands = 9;
     331        4290 :         inv_bands = 3641; /* 1/9 in Q15 */
     332        4290 :         move16();
     333        4290 :         move16(); /* Nb. of "low" frequency bands taken into account in NB processing      */
     334             :     }
     335             : 
     336             :     /*-----------------------------------------------------------------*
     337             :      * Find spectrum tilt
     338             :      *-----------------------------------------------------------------*/
     339             : 
     340     1132964 :     pt_E = tmp_E; /* Point at the 1st useful element of the per-bin energy vector  */
     341     1132964 :     hf_bands = fr_bands;
     342             : 
     343             :     /* bckr + voicing */
     344             :     /*lp_bckr = mean( pt_bckr, nb_bands );*/ /* estimated noise E in first critical bands, up to 1270 Hz */
     345     1132964 :     sum = 0;
     346     1132964 :     move64();
     347    12458314 :     FOR( i = 0; i < nb_bands; i++ )
     348             :     {
     349    11325350 :         sum = W_mac_32_16( sum, pt_bckr[i], inv_bands ); // q_bckr+16
     350             :     }
     351     1132964 :     lp_bckr = W_shl_sat_l( sum, -16 );                                                                                   // q_bckr
     352             :     /*hp_bckr = 0.5f * (bckr[max_band-1] + bckr[max_band]);*/                                                            /* estimated noise E in last 2 critical bands */
     353     1132964 :     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
     354     1132964 :     if ( hp_bckr == 0 )                                                                                                  /* Avoid division by zero. */
     355             :     {
     356        2548 :         hp_bckr = L_deposit_l( 1 );
     357             :     }
     358     1132964 :     Ltmp = BASOP_Util_Divide3232_Scale_newton( lp_bckr, hp_bckr, &e_tmp );
     359     1132964 :     Ltmp = Mpy_32_16_r( Ltmp, 3277 /* 0.1f in Q15 */ );
     360     1132964 :     Ltmp = L_shr_sat( Ltmp, sub( 15, e_tmp ) );
     361     1132964 :     *bckr_tilt_lt = L_add_sat( Mpy_32_16_r( *bckr_tilt_lt, 29491 /* 0.9f in Q15 */ ), Ltmp ); // Q16
     362     1132964 :     move32();
     363             : 
     364     1132964 :     test();
     365     1132964 :     IF( EQ_16( codec_mode, MODE2 ) || EQ_16( Opt_vbr_mode, 1 ) )
     366             :     {
     367             :         /*lp_bckr *= FACT;*/
     368             :         /*hp_bckr *= FACT;*/
     369           0 :         lp_bckr = L_add_sat( L_shl_sat( lp_bckr, 1 ), lp_bckr ); /* Q_new */
     370           0 :         hp_bckr = L_add_sat( L_shl_sat( hp_bckr, 1 ), hp_bckr ); /* Q_new */
     371             :     }
     372             :     /*mean_voi = 0.5f * (voicing[1] + voicing[2]) + corr_shift;*/
     373     1132964 :     Ltmp = L_mult( voicing[1], 16384 /* 0.5 in Q15 */ );      // Q31
     374     1132964 :     Ltmp = L_mac( Ltmp, voicing[2], 16384 /* 0.5 in Q15 */ ); // Q31
     375             : #ifdef ISSUE_1867_replace_overflow_libenc
     376     1132964 :     Ltmp = L_mac_sat( Ltmp, corr_shift, 32767 /* 1.0f in Q15 */ ); // Q31
     377     1132964 :     mean_voi = round_fx_sat( Ltmp );                               // Q15
     378             : #else
     379             :     Ltmp = L_mac_o( Ltmp, corr_shift, 32767 /* 1.0f in Q15 */, &Overflow ); // Q31
     380             :     mean_voi = round_fx_o( Ltmp, &Overflow );                               // Q15
     381             : #endif
     382             : 
     383             :     /*f0 = INT_FS_FX / pitch[2];*/
     384     1132964 :     e_tmp = norm_s( pitch[2] );
     385     1132964 :     m_tmp = shl( pitch[2], e_tmp );
     386             : 
     387     1132964 :     m_Fs = div_s( INT_FS_FX, m_tmp ); /* exp(e_tmp) */
     388     1132964 :     e_Fs = sub( 15, e_tmp );
     389     1132964 :     f0 = shr( m_Fs, sub( e_Fs, 4 ) ); /* Q4 */
     390             : 
     391     1132964 :     Le_min_scaled = L_shl( E_MIN_FXQ31, sub( q_fr_bands, Q31 ) ); // q_fr_bands=q_bckr
     392             : 
     393     3398892 :     FOR( i = 0; i < 2; i++ )
     394             :     {
     395             :         /*hp_E[i] = 0.5f * (hf_bands[max_band-1] + hf_bands[max_band]) - hp_bckr; */                                              /* averaged E in last 2 critical bands */
     396     2265928 :         Ltmp = W_extract_h( W_shl( W_add( W_deposit32_l( hf_bands[max_band - 1] ), W_deposit32_l( hf_bands[max_band] ) ), 31 ) ); // q_fr_bands
     397     2265928 :         Ltmp = L_sub( Ltmp, hp_bckr );                                                                                            // q_fr_bands
     398             : 
     399     2265928 :         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
     400     2265928 :         if ( Opt_vbr_mode == 0 )
     401             :         {
     402     2265928 :             Ltmp2 = L_max( Ltmp, Le_min_scaled ); // q_fr_bands
     403             :         }
     404     2265928 :         hp_E[i] = L_max( Ltmp2, 1 ); // to prevent division by zero
     405     2265928 :         move32();
     406             : 
     407     2265928 :         test();
     408     2265928 :         IF( GT_16( mean_voi, TH_COR_FX ) && LT_16( pitch[2], TH_PIT_FX ) ) /* High-pitched voiced frames */
     409             :         {
     410     1238390 :             freq = bin; // Q4
     411     1238390 :             move16();   /* 1st useful frequency bin */
     412     1238390 :             m_cnt = 0;
     413     1238390 :             move16();
     414     1238390 :             sum = 0;
     415     1238390 :             move64();
     416             : 
     417     1238390 :             f1 = add( shr( f0, 1 ), f0 ); /* Middle between 2 harmonics */
     418     1238390 :             f2 = f0;
     419     1238390 :             move16();
     420     8857270 :             WHILE( LE_16( freq, 20320 /* 1270.0f in Q4 */ ) ) /* End frequency of 10th critical band */
     421             :             {
     422    40973580 :                 FOR( ; freq <= f1; freq += BIN4_FX )
     423             :                 {
     424             :                     /* include only bins sufficiently close to harmonics */
     425    33354700 :                     tmp = sub( freq, f2 );
     426    33354700 :                     IF( L_mac0( -TH_D_FX * TH_D_FX, tmp, tmp ) < 0 )
     427             :                     {
     428    14983368 :                         sum = W_mac_32_16( sum, *pt_E, 1 ); // q_lf_E+1
     429    14983368 :                         m_cnt = add( m_cnt, 1 );
     430             :                     }
     431    33354700 :                     pt_E++;
     432             :                 }
     433             : #ifdef ISSUE_1867_replace_overflow_libenc
     434     7618880 :                 f1 = add_sat( f1, f0 );
     435     7618880 :                 f2 = add_sat( f2, f0 );
     436             : #else
     437             :                 f1 = add_o( f1, f0, &Overflow );
     438             :                 f2 = add_o( f2, f0, &Overflow );
     439             : #endif
     440             :             }
     441             :             /*lp_E = lp_E / (float)cnt - lp_bckr;*/
     442     1238390 :             e_tmp = sub( W_norm( sum ), 1 );
     443     1238390 :             m_tmp = extract_h( W_extract_h( W_shl( sum, e_tmp ) ) ); // q_lf_E+1+e_tmp-32-16
     444     1238390 :             e_tmp = sub( add( q_lf_E, e_tmp ), 47 );
     445             : 
     446     1238390 :             e_cnt = norm_s( m_cnt );
     447     1238390 :             m_cnt = shl( m_cnt, e_cnt ); // e_cnt
     448             : 
     449     1238390 :             m_tmp = div_s( m_tmp, m_cnt ); // Q15+e_tmp-e_cnt
     450     1238390 :             e_tmp = add( Q15, sub( e_tmp, e_cnt ) );
     451     1238390 :             sum = W_shl( m_tmp, sub( add( q_bckr, 1 ), e_tmp ) ); // q_bckr+1
     452     1238390 :             sum = W_msu_32_16( sum, lp_bckr, 1 );                 // q_bckr+1
     453     1238390 :             q_lp_E = W_norm( sum );
     454     1238390 :             lp_E = W_extract_h( W_shl( sum, q_lp_E ) ); // q_bckr+1+q_lp_E-32
     455     1238390 :             q_lp_E = sub( add( q_lp_E, q_bckr ), Q31 );
     456             : 
     457     1238390 :             pt_E = tmp_E + VOIC_BINS; /* Update for next half-frame             Q_new - 1 */
     458             :         }
     459             :         ELSE /* Other than high-pitched voiced frames */
     460             :         {
     461             :             /*lp_E = mean( pt_bands, nb_bands ) - lp_bckr;*/ /* averaged E in first critical bands, up to 1270 Hz */
     462     1027538 :             sum = 0;
     463     1027538 :             move64();
     464    11300478 :             FOR( Word16 j = 0; j < nb_bands; j++ )
     465             :             {
     466    10272940 :                 sum = W_mac_32_16( sum, pt_bands[j], inv_bands ); // q_fr_bands+16
     467             :             }
     468     1027538 :             sum = W_mac_32_16( sum, lp_bckr, -ONE_IN_Q15 ); // q_fr_bands+16
     469     1027538 :             lp_E = W_round48_L( sum );                      // q_fr_bands=q_bckr
     470     1027538 :             q_lp_E = q_bckr;                                // q_fr_bands=q_bckr
     471     1027538 :             move16();
     472             :         }
     473     2265928 :         test();
     474     2265928 :         IF( Opt_vbr_mode == 0 && GT_32( L_shl_sat( Le_min_scaled, sub( q_lp_E, q_bckr ) ), lp_E ) )
     475             :         {
     476      296201 :             lp_E = E_MIN_FXQ31;
     477      296201 :             q_lp_E = Q31;
     478      296201 :             move32();
     479      296201 :             move16();
     480             :         }
     481     2265928 :         if ( Opt_vbr_mode != 0 )
     482             :         {
     483           0 :             lp_E = L_max( lp_E, 0 ); // q_lp_E
     484             :         }
     485             :         /*ee[i] = lp_E / hp_E[i];*/ /* LF/HF ratio */
     486             : 
     487     2265928 :         if ( lp_E == 0 )
     488             :         {
     489           0 :             ee[i] = 0;
     490           0 :             move32();
     491             :         }
     492     2265928 :         test();
     493     2265928 :         IF( lp_E != 0 )
     494             :         {
     495     2265928 :             e_tmp = sub( norm_l( lp_E ), 1 );
     496     2265928 :             m_tmp = extract_h( L_shl( lp_E, e_tmp ) ); // e_tmp+q_lp_E-16
     497     2265928 :             e_hpE = norm_l( hp_E[i] );
     498     2265928 :             m_hpE = extract_h( L_shl( hp_E[i], e_hpE ) ); // e_hpE+q_bckr-16
     499     2265928 :             m_tmp = div_s( m_tmp, m_hpE );                // Q15+(e_tmp+q_lp_E)-(e_hpE+q_bckr)
     500     2265928 :             e_tmp = sub( add( e_tmp, q_lp_E ), add( e_hpE, q_bckr ) );
     501     2265928 :             ee[i] = L_shr_sat( m_tmp, add( e_tmp, 15 - 6 ) ); /* ee in Q6 */
     502     2265928 :             move32();
     503             :         }
     504             : 
     505     2265928 :         IF( bwidth == NB ) /* For NB input, compensate for the missing bands */
     506             :         {
     507             : #ifdef ISSUE_1867_replace_overflow_libenc
     508        8580 :             Ltmp = L_shl_sat( ee[i], 3 ); /* Q6 */
     509             : #else
     510             :             Ltmp = L_shl_o( ee[i], 3, &Overflow ); /* Q6 */
     511             : #endif
     512        8580 :             IF( EQ_32( Ltmp, MAX_32 ) ) /* if Overflow: Compute with less precision */
     513             :             {
     514           0 :                 Ltmp = Mult_32_16( ee[i], 24576 /* 0.75 in Q15 */ ); /* 6/8     Q6*/
     515           0 :                 ee[i] = L_shl_sat( Ltmp, 3 );                        /* Q6 */
     516           0 :                 move32();                                            /* x8  */
     517             :             }
     518             :             ELSE
     519             :             {
     520        8580 :                 ee[i] = Mult_32_16( Ltmp, 24576 /* 0.75 in Q15 */ );
     521        8580 :                 move32(); /* 6/8  */
     522             :             }
     523             :         }
     524             : 
     525     2265928 :         pt_bands += NB_BANDS; /* Update for next half-frame */
     526     2265928 :         hf_bands += NB_BANDS;
     527             :     }
     528             : 
     529     1132964 :     return;
     530             : }

Generated by: LCOV version 1.14