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

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Aug 12, 2021. Version 16.3.0
       3             :   ====================================================================================*/
       4             : 
       5             : #include <stdint.h>
       6             : #include "options.h"
       7             : #include "basop_util.h"
       8             : #include "vad_basop.h"
       9             : //#include "prot_fx.h"
      10             : #include "rom_enc.h"
      11             : #include "prot_fx.h"     /* Function prototypes                    */
      12             : #include "prot_fx_enc.h" /* Function prototypes                    */
      13             : 
      14             : /*-------------------------------------------------------------------*
      15             :  * spec_center_fx()
      16             :  *
      17             :  *
      18             :  *-------------------------------------------------------------------*/
      19             : 
      20        3100 : void spec_center_fx(
      21             :     Word32 *sb_power,      /* i  : energy of sub-band divided uniformly         Q31 */
      22             :     Word16 *sp_center,     /* o  : spectral center      Q10 */
      23             :     const Word32 bw_index, /* i  : band width   Q0 */
      24             :     const Word16 Q_sb_p    /* i  : the Scaling of sb_power*/
      25             : )
      26             : {
      27             :     Word16 i;
      28             : 
      29             :     Word32 t_sp_center, frame_power;
      30             :     Word32 t_sp_center_num, frame_power_den;
      31             :     Word32 sb_power_mlt;
      32             :     Word32 t_sp_center_nb, frame_power_nb;
      33             :     Word32 zerop1;
      34             :     Word32 sb_power_shr[24];
      35             : 
      36             :     Word16 d_t_sp_center;
      37             :     Word16 Q_t_sp_center, Q_frame_power;
      38             :     Word16 Q_t_sc, Q_f_p;
      39             :     Word16 d_t_sp_center_Qtmp;
      40             : 
      41             : 
      42        3100 :     zerop1 = 0;
      43        3100 :     move32();
      44        3100 :     t_sp_center = 0;
      45        3100 :     move32();
      46        3100 :     frame_power = 0;
      47        3100 :     move32();
      48             : 
      49       34100 :     FOR( i = 0; i < 10; i++ )
      50             :     {
      51       31000 :         sb_power_shr[i] = L_shr( sb_power[i], 5 ); /* Q26 */
      52       31000 :         move32();
      53             :     }
      54             : 
      55       34100 :     FOR( i = 0; i < 10; i++ )
      56             :     {
      57       31000 :         sb_power_mlt = Mpy_32_16_1( sb_power[i], i_t_1[i] );          /* Q16 + QB */
      58       31000 :         t_sp_center = L_add( L_shr( sb_power_mlt, 6 ), t_sp_center ); /* Q11 + QB */
      59       31000 :         frame_power = L_add( sb_power_shr[i], frame_power ); /*0-9 */ /* Q26 */
      60             :     }
      61             : 
      62        3100 :     t_sp_center_nb = t_sp_center;
      63        3100 :     move32();
      64        3100 :     frame_power_nb = frame_power;
      65        3100 :     move32();
      66             : 
      67             :     /*+0.1      */
      68        3100 :     Q_t_sc = sub( Q_sb_p, 10 );
      69        3100 :     IF( GE_16( Q_t_sc, 34 ) )
      70             :     {
      71           6 :         t_sp_center = L_shr( t_sp_center, sub( Q_t_sc, 33 ) ); /* Q44 + QB - Q_t_sc)*/
      72           6 :         zerop1 = CNT0P1 >> 1;                                  /* Q33 */
      73           6 :         move32();
      74           6 :         Q_t_sc = 33;
      75           6 :         move16();
      76             :     }
      77             :     ELSE
      78             :     {
      79        3094 :         Q_t_sc = sub( Q_t_sc, 1 );                   /* Q_t_sc - 1 */
      80        3094 :         t_sp_center = L_shr( t_sp_center, 1 );       /* Q10 + QB */
      81        3094 :         zerop1 = L_shr( CNT0P1, sub( 34, Q_t_sc ) ); /* Q_t_sc */
      82             :     }
      83        3100 :     t_sp_center_num = L_add( t_sp_center, zerop1 );
      84             : 
      85        3100 :     Q_f_p = sub( Q_sb_p, 5 );
      86        3100 :     IF( GE_16( Q_f_p, 34 ) )
      87             :     {
      88          21 :         frame_power = L_shr( frame_power, sub( Q_f_p, 33 ) );
      89          21 :         zerop1 = ( CNT0P1 >> 1 );
      90          21 :         move32();
      91          21 :         Q_f_p = 33;
      92          21 :         move16();
      93             :     }
      94             :     ELSE
      95             :     {
      96        3079 :         Q_f_p = sub( Q_f_p, 1 );
      97        3079 :         frame_power = L_shr( frame_power, 1 );
      98        3079 :         zerop1 = L_shr( CNT0P1, sub( 34, Q_f_p ) );
      99             :     }
     100             : 
     101        3100 :     frame_power_den = L_add( frame_power, zerop1 );
     102        3100 :     IF( frame_power == 0 )
     103             :     {
     104           0 :         frame_power_den = CNT0P1;
     105           0 :         move32();
     106           0 :         Q_f_p = 34;
     107           0 :         move16();
     108             :     }
     109             :     /*div */
     110        3100 :     Q_t_sp_center = sub( norm_l( t_sp_center_num ), 1 );
     111        3100 :     Q_frame_power = norm_l( frame_power_den );
     112        3100 :     t_sp_center_num = L_shl( t_sp_center_num, Q_t_sp_center );
     113        3100 :     frame_power_den = L_shl( frame_power_den, Q_frame_power );
     114             : 
     115        3100 :     d_t_sp_center = div_l( t_sp_center_num, extract_h( frame_power_den ) );
     116             : 
     117        3100 :     d_t_sp_center_Qtmp = add( Q_t_sc, Q_t_sp_center );
     118        3100 :     d_t_sp_center_Qtmp = sub( d_t_sp_center_Qtmp, Q_frame_power );
     119        3100 :     d_t_sp_center_Qtmp = sub( d_t_sp_center_Qtmp, Q_f_p );
     120        3100 :     d_t_sp_center_Qtmp = add( d_t_sp_center_Qtmp, 15 );
     121        3100 :     d_t_sp_center_Qtmp = sub( d_t_sp_center_Qtmp, SP_CENTER_Q );
     122             : 
     123        3100 :     d_t_sp_center = shr( d_t_sp_center, d_t_sp_center_Qtmp );
     124        3100 :     sp_center[0] = add( mult( sp_center[0], 0x5999 ), mult( d_t_sp_center, 0x2666 ) );
     125        3100 :     sp_center[2] = d_t_sp_center;
     126        3100 :     move16();
     127        3100 :     move16();
     128             : 
     129        3100 :     t_sp_center = 0;
     130        3100 :     move32();
     131        3100 :     frame_power = 0;
     132        3100 :     move32();
     133        3100 :     IF( EQ_32( bw_index, CLDFBVAD_WB_ID ) )
     134             :     {
     135           0 :         FOR( i = 10; i < 20; i++ )
     136             :         {
     137           0 :             sb_power_shr[i] = L_shr( sb_power[i], 5 );
     138           0 :             move32();
     139             :         }
     140             : 
     141           0 :         FOR( i = 1; i < 20; i++ )
     142             :         {
     143           0 :             sb_power_mlt = Mpy_32_16_1( sb_power[i], i_t_2[i - 1] );
     144           0 :             t_sp_center = L_add( L_shr( sb_power_mlt, 8 ), t_sp_center );
     145           0 :             frame_power = L_add( sb_power_shr[i], frame_power ); /*1-19 */
     146             :         }
     147             :         /*+0.1  */
     148           0 :         Q_t_sc = sub( Q_sb_p, 13 );
     149             : 
     150           0 :         IF( GE_16( Q_t_sc, 34 ) )
     151             :         {
     152           0 :             t_sp_center = L_shr( t_sp_center, sub( Q_t_sc, 33 ) );
     153           0 :             zerop1 = ( CNT0P1 >> 1 );
     154           0 :             move32();
     155           0 :             Q_t_sc = 33;
     156           0 :             move16();
     157             :         }
     158             :         ELSE
     159             :         {
     160           0 :             Q_t_sc = sub( Q_t_sc, 1 );
     161           0 :             t_sp_center = L_shr( t_sp_center, 1 );
     162           0 :             zerop1 = L_shr( CNT0P1, s_min( 31, sub( 34, Q_t_sc ) ) );
     163             :         }
     164           0 :         t_sp_center_num = L_add( t_sp_center, zerop1 );
     165             : 
     166           0 :         Q_f_p = sub( Q_sb_p, 5 );
     167           0 :         IF( GE_16( Q_f_p, 34 ) )
     168             :         {
     169           0 :             frame_power = L_shr( frame_power, sub( Q_f_p, 33 ) );
     170           0 :             zerop1 = L_shr( CNT0P1, 1 );
     171           0 :             Q_f_p = 33;
     172           0 :             move16();
     173             :         }
     174             :         ELSE
     175             :         {
     176           0 :             Q_f_p = sub( Q_f_p, 1 );
     177           0 :             frame_power = L_shr( frame_power, 1 );
     178           0 :             zerop1 = L_shr( CNT0P1, sub( 34, Q_f_p ) );
     179             :         }
     180           0 :         frame_power_den = L_add( frame_power, zerop1 );
     181           0 :         IF( frame_power == 0 )
     182             :         {
     183           0 :             frame_power_den = CNT0P1;
     184           0 :             move32();
     185           0 :             Q_f_p = 34;
     186           0 :             move16();
     187             :         }
     188             : 
     189             :         /*div */
     190           0 :         Q_t_sp_center = sub( norm_l( t_sp_center_num ), 1 );
     191           0 :         Q_frame_power = norm_l( frame_power_den );
     192           0 :         t_sp_center_num = L_shl( t_sp_center_num, Q_t_sp_center );
     193           0 :         frame_power_den = L_shl( frame_power_den, Q_frame_power );
     194             : 
     195           0 :         d_t_sp_center = div_l( t_sp_center_num, extract_h( frame_power_den ) );
     196             : 
     197           0 :         d_t_sp_center_Qtmp = add( Q_t_sc, Q_t_sp_center );
     198           0 :         d_t_sp_center_Qtmp = sub( d_t_sp_center_Qtmp, Q_frame_power );
     199           0 :         d_t_sp_center_Qtmp = sub( d_t_sp_center_Qtmp, Q_f_p );
     200           0 :         d_t_sp_center_Qtmp = add( d_t_sp_center_Qtmp, 15 );
     201           0 :         d_t_sp_center_Qtmp = sub( d_t_sp_center_Qtmp, SP_CENTER_Q );
     202             : 
     203           0 :         sp_center[3] = shr( d_t_sp_center, d_t_sp_center_Qtmp );
     204           0 :         move16();
     205             :     }
     206        3100 :     ELSE IF( EQ_32( bw_index, CLDFBVAD_SWB_ID ) )
     207             :     {
     208       46500 :         FOR( i = 10; i < 24; i++ )
     209             :         {
     210       43400 :             sb_power_shr[i] = L_shr( sb_power[i], 5 );
     211       43400 :             move32();
     212             :         }
     213             : 
     214       74400 :         FOR( i = 1; i < 24; i++ )
     215             :         {
     216       71300 :             sb_power_mlt = Mpy_32_16_1( sb_power[i], i_t_2[i - 1] );
     217       71300 :             t_sp_center = L_add( L_shr( sb_power_mlt, 9 ), t_sp_center );
     218       71300 :             frame_power = L_add( sb_power_shr[i], frame_power ); /*1-23 */
     219             :         }
     220             : 
     221             :         /*+0.1  */
     222        3100 :         Q_t_sc = sub( Q_sb_p, 14 );
     223             : 
     224        3100 :         IF( GE_16( Q_t_sc, 34 ) )
     225             :         {
     226           3 :             t_sp_center = L_shr( t_sp_center, limitScale32( sub( Q_t_sc, 33 ) ) );
     227           3 :             zerop1 = ( CNT0P1 >> 1 );
     228           3 :             move32();
     229           3 :             Q_t_sc = 33;
     230           3 :             move16();
     231             :         }
     232             :         ELSE
     233             :         {
     234        3097 :             Q_t_sc = sub( Q_t_sc, 1 );
     235        3097 :             t_sp_center = L_shr( t_sp_center, 1 );
     236        3097 :             zerop1 = L_shr( CNT0P1, limitScale32( sub( 34, Q_t_sc ) ) );
     237             :         }
     238        3100 :         t_sp_center_num = L_add( t_sp_center, zerop1 );
     239             : 
     240        3100 :         Q_f_p = sub( Q_sb_p, 5 );
     241        3100 :         IF( GE_16( Q_f_p, 34 ) )
     242             :         {
     243          21 :             frame_power = L_shr( frame_power, sub( Q_f_p, 33 ) );
     244          21 :             zerop1 = ( CNT0P1 >> 1 );
     245          21 :             move32();
     246          21 :             Q_f_p = 33;
     247          21 :             move16();
     248             :         }
     249             :         ELSE
     250             :         {
     251        3079 :             Q_f_p = sub( Q_f_p, 1 );
     252        3079 :             frame_power = L_shr( frame_power, 1 );
     253        3079 :             zerop1 = L_shr( CNT0P1, sub( 34, Q_f_p ) );
     254             :         }
     255        3100 :         frame_power_den = L_add( frame_power, zerop1 );
     256        3100 :         IF( frame_power == 0 )
     257             :         {
     258           0 :             frame_power_den = CNT0P1;
     259           0 :             move32();
     260           0 :             Q_f_p = 34;
     261           0 :             move16();
     262             :         }
     263             : 
     264             :         /*div*/
     265        3100 :         Q_t_sp_center = sub( norm_l( t_sp_center_num ), 1 );
     266        3100 :         Q_frame_power = norm_l( frame_power_den );
     267        3100 :         t_sp_center_num = L_shl( t_sp_center_num, Q_t_sp_center );
     268        3100 :         frame_power_den = L_shl( frame_power_den, Q_frame_power );
     269             : 
     270        3100 :         d_t_sp_center = div_l( t_sp_center_num, extract_h( frame_power_den ) );
     271             : 
     272        3100 :         d_t_sp_center_Qtmp = add( Q_t_sc, Q_t_sp_center );
     273        3100 :         d_t_sp_center_Qtmp = sub( d_t_sp_center_Qtmp, Q_frame_power );
     274        3100 :         d_t_sp_center_Qtmp = sub( d_t_sp_center_Qtmp, Q_f_p );
     275        3100 :         d_t_sp_center_Qtmp = add( d_t_sp_center_Qtmp, 15 );
     276        3100 :         d_t_sp_center_Qtmp = sub( d_t_sp_center_Qtmp, SP_CENTER_Q );
     277        3100 :         sp_center[3] = shr( d_t_sp_center, d_t_sp_center_Qtmp );
     278        3100 :         move16();
     279             :     }
     280             :     ELSE
     281             :     {
     282           0 :         t_sp_center = t_sp_center_nb;
     283           0 :         move32();
     284           0 :         frame_power = frame_power_nb;
     285           0 :         move32();
     286             : 
     287           0 :         IF( frame_power == 0 )
     288             :         {
     289           0 :             d_t_sp_center = 0;
     290           0 :             move16();
     291             :         }
     292             :         ELSE
     293             :         {
     294             :             /*div*/
     295           0 :             Q_t_sp_center = sub( norm_l( t_sp_center ), 1 );
     296           0 :             Q_frame_power = norm_l( frame_power );
     297           0 :             t_sp_center_num = L_shl( t_sp_center, Q_t_sp_center );
     298           0 :             frame_power_den = L_shl( frame_power, Q_frame_power );
     299             : 
     300           0 :             d_t_sp_center = div_l( t_sp_center_num, extract_h( frame_power_den ) );
     301           0 :             d_t_sp_center = shr( d_t_sp_center, sub( add( sub( Q_t_sp_center, Q_frame_power ), 10 ), SP_CENTER_Q ) );
     302             :         }
     303             : 
     304           0 :         sp_center[0] = add( mult( sp_center[0], 0x5999 ), mult( d_t_sp_center, 0x2666 ) );
     305           0 :         sp_center[2] = d_t_sp_center;
     306           0 :         move16();
     307           0 :         move16();
     308             : 
     309           0 :         t_sp_center = 0;
     310           0 :         move32();
     311           0 :         frame_power = 0;
     312           0 :         move32();
     313           0 :         FOR( i = 1; i < 10; i++ )
     314             :         {
     315           0 :             sb_power_mlt = Mpy_32_16_1( sb_power[i], i_t_1[i - 1] );
     316           0 :             t_sp_center = L_add( L_shr( sb_power_mlt, 6 ), t_sp_center );
     317           0 :             frame_power = L_add( sb_power_shr[i], frame_power ); /*1-9  */
     318             :         }
     319           0 :         IF( frame_power == 0 )
     320             :         {
     321           0 :             sp_center[3] = 0;
     322           0 :             move16();
     323             :         }
     324             :         ELSE
     325             :         {
     326             :             /*div */
     327           0 :             Q_t_sp_center = sub( norm_l( t_sp_center ), 1 );
     328           0 :             Q_frame_power = norm_l( frame_power );
     329           0 :             t_sp_center_num = L_shl( t_sp_center, Q_t_sp_center );
     330           0 :             frame_power_den = L_shl( frame_power, Q_frame_power );
     331             : 
     332           0 :             d_t_sp_center = div_l( t_sp_center_num, extract_h( frame_power_den ) );
     333           0 :             sp_center[3] = shr( d_t_sp_center, sub( add( sub( Q_t_sp_center, Q_frame_power ), 10 ), SP_CENTER_Q ) );
     334           0 :             move16();
     335             :         }
     336             :     }
     337        3100 : }

Generated by: LCOV version 1.14