LCOV - code coverage report
Current view: top level - lib_com - preemph_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main @ e0be88e06c25f79c221b2595d2ee00b3ed6d605a Lines: 118 118 100.0 %
Date: 2025-11-22 02:05:22 Functions: 6 6 100.0 %

          Line data    Source code
       1             : /*====================================================================================
       2             :     EVS Codec 3GPP TS26.452 Nov 04, 2021. Version 16.4.0
       3             :   ====================================================================================*/
       4             : 
       5             : #include <stdint.h>
       6             : #include "options.h" /* Compilation switches                   */
       7             : #include "prot_fx.h"
       8             : #include "wmc_auto.h"
       9             : 
      10             : /*-------------------------------------------------------------*
      11             :  * preemph_copy_fx()
      12             :  *
      13             :  * Preemphasis: filtering through 1 - mu z^-1
      14             :  *-------------------------------------------------------------*/
      15             : 
      16     4853566 : void preemph_copy_fx(
      17             :     const Word16 x[], /* i  : input signal             Qx  */
      18             :     Word16 y[],       /* o  : output signal            Qx  */
      19             :     const Word16 mu,  /* i  : preemphasis coefficient  Q15 */
      20             :     const Word16 lg,  /* i  : vector size              Q0  */
      21             :     Word16 *mem       /* i/o: memory (x[-1])           Qx  */
      22             : )
      23             : {
      24             :     Word16 i, temp;
      25             : 
      26     4853566 :     temp = x[lg - 1]; /* Qx */
      27     4853566 :     move16();
      28             : 
      29   439613908 :     FOR( i = lg - 1; i > 0; i-- )
      30             :     {
      31   434760342 :         y[i] = msu_r_sat( L_deposit_h( x[i] ), x[i - 1], mu ); /* Qx */
      32   434760342 :         move16();
      33             :     }
      34     4853566 :     y[0] = msu_r_sat( L_deposit_h( x[0] ), *mem, mu ); /* Qx */
      35     4853566 :     move16();
      36             : 
      37     4853566 :     *mem = temp; /* Qx */
      38     4853566 :     move16();
      39             : 
      40     4853566 :     return;
      41             : }
      42             : #ifndef FIX_2015_PREMPH_SAT_ALT
      43             : void preemph_copy_32fx(
      44             :     const Word16 x[], /* i  : input signal             Qx  */
      45             :     Word32 y[],       /* o  : output signal            Qx  */
      46             :     const Word16 mu,  /* i  : preemphasis coefficient  Q15 */
      47             :     const Word16 lg,  /* i  : vector size              Q0  */
      48             :     Word16 *mem       /* i/o: memory (x[-1])           Qx  */
      49             : )
      50             : {
      51             :     Word16 i, temp;
      52             : 
      53             :     temp = x[lg - 1]; /* Qx */
      54             :     move16();
      55             : 
      56             :     FOR( i = lg - 1; i > 0; i-- )
      57             :     {
      58             :         y[i] = L_msu_sat( L_deposit_h( x[i] ), x[i - 1], mu ); /* Qx+16 */
      59             :         move16();
      60             :     }
      61             :     y[0] = L_msu_sat( L_deposit_h( x[0] ), *mem, mu ); /* Qx+16 */
      62             :     move16();
      63             : 
      64             :     *mem = temp; /* Qx */
      65             :     move16();
      66             : 
      67             :     return;
      68             : }
      69             : #else
      70     3380208 : void preemph_copy_32fx2(
      71             :     const Word16 x[], /* i  : input signal             Qx  */
      72             :     Word32 y[],       /* o  : output signal            Qx-1*/
      73             :     const Word16 mu,  /* i  : preemphasis coefficient  Q15 */
      74             :     const Word16 lg,  /* i  : vector size              Q0  */
      75             :     Word16 *mem       /* i/o: memory (x[-1])           Qx  */
      76             : )
      77             : {
      78             :     Word16 i, temp;
      79             : 
      80     3380208 :     temp = x[lg - 1]; /* Qx */
      81     3380208 :     move16();
      82             : 
      83   574967382 :     FOR( i = lg - 1; i > 0; i-- )
      84             :     {
      85   571587174 :         y[i] = L_msu0_sat( L_mult( x[i], 16384 ), x[i - 1], mu ); /* Qx+16 */
      86   571587174 :         move16();
      87             :     }
      88     3380208 :     y[0] = L_msu0_sat( L_mult( x[0], 16384 ), *mem, mu ); /* Qx+16 */
      89     3380208 :     move16();
      90             : 
      91     3380208 :     *mem = temp; /* Qx */
      92     3380208 :     move16();
      93             : 
      94     3380208 :     return;
      95             : }
      96             : #endif
      97             : /*-------------------------------------------------------------*
      98             :  * preemph_ivas_fx()
      99             :  *
     100             :  * Preemphasis: filtering through 1 - mu z^-1
     101             :  *-------------------------------------------------------------*/
     102             : 
     103       85065 : void preemph_ivas_fx(
     104             :     Word32 *signal,  /* i/o: signal             Qx*/
     105             :     const Word16 mu, /* i  : preemphasis factor Q15*/
     106             :     const Word16 L,  /* i  : vector size        Q0*/
     107             :     Word32 *mem      /* i/o: memory (x[-1])     Qx*/
     108             : )
     109             : {
     110             :     Word16 i;
     111             :     Word32 temp;
     112             : 
     113       85065 :     temp = signal[L - 1]; /* Qx */
     114       85065 :     move32();
     115    25347024 :     FOR( i = L - 1; i > 0; i-- )
     116             :     {
     117    25261959 :         signal[i] = L_sub( signal[i], Mpy_32_16_1( signal[i - 1], mu ) ); /* Qx */
     118    25261959 :         move32();
     119             :     }
     120             : 
     121       85065 :     signal[0] = L_sub( signal[0], Mpy_32_16_1( *mem, mu ) ); /* Qx */
     122       85065 :     move32();
     123       85065 :     *mem = temp; /* Qx */
     124       85065 :     move32();
     125             : 
     126       85065 :     return;
     127             : }
     128             : 
     129             : /*
     130             :  * E_UTIL_f_preemph2
     131             :  *
     132             :  * Parameters:
     133             :  *    shift          I: scale output
     134             :  *    signal       I/O: signal                Qx/Qx+shift
     135             :  *    mu             I: preemphasis factor    Q15
     136             :  *    L              I: vector size
     137             :  *    mem          I/O: memory (x[-1])
     138             :  *
     139             :  * Function:
     140             :  *    Filtering through 1 - mu z^-1
     141             :  *
     142             :  * Returns:
     143             :  *    void
     144             :  */
     145     1105694 : void E_UTIL_f_preemph2(
     146             :     Word16 shift,    /* Q0 */
     147             :     Word16 *signal,  /* Qx */
     148             :     const Word16 mu, /* Q15 */
     149             :     const Word16 lg, /* Q0 */
     150             :     Word16 *mem      /* Qx */
     151             : )
     152             : {
     153             :     Word16 i, temp;
     154             :     Word32 L_tmp;
     155             : 
     156     1105694 :     temp = signal[lg - 1]; /* Qx */
     157     1105694 :     move16();
     158             : 
     159   592028896 :     FOR( i = lg - 1; i > 0; i-- )
     160             :     {
     161   590923202 :         L_tmp = L_mult( signal[i], 16384 );             /* Qx + 15 */
     162   590923202 :         L_tmp = L_msu0_sat( L_tmp, signal[i - 1], mu ); /* Qx + 15 */
     163   590923202 :         L_tmp = L_shl_sat( L_tmp, add( shift, 1 ) );    /* Qx + shift + 16 */
     164   590923202 :         signal[i] = round_fx_sat( L_tmp );              /* Qx + shift */
     165   590923202 :         move16();
     166             :     }
     167             : 
     168     1105694 :     L_tmp = L_mult( signal[0], 16384 );          /* Qx + 15 */
     169     1105694 :     L_tmp = L_msu0_sat( L_tmp, *mem, mu );       /* Qx + 15 */
     170     1105694 :     L_tmp = L_shl_sat( L_tmp, add( shift, 1 ) ); /* Qx + shift + 16 */
     171     1105694 :     signal[0] = round_fx_sat( L_tmp );           /* Qx + shift */
     172     1105694 :     move16();
     173             : 
     174     1105694 :     *mem = temp; /* Qx */
     175     1105694 :     move16();
     176             : 
     177     1105694 :     return;
     178             : }
     179             : 
     180             : 
     181      294030 : Word16 E_UTIL_f_preemph3(
     182             :     Word16 *signal,  /* Qx */
     183             :     const Word16 mu, /* Q15 */
     184             :     const Word16 lg, /* Q0 */
     185             :     Word16 *mem,     /* Qx */
     186             :     Word16 bits      /* Q0 */
     187             : )
     188             : {
     189             :     Word16 i, QVal, mus, tmp_fixed, Q_new;
     190             :     Word32 L_tmp, L_maxloc;
     191             : 
     192             : 
     193      294030 :     QVal = shl( 1, sub( 15, bits ) ); /* Q15 - bits */
     194      294030 :     mus = shr( mu, bits );            /* Q15 - bits */
     195             : 
     196      294030 :     L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
     197      294030 :     L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
     198      294030 :     L_maxloc = L_abs( L_tmp );
     199             : 
     200   134170852 :     FOR( i = 1; i < lg; i++ )
     201             :     {
     202   133876822 :         L_tmp = L_mult( signal[i], QVal );          /* Qx + Q16 - bits */
     203   133876822 :         L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
     204   133876822 :         L_tmp = L_abs( L_tmp );
     205   133876822 :         L_maxloc = L_max( L_tmp, L_maxloc );
     206             :     }
     207             : 
     208      294030 :     tmp_fixed = extract_h( L_maxloc ); /* Qx - bits */
     209             : 
     210      294030 :     Q_new = Q_MAX;
     211      294030 :     move16();
     212      294030 :     IF( tmp_fixed != 0 )
     213             :     {
     214      274894 :         Q_new = sub( norm_s( tmp_fixed ), bits );
     215      274894 :         Q_new = s_max( Q_new, 0 );
     216      274894 :         Q_new = s_min( Q_new, Q_MAX );
     217             :     }
     218             : 
     219      294030 :     tmp_fixed = signal[lg - 1]; /* Qx */
     220      294030 :     move16();
     221             : 
     222   134170852 :     FOR( i = lg - 1; i > 0; i-- )
     223             :     {
     224   133876822 :         L_tmp = L_mult( signal[i], QVal );          /* Qx + Q16 - bits */
     225   133876822 :         L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
     226   133876822 :         L_tmp = L_shl( L_tmp, Q_new );              /* Qx + Q16 + Q_new - bits */
     227   133876822 :         signal[i] = round_fx( L_tmp );              /* Qx + Q_new - bits */
     228   133876822 :         move16();
     229             :     }
     230             : 
     231      294030 :     L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
     232      294030 :     L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
     233      294030 :     L_tmp = L_shl( L_tmp, Q_new );     /* Qx + Q16 + Q_new - bits */
     234      294030 :     signal[0] = round_fx( L_tmp );     /* Qx + Q_new - bits */
     235      294030 :     move16();
     236      294030 :     *mem = tmp_fixed;
     237      294030 :     move16();
     238             : 
     239      294030 :     return Q_new;
     240             : }
     241             : 
     242        4168 : Word16 E_UTIL_f_preemph3_ivas_fx(
     243             :     Word16 *signal,  /* Qx */
     244             :     const Word16 mu, /* Q15 */
     245             :     const Word16 lg, /* Q0 */
     246             :     Word16 *mem,     /* Qx */
     247             :     Word16 bits      /* Q0 */
     248             : )
     249             : {
     250             :     Word16 i, QVal, mus, tmp_fixed, Q_new;
     251             :     Word32 L_tmp, L_maxloc;
     252             : 
     253             : 
     254        4168 :     QVal = shl( 1, sub( 15, bits ) ); /* Q15 - bits */
     255        4168 :     mus = shr( mu, bits );            /* Q15 - bits */
     256             : 
     257        4168 :     L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
     258        4168 :     L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
     259        4168 :     L_maxloc = L_abs( L_tmp );
     260             : 
     261     3557882 :     FOR( i = 1; i < lg; i++ )
     262             :     {
     263     3553714 :         L_tmp = L_mult( signal[i], QVal );          /* Qx + Q16 - bits */
     264     3553714 :         L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
     265     3553714 :         L_tmp = L_abs( L_tmp );
     266     3553714 :         L_maxloc = L_max( L_tmp, L_maxloc );
     267             :     }
     268             : 
     269        4168 :     tmp_fixed = extract_h( L_maxloc ); /* Qx - bits */
     270             : 
     271        4168 :     Q_new = Q_MAX;
     272        4168 :     move16();
     273        4168 :     IF( tmp_fixed != 0 )
     274             :     {
     275        3439 :         Q_new = sub( norm_s( tmp_fixed ), bits );
     276        3439 :         Q_new = s_max( Q_new, 0 );
     277        3439 :         Q_new = sub( s_min( Q_new, Q_MAX ), 1 );
     278             :     }
     279             : 
     280        4168 :     tmp_fixed = signal[lg - 1];
     281        4168 :     move16();
     282             : 
     283     3557882 :     FOR( i = sub( lg, 1 ); i > 0; i-- )
     284             :     {
     285     3553714 :         L_tmp = L_mult( signal[i], QVal );          /* Qx + Q16 - bits */
     286     3553714 :         L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
     287     3553714 :         L_tmp = L_shl( L_tmp, Q_new );              /* Qx + Q16 + Q_new - bits */
     288     3553714 :         signal[i] = round_fx( L_tmp );              /* Qx + Q_new - bits */
     289     3553714 :         move16();
     290             :     }
     291             : 
     292        4168 :     L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
     293        4168 :     L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
     294        4168 :     L_tmp = L_shl( L_tmp, Q_new );     /* Qx + Q_new + Q16 - bits */
     295        4168 :     signal[0] = round_fx( L_tmp );     /* Qx + Q_new - bits */
     296        4168 :     move16();
     297        4168 :     *mem = tmp_fixed;
     298        4168 :     move16();
     299             : 
     300        4168 :     return Q_new;
     301             : }

Generated by: LCOV version 1.14