LCOV - code coverage report
Current view: top level - lib_com - preemph_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main -- dec/rend @ 633e3f2e309758d10805ef21e0436356fe719b7a Lines: 107 118 90.7 %
Date: 2025-08-23 01:22:27 Functions: 5 6 83.3 %

          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" /* 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     1171874 : 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             : #ifndef ISSUE_1836_replace_overflow_libcom
      26             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
      27             :     Flag Overflow = 0;
      28             :     move32();
      29             : #endif
      30             : #endif
      31     1171874 :     temp = x[lg - 1]; /* Qx */
      32     1171874 :     move16();
      33             : #ifdef ISSUE_1836_replace_overflow_libcom
      34   114187561 :     FOR( i = lg - 1; i > 0; i-- )
      35             :     {
      36   113015687 :         y[i] = msu_r_sat( L_deposit_h( x[i] ), x[i - 1], mu ); /* Qx */
      37   113015687 :         move16();
      38             :     }
      39     1171874 :     y[0] = msu_r_sat( L_deposit_h( x[0] ), *mem, mu ); /* Qx */
      40     1171874 :     move16();
      41             : #else
      42             :     FOR( i = lg - 1; i > 0; i-- )
      43             :     {
      44             :         y[i] = msu_ro( L_deposit_h( x[i] ), x[i - 1], mu, &Overflow ); /* Qx */
      45             :         move16();
      46             :     }
      47             :     y[0] = msu_ro( L_deposit_h( x[0] ), *mem, mu, &Overflow ); /* Qx */
      48             :     move16();
      49             : #endif
      50             : 
      51             : 
      52     1171874 :     *mem = temp; /* Qx */
      53     1171874 :     move16();
      54     1171874 : }
      55             : 
      56           0 : void preemph_copy_32fx(
      57             :     const Word16 x[], /* i  : input signal             Qx  */
      58             :     Word32 y[],       /* o  : output signal            Qx  */
      59             :     const Word16 mu,  /* i  : preemphasis coefficient  Q15 */
      60             :     const Word16 lg,  /* i  : vector size              Q0  */
      61             :     Word16 *mem       /* i/o: memory (x[-1])           Qx  */
      62             : )
      63             : {
      64             :     Word16 i, temp;
      65             : #ifndef ISSUE_1836_replace_overflow_libcom
      66             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
      67             :     Flag Overflow = 0;
      68             :     move32();
      69             : #endif
      70             : #endif
      71           0 :     temp = x[lg - 1]; /* Qx */
      72           0 :     move16();
      73             : #ifdef ISSUE_1836_replace_overflow_libcom
      74           0 :     FOR( i = lg - 1; i > 0; i-- )
      75             :     {
      76           0 :         y[i] = L_msu_sat( L_deposit_h( x[i] ), x[i - 1], mu ); /* Qx+16 */
      77           0 :         move16();
      78             :     }
      79           0 :     y[0] = L_msu_sat( L_deposit_h( x[0] ), *mem, mu ); /* Qx+16 */
      80           0 :     move16();
      81             : #else
      82             :     FOR( i = lg - 1; i > 0; i-- )
      83             :     {
      84             :         y[i] = L_msu_o( L_deposit_h( x[i] ), x[i - 1], mu, &Overflow ); /* Qx+16 */
      85             :         move16();
      86             :     }
      87             :     y[0] = L_msu_o( L_deposit_h( x[0] ), *mem, mu, &Overflow ); /* Qx+16 */
      88             :     move16();
      89             : #endif
      90             : 
      91           0 :     *mem = temp; /* Qx */
      92           0 :     move16();
      93           0 : }
      94             : 
      95             : /*-------------------------------------------------------------*
      96             :  * preemph_ivas_fx()
      97             :  *
      98             :  * Preemphasis: filtering through 1 - mu z^-1
      99             :  *-------------------------------------------------------------*/
     100             : 
     101       63660 : void preemph_ivas_fx(
     102             :     Word32 *signal,  /* i/o: signal             Qx*/
     103             :     const Word16 mu, /* i  : preemphasis factor Q15*/
     104             :     const Word16 L,  /* i  : vector size        Q0*/
     105             :     Word32 *mem      /* i/o: memory (x[-1])     Qx*/
     106             : )
     107             : {
     108             :     Word16 i;
     109             :     Word32 temp;
     110             : 
     111       63660 :     temp = signal[L - 1]; /* Qx */
     112       63660 :     move32();
     113    19237440 :     FOR( i = L - 1; i > 0; i-- )
     114             :     {
     115    19173780 :         signal[i] = L_sub( signal[i], Mpy_32_16_1( signal[i - 1], mu ) ); /* Qx */
     116    19173780 :         move32();
     117             :     }
     118             : 
     119       63660 :     signal[0] = L_sub( signal[0], Mpy_32_16_1( *mem, mu ) ); /* Qx */
     120       63660 :     move32();
     121       63660 :     *mem = temp; /* Qx */
     122       63660 :     move32();
     123             : 
     124       63660 :     return;
     125             : }
     126             : 
     127             : /*
     128             :  * E_UTIL_f_preemph2
     129             :  *
     130             :  * Parameters:
     131             :  *    shift          I: scale output
     132             :  *    signal       I/O: signal                          Qx/Qx+shift
     133             :  *    mu             I: preemphasis factor      Q15
     134             :  *    L              I: vector size
     135             :  *    mem          I/O: memory (x[-1])
     136             :  *
     137             :  * Function:
     138             :  *    Filtering through 1 - mu z^-1
     139             :  *
     140             :  * Returns:
     141             :  *    void
     142             :  */
     143      701170 : void E_UTIL_f_preemph2(
     144             :     Word16 shift,    /* Q0 */
     145             :     Word16 *signal,  /* Qx */
     146             :     const Word16 mu, /* Q15 */
     147             :     const Word16 lg, /* Q0 */
     148             :     Word16 *mem      /* Qx */
     149             : )
     150             : {
     151             :     Word16 i, temp;
     152             :     Word32 L_tmp;
     153             : #ifndef ISSUE_1836_replace_overflow_libcom
     154             : #ifdef BASOP_NOGLOB_DECLARE_LOCAL
     155             :     Flag Overflow = 0;
     156             :     move32();
     157             : #endif
     158             : #endif
     159      701170 :     temp = signal[lg - 1]; /* Qx */
     160      701170 :     move16();
     161             : 
     162             : #ifdef ISSUE_1836_replace_overflow_libcom
     163   397602592 :     FOR( i = lg - 1; i > 0; i-- )
     164             :     {
     165   396901422 :         L_tmp = L_mult( signal[i], 16384 );             /* Qx + 15 */
     166   396901422 :         L_tmp = L_msu0_sat( L_tmp, signal[i - 1], mu ); /* Qx + 15 */
     167   396901422 :         L_tmp = L_shl_sat( L_tmp, add( shift, 1 ) );    /* Qx + shift + 16 */
     168   396901422 :         signal[i] = round_fx_sat( L_tmp );              /* Qx + shift */
     169   396901422 :         move16();
     170             :     }
     171             : 
     172      701170 :     L_tmp = L_mult( signal[0], 16384 );          /* Qx + 15 */
     173      701170 :     L_tmp = L_msu0_sat( L_tmp, *mem, mu );       /* Qx + 15 */
     174      701170 :     L_tmp = L_shl_sat( L_tmp, add( shift, 1 ) ); /* Qx + shift + 16 */
     175      701170 :     signal[0] = round_fx_sat( L_tmp );           /* Qx + shift */
     176      701170 :     move16();
     177             : #else
     178             :     FOR( i = lg - 1; i > 0; i-- )
     179             :     {
     180             :         L_tmp = L_mult( signal[i], 16384 );                      /* Qx + 15 */
     181             :         L_tmp = L_msu0_o( L_tmp, signal[i - 1], mu, &Overflow ); /* Qx + 15 */
     182             :         L_tmp = L_shl_o( L_tmp, add( shift, 1 ), &Overflow );    /* Qx + shift + 16 */
     183             :         signal[i] = round_fx_o( L_tmp, &Overflow );              /* Qx + shift */
     184             :         move16();
     185             :     }
     186             : 
     187             :     L_tmp = L_mult( signal[0], 16384 );                   /* Qx + 15 */
     188             :     L_tmp = L_msu0_o( L_tmp, *mem, mu, &Overflow );       /* Qx + 15 */
     189             :     L_tmp = L_shl_o( L_tmp, add( shift, 1 ), &Overflow ); /* Qx + shift + 16 */
     190             :     signal[0] = round_fx_o( L_tmp, &Overflow );           /* Qx + shift */
     191             :     move16();
     192             : #endif
     193             : 
     194      701170 :     *mem = temp; /* Qx */
     195      701170 :     move16();
     196             : 
     197      701170 :     return;
     198             : }
     199             : 
     200             : 
     201      220195 : Word16 E_UTIL_f_preemph3(
     202             :     Word16 *signal,  /* Qx */
     203             :     const Word16 mu, /* Q15 */
     204             :     const Word16 lg, /* Q0 */
     205             :     Word16 *mem,     /* Qx */
     206             :     Word16 bits      /* Q0 */
     207             : )
     208             : {
     209             :     Word16 i, QVal, mus, tmp_fixed, Q_new;
     210             :     Word32 L_tmp, L_maxloc;
     211             : 
     212             : 
     213      220195 :     QVal = shl( 1, sub( 15, bits ) ); /* Q15 - bits */
     214      220195 :     mus = shr( mu, bits );            /* Q15 - bits */
     215             : 
     216      220195 :     L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
     217      220195 :     L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
     218      220195 :     L_maxloc = L_abs( L_tmp );
     219             : 
     220   103308850 :     FOR( i = 1; i < lg; i++ )
     221             :     {
     222   103088655 :         L_tmp = L_mult( signal[i], QVal );          /* Qx + Q16 - bits */
     223   103088655 :         L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
     224   103088655 :         L_tmp = L_abs( L_tmp );
     225   103088655 :         L_maxloc = L_max( L_tmp, L_maxloc );
     226             :     }
     227             : 
     228      220195 :     tmp_fixed = extract_h( L_maxloc ); /* Qx - bits */
     229             : 
     230      220195 :     Q_new = Q_MAX;
     231      220195 :     move16();
     232      220195 :     IF( tmp_fixed != 0 )
     233             :     {
     234      210642 :         Q_new = sub( norm_s( tmp_fixed ), bits );
     235      210642 :         Q_new = s_max( Q_new, 0 );
     236      210642 :         Q_new = s_min( Q_new, Q_MAX );
     237             :     }
     238             : 
     239      220195 :     tmp_fixed = signal[lg - 1]; /* Qx */
     240      220195 :     move16();
     241             : 
     242   103308850 :     FOR( i = lg - 1; i > 0; i-- )
     243             :     {
     244   103088655 :         L_tmp = L_mult( signal[i], QVal );          /* Qx + Q16 - bits */
     245   103088655 :         L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
     246   103088655 :         L_tmp = L_shl( L_tmp, Q_new );              /* Qx + Q16 + Q_new - bits */
     247   103088655 :         signal[i] = round_fx( L_tmp );              /* Qx + Q_new - bits */
     248   103088655 :         move16();
     249             :     }
     250             : 
     251      220195 :     L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
     252      220195 :     L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
     253      220195 :     L_tmp = L_shl( L_tmp, Q_new );     /* Qx + Q16 + Q_new - bits */
     254      220195 :     signal[0] = round_fx( L_tmp );     /* Qx + Q_new - bits */
     255      220195 :     move16();
     256      220195 :     *mem = tmp_fixed;
     257      220195 :     move16();
     258             : 
     259      220195 :     return Q_new;
     260             : }
     261             : 
     262        3555 : Word16 E_UTIL_f_preemph3_ivas_fx(
     263             :     Word16 *signal,  /* Qx */
     264             :     const Word16 mu, /* Q15 */
     265             :     const Word16 lg, /* Q0 */
     266             :     Word16 *mem,     /* Qx */
     267             :     Word16 bits      /* Q0 */
     268             : )
     269             : {
     270             :     Word16 i, QVal, mus, tmp_fixed, Q_new;
     271             :     Word32 L_tmp, L_maxloc;
     272             : 
     273             : 
     274        3555 :     QVal = shl( 1, sub( 15, bits ) ); /* Q15 - bits */
     275        3555 :     mus = shr( mu, bits );            /* Q15 - bits */
     276             : 
     277        3555 :     L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
     278        3555 :     L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
     279        3555 :     L_maxloc = L_abs( L_tmp );
     280             : 
     281     2908593 :     FOR( i = 1; i < lg; i++ )
     282             :     {
     283     2905038 :         L_tmp = L_mult( signal[i], QVal );          /* Qx + Q16 - bits */
     284     2905038 :         L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
     285     2905038 :         L_tmp = L_abs( L_tmp );
     286     2905038 :         L_maxloc = L_max( L_tmp, L_maxloc );
     287             :     }
     288             : 
     289        3555 :     tmp_fixed = extract_h( L_maxloc ); /* Qx - bits */
     290             : 
     291        3555 :     Q_new = Q_MAX;
     292        3555 :     move16();
     293        3555 :     IF( tmp_fixed != 0 )
     294             :     {
     295        2883 :         Q_new = sub( norm_s( tmp_fixed ), bits );
     296        2883 :         Q_new = s_max( Q_new, 0 );
     297        2883 :         Q_new = sub( s_min( Q_new, Q_MAX ), 1 );
     298             :     }
     299             : 
     300        3555 :     tmp_fixed = signal[lg - 1];
     301        3555 :     move16();
     302             : 
     303     2908593 :     FOR( i = sub( lg, 1 ); i > 0; i-- )
     304             :     {
     305     2905038 :         L_tmp = L_mult( signal[i], QVal );          /* Qx + Q16 - bits */
     306     2905038 :         L_tmp = L_msu( L_tmp, signal[i - 1], mus ); /* Qx + Q16 - bits */
     307     2905038 :         L_tmp = L_shl( L_tmp, Q_new );              /* Qx + Q16 + Q_new - bits */
     308     2905038 :         signal[i] = round_fx( L_tmp );              /* Qx + Q_new - bits */
     309     2905038 :         move16();
     310             :     }
     311             : 
     312        3555 :     L_tmp = L_mult( signal[0], QVal ); /* Qx + Q16 - bits */
     313        3555 :     L_tmp = L_msu( L_tmp, *mem, mus ); /* Qx + Q16 - bits */
     314        3555 :     L_tmp = L_shl( L_tmp, Q_new );     /* Qx + Q_new + Q16 - bits */
     315        3555 :     signal[0] = round_fx( L_tmp );     /* Qx + Q_new - bits */
     316        3555 :     move16();
     317        3555 :     *mem = tmp_fixed;
     318        3555 :     move16();
     319             : 
     320        3555 :     return Q_new;
     321             : }

Generated by: LCOV version 1.14