LCOV - code coverage report
Current view: top level - lib_com - weight_a_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main enc/dec/rend @ 3b2f07138c61dcf997bbf4165d0882f794b2995f Lines: 99 104 95.2 %
Date: 2025-05-03 01:55:50 Functions: 4 4 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 "rom_com.h" /* Static table prototypes                */
       7             : #include "prot_fx.h"
       8             : #include <assert.h>
       9             : 
      10             : /*------------------------------------------------------------------
      11             :  * weight_a_subfr()
      12             :  *
      13             :  * Weighting of LP filter coefficients for multiple subframes,
      14             :  * ap[i] = a[i] * (gamma^i)
      15             :  *------------------------------------------------------------------*/
      16             : 
      17     1298444 : void weight_a_subfr_fx(
      18             :     const Word16 nb_subfr, /* i  : number of subframes             Q0  */
      19             :     const Word16 *A,       /* i  : LP filter coefficients          Q12 */
      20             :     Word16 *Aw,            /* o  : weighted LP filter coefficients Q12 */
      21             :     const Word16 gamma,    /* i  : weighting factor                Q15 */
      22             :     const Word16 order     /* i  : order of LP filter              Q0  */
      23             : )
      24             : {
      25             :     Word16 k, orderp1;
      26             : 
      27             :     /* Smoothing aka spreading aka masking envelope generation */
      28     1298444 :     orderp1 = add( order, 1 );
      29     6658260 :     FOR( k = 0; k < nb_subfr; k++ )
      30             :     {
      31     5359816 :         weight_a_fx( &A[k * ( orderp1 )], &Aw[k * ( orderp1 )], gamma, order );
      32             :     }
      33             : 
      34     1298444 :     return;
      35             : }
      36             : 
      37             : /*==============================================================================*/
      38             : /* FUNCTION      :  void weight_a_lc_fx ( )                                                                             */
      39             : /*------------------------------------------------------------------------------*/
      40             : /* PURPOSE       : Weighting of LP filter coefficients, ap[i] = a[i] * (gamma^i)*/
      41             : /*------------------------------------------------------------------------------*/
      42             : /* INPUT ARGUMENTS  :                                                                                                                   */
      43             : /*              const Word16 a[],                          i:  LP filter coefficients           Q12 */
      44             : /*              const Word16 *gammatbl,            i:  weighting factor                 Q15 */
      45             : /*              const Word16 m                             i:  order of LP filter               Q0  */
      46             : /*------------------------------------------------------------------------------*/
      47             : /* OUTPUT ARGUMENTS :                                                                                                                   */
      48             : /*              Word16 ap[],                               o:  weighted LP filter coefficients  Q12 */
      49             : /*------------------------------------------------------------------------------*/
      50             : /* RETURN ARGUMENTS :                                                                                                                   */
      51             : /*------------------------------------------------------------------------------*/
      52             : /* CALLED FROM : TX/RX                                                                                                                  */
      53             : /*==============================================================================*/
      54       59804 : void weight_a_lc_fx(
      55             :     const Word16 a[],       /* i:  LP filter coefficients           Q12 */
      56             :     Word16 ap[],            /* o:  weighted LP filter coefficients  Q12 */
      57             :     const Word16 *gammatbl, /* i:  weighting factor                 Q15 */
      58             :     const Word16 m          /* i:  order of LP filter               Q0  */
      59             : )
      60             : {
      61             :     Word16 i;
      62             :     Word32 Amax;
      63             :     Word16 shift;
      64             :     const Word16 *ptr_gamma;
      65             : 
      66       59804 :     ptr_gamma = gammatbl;         /* Q15 */
      67       59804 :     Amax = L_mult( 16384, a[0] ); /* Q27 */
      68      956864 :     FOR( i = 1; i < m; i++ )
      69             :     {
      70      897060 :         Amax = L_max( Amax, L_abs( L_mult0( *ptr_gamma++, a[i] ) ) ); /* Q27 */
      71             :     }
      72       59804 :     Amax = L_max( Amax, L_abs( L_mult0( *ptr_gamma++, a[m] ) ) ); /* Q27 */
      73       59804 :     shift = norm_l( Amax );
      74       59804 :     ptr_gamma = gammatbl;                 /* Q15 */
      75       59804 :     ap[0] = shl( a[0], sub( shift, 1 ) ); /* Q11 + shift */
      76       59804 :     move16();
      77      956864 :     FOR( i = 1; i < m; i++ )
      78             :     {
      79      897060 :         ap[i] = round_fx( L_shl( L_mult0( a[i], *ptr_gamma++ ), shift ) ); /* Q11 + shift */
      80      897060 :         move16();
      81             :     }
      82       59804 :     ap[m] = round_fx( L_shl( L_mult0( a[m], *ptr_gamma++ ), shift ) ); /* Q11 + shift */
      83       59804 :     move16();
      84             : 
      85       59804 :     return;
      86             : }
      87             : 
      88             : /*------------------------------------------------------------------
      89             :  * weight_a:
      90             :  *
      91             :  * Weighting of LP filter coefficients, ap[i] = a[i] * (gamma^i)
      92             :  *------------------------------------------------------------------*/
      93    11890659 : void weight_a_fx(
      94             :     const Word16 a[],   /* i:  LP filter coefficients           Q12 */
      95             :     Word16 ap[],        /* o:  weighted LP filter coefficients  Q12 */
      96             :     const Word16 gamma, /* i:  weighting factor                 Q15 */
      97             :     const Word16 m      /* i:  order of LP filter               Q0  */
      98             : )
      99             : {
     100             :     Word16 i, fac;
     101             :     Word32 Amax;
     102             :     Word16 shift;
     103             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
     104             :     Flag Overflow;
     105    11890659 :     Overflow = 0;
     106    11890659 :     move32();
     107             : #endif
     108             : 
     109    11890659 :     fac = gamma; /* Q15 */
     110    11890659 :     move16();
     111    11890659 :     Amax = L_mult( 16384, a[0] ); /* Q27 */
     112   180075408 :     FOR( i = 1; i < m; i++ )
     113             :     {
     114   168184749 :         Amax = L_max( Amax, L_abs( L_mult0( fac, a[i] ) ) ); /* Q27 */
     115   168184749 :         fac = mult_r( fac, gamma );                          /* Q15 */
     116             :     }
     117    11890659 :     Amax = L_max( Amax, L_abs( L_mult0( fac, a[m] ) ) );
     118    11890659 :     shift = norm_l( Amax );
     119    11890659 :     fac = gamma; /* Q15 */
     120    11890659 :     move16();
     121    11890659 :     ap[0] = shl( a[0], sub( shift, 1 ) ); /* Q11 + shift */
     122    11890659 :     move16();
     123   180075408 :     FOR( i = 1; i < m; i++ )
     124             :     {
     125   168184749 :         ap[i] = round_fx_o( L_shl( L_mult0( a[i], fac ), shift ), &Overflow ); /* Q11 + shift */
     126   168184749 :         move16();
     127   168184749 :         fac = mult_r( fac, gamma ); /* Q15 */
     128             :     }
     129    11890659 :     ap[m] = round_fx( L_shl( L_mult0( a[m], fac ), shift ) ); /* Q11 + shift */
     130    11890659 :     move16();
     131             : 
     132    11890659 :     return;
     133             : }
     134             : 
     135             : /*
     136             :  * E_LPC_a_weight_inv
     137             :  *
     138             :  * Parameters:
     139             :  *    a              I: LP filter coefficients                  Q12
     140             :  *    ap             O: weighted LP filter coefficients Q12
     141             :  *    inv_gamma      I: inverse weighting factor                                Q14
     142             :  *    m              I: order of LP filter
     143             :  *
     144             :  * Function:
     145             :  *    Weighting of LP filter coefficients, ap[i] = a[i] * (inv_gamma^i).
     146             :  *
     147             :  * Returns:
     148             :  *    void
     149             :  */
     150       17495 : void E_LPC_a_weight_inv(
     151             :     const Word16 *a,        /* Q12 */
     152             :     Word16 *ap,             /* Q12 */
     153             :     const Word16 inv_gamma, /* Q14 */
     154             :     const Word16 m          /* Q0 */
     155             : )
     156             : {
     157             :     Word16 i;
     158             :     static const Word16 inv_gamma_tab_12k8[16] = { 17809, 19357, 21041, 22870, 24859, 27020, 29370, 31924,   /* Q14 */
     159             :                                                    17350, 18859, 20499, 22281, 24219, 26325, 28614, 31102 }; /* Q13 */
     160             :     static const Word16 inv_gamma_tab_16k[16] = { 17430, 18542, 19726, 20985, 22324, 23749, 25265, 26878,    /* Q14 */
     161             :                                                   14297, 15209, 16180, 17213, 18312, 19480, 20724, 22047 };  /* Q13 */
     162       17495 :     move16();
     163       17495 :     move16();
     164       17495 :     move16();
     165       17495 :     move16();
     166       17495 :     move16();
     167       17495 :     move16();
     168       17495 :     move16();
     169       17495 :     move16();
     170       17495 :     move16();
     171       17495 :     move16();
     172       17495 :     move16();
     173       17495 :     move16();
     174       17495 :     move16();
     175       17495 :     move16();
     176       17495 :     move16();
     177       17495 :     move16();
     178       17495 :     move16();
     179       17495 :     move16();
     180       17495 :     move16();
     181       17495 :     move16();
     182       17495 :     move16();
     183       17495 :     move16();
     184       17495 :     move16();
     185       17495 :     move16();
     186       17495 :     move16();
     187       17495 :     move16();
     188       17495 :     move16();
     189       17495 :     move16();
     190       17495 :     move16();
     191       17495 :     move16();
     192       17495 :     move16();
     193       17495 :     move16();
     194             : 
     195             :     const Word16 *inv_gamma_tab;
     196             :     Word32 L_tmp;
     197             :     Word32 Amax;
     198             :     Word16 shift;
     199             : 
     200             : 
     201       17495 :     IF( EQ_16( inv_gamma, 16384 /* 1 in Q14 */ ) )
     202             :     {
     203           0 :         FOR( i = 0; i <= m; i++ )
     204             :         {
     205           0 :             ap[i] = a[i]; /* Q12 */
     206           0 :             move16();
     207             :         }
     208           0 :         return;
     209             :     }
     210             : 
     211       17495 :     assert( inv_gamma == GAMMA1_INV || inv_gamma == GAMMA16k_INV );
     212       17495 :     assert( m == 16 );
     213             : 
     214       17495 :     inv_gamma_tab = inv_gamma_tab_12k8; /* Q14 */
     215       17495 :     if ( EQ_16( inv_gamma, GAMMA16k_INV ) )
     216             :     {
     217           0 :         inv_gamma_tab = inv_gamma_tab_16k; /* Q14 */
     218             :     }
     219             : 
     220             : 
     221       17495 :     Amax = L_mult( 16384, a[0] );
     222      157455 :     FOR( i = 1; i < 9; i++ )
     223             :     {
     224      139960 :         Amax = L_max( Amax, L_abs( L_mult( a[i], inv_gamma_tab[i - 1] ) ) ); /* Q27 */
     225             :     }
     226      157455 :     FOR( i = 9; i < 17; i++ )
     227             :     {
     228      139960 :         Amax = L_max( Amax, L_abs( L_shl( L_mult( a[i], inv_gamma_tab[i - 1] ), 1 ) ) ); /* Q27 */
     229             :     }
     230       17495 :     shift = norm_l( Amax );
     231       17495 :     ap[0] = shl( a[0], sub( shift, 1 ) ); /* Q11 + shift */
     232       17495 :     move16();
     233      157455 :     FOR( i = 1; i < 9; i++ )
     234             :     {
     235      139960 :         L_tmp = L_mult( a[i], inv_gamma_tab[i - 1] ); /* Q27 */
     236      139960 :         ap[i] = round_fx( L_shl( L_tmp, shift ) );    /* Q11 + shift */
     237      139960 :         move16();
     238             :     }
     239       17495 :     shift = add( shift, 1 );
     240      157455 :     FOR( i = 9; i < 17; i++ )
     241             :     {
     242      139960 :         L_tmp = L_mult( a[i], inv_gamma_tab[i - 1] ); /* Q26 */
     243      139960 :         ap[i] = round_fx( L_shl( L_tmp, shift ) );    /* Q11 + shift */
     244      139960 :         move16();
     245             :     }
     246             : 
     247             : 
     248       17495 :     return;
     249             : }

Generated by: LCOV version 1.14