LCOV - code coverage report
Current view: top level - lib_com - weight_fx.c (source / functions) Hit Total Coverage
Test: Coverage on main -- dec/rend @ 4c82f1d24d39d0296b18d775f18a006f4c7d024b Lines: 189 189 100.0 %
Date: 2025-05-17 01:59:02 Functions: 3 3 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" /* Compilation switches                   */
       7             : #include "cnst.h"    /* Common constants                       */
       8             : #include "rom_com.h" /* Static table prototypes                */
       9             : #include "prot_fx.h" /* Function prototypes                    */
      10             : 
      11             : /*--------------------------------------------------------------------------*
      12             :  * sfm2mqb_fx()
      13             :  *
      14             :  * Map sub-vectors to pbands
      15             :  *--------------------------------------------------------------------------*/
      16             : 
      17        3842 : static void sfm2mqb_fx(
      18             :     Word16 spe[],       /* i  : sub-vectors                     Q0*/
      19             :     Word16 spe2q[],     /* o  : pbands                          Q0*/
      20             :     const Word16 nb_sfm /* i  : number of norms         Q0*/
      21             : )
      22             : {
      23             :     Word16 tmp, i;
      24             : 
      25             :     /* short groups */
      26        3842 :     spe2q[0] = add( spe[0], 3 ); /* Q0 */
      27        3842 :     move16();
      28        3842 :     spe2q[1] = add( spe[1], 3 ); /* Q0 */
      29        3842 :     move16();
      30        3842 :     spe2q[2] = add( spe[2], 3 ); /* Q0 */
      31        3842 :     move16();
      32        3842 :     spe2q[3] = add( spe[3], 3 ); /* Q0 */
      33        3842 :     move16();
      34        3842 :     spe2q[4] = add( spe[4], 3 ); /* Q0 */
      35        3842 :     move16();
      36        3842 :     spe2q[5] = add( spe[5], 3 ); /* Q0 */
      37        3842 :     move16();
      38        3842 :     spe2q[6] = add( spe[6], 3 ); /* Q0 */
      39        3842 :     move16();
      40        3842 :     spe2q[7] = add( spe[7], 3 ); /* Q0 */
      41        3842 :     move16();
      42        3842 :     spe2q[8] = add( spe[8], 3 ); /* Q0 */
      43        3842 :     move16();
      44        3842 :     spe2q[9] = add( spe[9], 3 ); /* Q0 */
      45        3842 :     move16();
      46             : 
      47        3842 :     spe2q[10] = add( shr( add( spe[10], spe[11] ), 1 ), 4 ); /* Q0 */
      48        3842 :     move16();
      49        3842 :     spe2q[11] = add( shr( add( spe[12], spe[13] ), 1 ), 4 ); /* Q0 */
      50        3842 :     move16();
      51        3842 :     spe2q[12] = add( shr( add( spe[14], spe[15] ), 1 ), 4 ); /* Q0 */
      52        3842 :     move16();
      53             : 
      54        3842 :     spe2q[13] = add( shr( add( spe[16], spe[17] ), 1 ), 5 ); /* Q0 */
      55        3842 :     move16();
      56        3842 :     spe2q[14] = add( shr( add( spe[18], spe[19] ), 1 ), 5 ); /* Q0 */
      57        3842 :     move16();
      58             : 
      59        3842 :     tmp = 0;
      60        3842 :     move16();
      61       19210 :     FOR( i = 20; i < 24; i++ )
      62             :     {
      63       15368 :         tmp = add( tmp, spe[i] );
      64             :     }
      65        3842 :     spe2q[15] = add( mult( tmp, 8192 ), 6 ); /* Q0 */
      66        3842 :     move16();
      67             : 
      68        3842 :     tmp = 0;
      69        3842 :     move16();
      70       15368 :     FOR( i = 24; i < 27; i++ )
      71             :     {
      72       11526 :         tmp = add( tmp, spe[i] ); /* Q0 */
      73             :     }
      74        3842 :     spe2q[16] = add( mult( tmp, 10923 ), 6 ); /* Q0 */
      75        3842 :     move16();
      76             : 
      77        3842 :     IF( GT_16( nb_sfm, SFM_N_STA_8k ) )
      78             :     {
      79        3842 :         tmp = 0;
      80        3842 :         move16();
      81       15368 :         FOR( i = 27; i < 30; i++ )
      82             :         {
      83       11526 :             tmp = add( tmp, spe[i] ); /* Q0 */
      84             :         }
      85        3842 :         spe2q[17] = add( mult( tmp, 10923 ), 6 ); /* Q0 */
      86        3842 :         move16();
      87             : 
      88        3842 :         IF( GT_16( nb_sfm, SFM_N_STA_10k ) )
      89             :         {
      90        3842 :             tmp = 0;
      91        3842 :             move16();
      92       23052 :             FOR( i = 30; i < 35; i++ )
      93             :             {
      94       19210 :                 tmp = add( tmp, spe[i] ); /* Q0 */
      95             :             }
      96        3842 :             spe2q[18] = add( mult( tmp, 6553 ), 7 ); /* Q0 */
      97        3842 :             move16();
      98             : 
      99        3842 :             tmp = 0;
     100        3842 :             move16();
     101       38420 :             FOR( i = 35; i < 44; i++ )
     102             :             {
     103       34578 :                 tmp = add( tmp, spe[i] ); /* Q0 */
     104             :             }
     105        3842 :             spe2q[19] = add( mult( tmp, 3641 ), 8 ); /* Q0 */
     106        3842 :             move16();
     107             :         }
     108             :     }
     109             : 
     110        3842 :     return;
     111             : }
     112             : 
     113             : /*--------------------------------------------------------------------------*
     114             :  * mqb2sfm_fx()
     115             :  *
     116             :  * Map pbands to sub-vectors
     117             :  *--------------------------------------------------------------------------*/
     118             : 
     119        3842 : static void mqb2sfm_fx(
     120             :     Word16 spe2q[],      /* i  : pbands                         Q0*/
     121             :     Word16 spe[],        /* o  : sub-vectors            Q0*/
     122             :     const Word16 lnb_sfm /* i  : number of norms        Q0*/
     123             : )
     124             : {
     125             :     Word16 i;
     126             : 
     127        3842 :     spe[0] = spe2q[0]; /* Q0 */
     128        3842 :     move16();
     129        3842 :     spe[1] = spe2q[1]; /* Q0 */
     130        3842 :     move16();
     131        3842 :     spe[2] = spe2q[2]; /* Q0 */
     132        3842 :     move16();
     133        3842 :     spe[3] = spe2q[3]; /* Q0 */
     134        3842 :     move16();
     135        3842 :     spe[4] = spe2q[4]; /* Q0 */
     136        3842 :     move16();
     137        3842 :     spe[5] = spe2q[5]; /* Q0 */
     138        3842 :     move16();
     139        3842 :     spe[6] = spe2q[6]; /* Q0 */
     140        3842 :     move16();
     141        3842 :     spe[7] = spe2q[7]; /* Q0 */
     142        3842 :     move16();
     143        3842 :     spe[8] = spe2q[8]; /* Q0 */
     144        3842 :     move16();
     145        3842 :     spe[9] = spe2q[9]; /* Q0 */
     146        3842 :     move16();
     147             : 
     148        3842 :     spe[10] = spe2q[10]; /* Q0 */
     149        3842 :     move16();
     150        3842 :     spe[11] = spe2q[10]; /* Q0 */
     151        3842 :     move16();
     152             : 
     153        3842 :     spe[12] = spe2q[11]; /* Q0 */
     154        3842 :     move16();
     155        3842 :     spe[13] = spe2q[11]; /* Q0 */
     156        3842 :     move16();
     157             : 
     158        3842 :     spe[14] = spe2q[12]; /* Q0 */
     159        3842 :     move16();
     160        3842 :     spe[15] = spe2q[12]; /* Q0 */
     161        3842 :     move16();
     162             : 
     163        3842 :     spe[16] = spe2q[13]; /* Q0 */
     164        3842 :     move16();
     165        3842 :     spe[17] = spe2q[13]; /* Q0 */
     166        3842 :     move16();
     167             : 
     168        3842 :     spe[18] = spe2q[14]; /* Q0 */
     169        3842 :     move16();
     170        3842 :     spe[19] = spe2q[14]; /* Q0 */
     171        3842 :     move16();
     172             : 
     173       19210 :     FOR( i = 20; i < 24; i++ )
     174             :     {
     175       15368 :         spe[i] = spe2q[15]; /* Q0 */
     176       15368 :         move16();
     177             :     }
     178             : 
     179       15368 :     FOR( i = 24; i < 27; i++ )
     180             :     {
     181       11526 :         spe[i] = spe2q[16]; /* Q0 */
     182       11526 :         move16();
     183             :     }
     184             : 
     185        3842 :     IF( GT_16( lnb_sfm, SFM_N_STA_8k ) )
     186             :     {
     187       15368 :         FOR( i = 27; i < 30; i++ )
     188             :         {
     189       11526 :             spe[i] = spe2q[17]; /* Q0 */
     190       11526 :             move16();
     191             :         }
     192             : 
     193        3842 :         IF( GT_16( lnb_sfm, SFM_N_STA_10k ) )
     194             :         {
     195       23052 :             FOR( i = 30; i < 35; i++ )
     196             :             {
     197       19210 :                 spe[i] = spe2q[18]; /* Q0 */
     198       19210 :                 move16();
     199             :             }
     200             : 
     201       38420 :             FOR( i = 35; i < 44; i++ )
     202             :             {
     203       34578 :                 spe[i] = spe2q[19]; /* Q0 */
     204       34578 :                 move16();
     205             :             }
     206             :         }
     207             :     }
     208             : 
     209        3842 :     return;
     210             : }
     211             : 
     212             : /*--------------------------------------------------------------------------*
     213             :  * map_quant_weight_fx()
     214             :  *
     215             :  * Calculate the quantization weights
     216             :  *--------------------------------------------------------------------------*/
     217             : 
     218        3842 : void map_quant_weight_fx(
     219             :     const Word16 normqlg2[],  /* i  : quantized norms   Q0*/
     220             :     Word16 wnorm[],           /* o  : weighted norm     Q0*/
     221             :     const Word16 is_transient /* i  : transient flag    Q0*/
     222             : )
     223             : {
     224             :     Word16 sfm;
     225             :     Word16 tmp16;
     226             :     Word16 spe2q[NUM_MAP_BANDS];
     227             :     Word16 spe[NB_SFM];
     228             : 
     229             :     Word16 spe2q_max;
     230             :     Word16 spe2q_min;
     231             :     Word16 norm_max;
     232             :     Word16 shift;
     233             :     Word16 sum;
     234             :     Word16 k;
     235             :     Word16 lnb_sfm, num_map_bands;
     236             : 
     237        3842 :     lnb_sfm = NB_SFM;
     238        3842 :     move16();
     239        3842 :     num_map_bands = NUM_MAP_BANDS;
     240        3842 :     move16();
     241             : 
     242        3842 :     IF( is_transient != 0 )
     243             :     {
     244        4320 :         FOR( sfm = 0; sfm < lnb_sfm; sfm += 4 )
     245             :         {
     246        3960 :             sum = 0;
     247        3960 :             move16();
     248       19800 :             FOR( k = 0; k < 4; k++ )
     249             :             {
     250       15840 :                 sum = add( sum, normqlg2[sfm + k] ); /* Q0 */
     251             :             }
     252        3960 :             sum = shr( sum, 2 );
     253             : 
     254       19800 :             FOR( k = 0; k < 4; k++ )
     255             :             {
     256       15840 :                 spe[sfm + k] = sum; /* Q0 */
     257       15840 :                 move16();
     258             :             }
     259             :         }
     260             :     }
     261             :     ELSE
     262             :     {
     263      156690 :         FOR( sfm = 0; sfm < lnb_sfm; sfm++ )
     264             :         {
     265      153208 :             spe[sfm] = normqlg2[sfm]; /* Q0 */
     266      153208 :             move16();
     267             :         }
     268             :     }
     269             : 
     270        3842 :     sfm2mqb_fx( spe, spe2q, lnb_sfm );
     271             : 
     272       80682 :     FOR( sfm = 0; sfm < num_map_bands; sfm++ )
     273             :     {
     274       76840 :         spe2q[sfm] = sub( spe2q[sfm], 10 ); /* Q0 */
     275       76840 :         move16();
     276             :     }
     277             : 
     278             :     /* spectral smoothing */
     279       76840 :     FOR( sfm = 1; sfm < num_map_bands; sfm++ )
     280             :     {
     281       72998 :         tmp16 = sub( spe2q[sfm - 1], 4 );        /* Q0 */
     282       72998 :         spe2q[sfm] = s_max( spe2q[sfm], tmp16 ); /* Q0 */
     283       72998 :         move16();
     284             :     }
     285             : 
     286       76840 :     FOR( sfm = num_map_bands - 2; sfm >= 0; sfm-- )
     287             :     {
     288       72998 :         tmp16 = sub( spe2q[sfm + 1], 8 );        /* Q0 */
     289       72998 :         spe2q[sfm] = s_max( spe2q[sfm], tmp16 ); /* Q0 */
     290       72998 :         move16();
     291             :     }
     292             : 
     293       80682 :     FOR( sfm = 0; sfm < num_map_bands; sfm++ )
     294             :     {
     295       76840 :         spe2q[sfm] = s_max( spe2q[sfm], a_map[sfm] ); /* Q0 */
     296       76840 :         move16();
     297             :     }
     298             : 
     299             :     /* Saturate by the Absolute Threshold of Hearing */
     300        3842 :     spe2q_max = -32768;
     301        3842 :     move16();
     302        3842 :     spe2q_min = MAX_16;
     303        3842 :     move16();
     304             : 
     305       80682 :     FOR( sfm = 0; sfm < num_map_bands; sfm++ )
     306             :     {
     307       76840 :         spe2q[sfm] = sub( sfm_width[sfm], spe2q[sfm] ); /* Q0 */
     308       76840 :         move16();
     309       76840 :         spe2q_max = s_max( spe2q[sfm], spe2q_max ); /* Q0 */
     310       76840 :         spe2q_min = s_min( spe2q[sfm], spe2q_min ); /* Q0 */
     311             :     }
     312             : 
     313       80682 :     FOR( sfm = 0; sfm < num_map_bands; sfm++ )
     314             :     {
     315       76840 :         spe2q[sfm] = sub( spe2q[sfm], spe2q_min ); /* Q0 */
     316       76840 :         move16();
     317             :     }
     318             : 
     319        3842 :     spe2q_max = sub( spe2q_max, spe2q_min );
     320             : 
     321        3842 :     norm_max = norm_s( spe2q_max );
     322             : 
     323        3842 :     shift = sub( norm_max, 13 );
     324             : 
     325       80682 :     FOR( sfm = 0; sfm < num_map_bands; sfm++ )
     326             :     {
     327       76840 :         spe2q[sfm] = shl( spe2q[sfm], shift );
     328       76840 :         move16();
     329             :     }
     330             : 
     331        3842 :     mqb2sfm_fx( spe2q, spe, lnb_sfm );
     332             : 
     333        3842 :     IF( is_transient != 0 )
     334             :     {
     335        4320 :         FOR( sfm = 0; sfm < lnb_sfm; sfm += 4 )
     336             :         {
     337        3960 :             sum = 0;
     338        3960 :             move16();
     339       19800 :             FOR( k = 0; k < 4; k++ )
     340             :             {
     341       15840 :                 sum = add( sum, spe[sfm + k] ); /* Q0 */
     342             :             }
     343        3960 :             sum = shr( sum, 2 );
     344       19800 :             FOR( k = 0; k < 4; k++ )
     345             :             {
     346       15840 :                 spe[sfm + k] = sum; /* Q0 */
     347       15840 :                 move16();
     348             :             }
     349             :         }
     350             :     }
     351             : 
     352             :     /* modify the norms for bit-allocation */
     353      172890 :     FOR( sfm = 0; sfm < lnb_sfm; sfm++ )
     354             :     {
     355      169048 :         wnorm[sfm] = add( spe[sfm], normqlg2[sfm] ); /* Q0 */
     356      169048 :         move16();
     357             :     }
     358             : 
     359        3842 :     return;
     360             : }

Generated by: LCOV version 1.14