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

Generated by: LCOV version 1.14