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

Generated by: LCOV version 1.14