LCOV - code coverage report
Current view: top level - lib_lc3plus - quantize_spec.c (source / functions) Hit Total Coverage
Test: Coverage on main -- short test vectors @ 6c9ddc4024a9c0e1ecb8f643f114a84a0e26ec6b Lines: 0 108 0.0 %
Date: 2025-05-23 08:37:30 Functions: 0 2 0.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             : *                        ETSI TS 103 634 V1.5.1                               *
       3             : *              Low Complexity Communication Codec Plus (LC3plus)              *
       4             : *                                                                             *
       5             : * Copyright licence is solely granted through ETSI Intellectual Property      *
       6             : * Rights Policy, 3rd April 2019. No patent licence is granted by implication, *
       7             : * estoppel or otherwise.                                                      *
       8             : ******************************************************************************/
       9             : 
      10             : #include "options.h"
      11             : #include "wmc_auto.h"
      12             : #include "functions.h"
      13             : 
      14             : LC3_INT32 find_last_nz_pair(LC3_INT32 x[], LC3_INT32 length);
      15           0 : LC3_INT32 find_last_nz_pair(LC3_INT32 x[], LC3_INT32 length)
      16             : {
      17             :     LC3_INT32 last_nz, lobs[4]; LC3_INT32 stage, i;
      18             : 
      19           0 :     lobs[0] = 4;
      20             : 
      21           0 :     lobs[1] = (length >> 1); /* length/2 */
      22             : 
      23           0 :     lobs[2] = (lobs[1]+ (length >> 2));
      24             : 
      25           0 :     lobs[3] = (lobs[2]+ (length >> 3));
      26             : 
      27             : 
      28           0 :     last_nz = 0;
      29             : 
      30           0 :     i = length;
      31             : 
      32           0 :     for (stage = 3; stage >= 0; --stage)
      33             :     {
      34             :         /* unmapped kernel */
      35           0 :         for (; i >= lobs[stage]; i -= 2)
      36             :         {
      37           0 :             if (x[i - 2] != 0)
      38             :             {
      39           0 :                 last_nz = MAX(last_nz, i);
      40             :             }
      41           0 :             if (x[i - 1] != 0)
      42             :             {
      43           0 :                 last_nz = MAX(last_nz, i);
      44             :             }
      45             :         }
      46           0 :         if (last_nz > 0)
      47             :         {
      48           0 :             break;
      49             :         }
      50             :     }
      51             : 
      52           0 :     return MAX(last_nz, 2);
      53             : }
      54             : 
      55             : 
      56           0 : void processQuantizeSpec_fl(LC3_FLOAT x[], LC3_FLOAT gain, LC3_INT xq[], LC3_INT nt, LC3_INT totalBits, LC3_INT* nbits, LC3_INT* nbits2, LC3_INT fs,
      57             :                             LC3_INT* lastnzout, LC3_INT* codingdata, LC3_INT* lsbMode, LC3_INT mode, LC3_INT target, LC3_INT hrmode)
      58             : {
      59             : 
      60             :     LC3_INT rateFlag, i, lastnz2, m, maxlev, k;
      61             :     LC3_INT nbits_lsb;
      62             :     LC3_INT c;
      63             :     LC3_INT a, b, lev1, sym, t, pki;
      64             :     LC3_INT a1_msb, b1_msb;
      65           0 :     LC3_INT lastnz = 1, nt_half;
      66           0 :     LC3_FLOAT offset = 0.375;
      67             :         LC3_INT32 bits, bits2;
      68             :     LC3_FLOAT inv_gain;
      69             :         
      70           0 :     assert(target >= 0);
      71             : 
      72           0 :     nbits_lsb = 0;
      73             : 
      74           0 :     nt_half = nt >> 1;
      75           0 :     rateFlag = 0; c = 0;
      76             : 
      77           0 :     if (hrmode)
      78             :     {
      79           0 :         offset = 0.5;
      80             :     }
      81             : 
      82             :     /* Quantization */
      83           0 :     inv_gain = 1.0 / gain;
      84             :     
      85           0 :     for (i = 0; i < nt; i++) {
      86           0 :         if (x[i] > 0)
      87             :         {
      88           0 :             xq[i] =   (LC3_INT32) ( x[i] * inv_gain + offset);
      89             :         }
      90             :         else
      91             :         {
      92           0 :             xq[i] = -((LC3_INT32) (-x[i] * inv_gain + offset));
      93             :         }
      94           0 :         if (hrmode == 0) {
      95           0 :             assert(xq[i] <= 32767 && xq[i] >= -32768);
      96             :         }
      97             :     }
      98             : 
      99             :     /* Rate flag */
     100           0 :     if (fs != 96000 && (totalBits > (160 + FS2FS_IDX(fs) * 160)))
     101             :     {
     102           0 :         rateFlag = 512;
     103             :     }
     104             : 
     105             :     /* Init */
     106           0 :     if (fs != 96000 && (mode == 0 && (totalBits >= (480 + FS2FS_IDX(fs) * 160))))
     107             :     {
     108           0 :         mode = 1;
     109             :     }
     110             : 
     111             :     /* Last non-zero 2-tuple */
     112           0 :     for (i = nt - 2; i >= 2; i = i - 2) {
     113           0 :         if (xq[i + 1] != 0 || xq[i] != 0) {
     114           0 :             lastnz = i + 1;
     115           0 :             break;
     116             :         }
     117             :     }
     118             : 
     119           0 :     if (mode < 0)
     120             :     {
     121           0 :         lastnz2 = lastnz + 1;
     122             :     }
     123             :     else
     124             :     {
     125           0 :         lastnz2 = 2;
     126             :     }
     127             : 
     128           0 :     bits = bits2 = 0;
     129             : 
     130             :     /* Calculate number of estimated bits */
     131             : 
     132           0 :     for (k = 0; k < lastnz; k = k + 2)
     133             :     {
     134           0 :         t = c + rateFlag;
     135           0 :         if (k > nt_half)
     136             :         {
     137           0 :             t += 256;
     138             :         }
     139             : 
     140           0 :         codingdata[0] = t;
     141             : 
     142           0 :         a = abs(xq[k]);
     143           0 :         b = abs(xq[k + 1]);
     144           0 :         m = MAX(a, b);
     145             : 
     146           0 :         if (m == 0)
     147             :         {
     148           0 :             maxlev = -1;
     149             :         }
     150             :         else
     151             :         {
     152           0 :             maxlev = 29 - (clz_func(MAX(m, 3)) - 1);
     153             :         }
     154             : 
     155           0 :         codingdata[1] = maxlev;
     156             : 
     157           0 :         if (mode <= 0) {
     158           0 :             bits = bits + (MIN(a, 1) << 11);
     159           0 :             bits = bits + (MIN(b, 1) << 11);
     160             :         }
     161             : 
     162           0 :         lev1 = 0;
     163             : 
     164           0 :         while (MAX(a, b) >= 4)
     165             :         {
     166           0 :             pki  = ari_spec_lookup_fl[t + lev1 * 1024];
     167           0 :             bits = bits + ari_spec_bits_fl[pki][16];
     168             : 
     169           0 :             if (lev1 == 0 && mode > 0)
     170             :             {
     171           0 :                 nbits_lsb += 2;
     172             :             }
     173             :             else
     174             :             {
     175           0 :                 bits = bits + 2 * 2048;
     176             :             }
     177             : 
     178           0 :             a    = a >> 1;
     179           0 :             b    = b >> 1;
     180           0 :             lev1 = MIN(lev1 + 1, 3);
     181             :         }
     182             : 
     183           0 :         pki           = ari_spec_lookup_fl[t + lev1 * 1024];
     184           0 :         sym           = a + 4 * b;
     185           0 :         codingdata[2] = sym;
     186           0 :         codingdata   += 3;
     187           0 :         bits          = bits + ari_spec_bits_fl[pki][sym];
     188             : 
     189           0 :         if (mode > 0)
     190             :         {
     191           0 :             a1_msb = abs(xq[k]);
     192           0 :             b1_msb = abs(xq[k + 1]);
     193             : 
     194           0 :             if (lev1 > 0)
     195             :             {
     196           0 :                 a1_msb = a1_msb >> 1;
     197           0 :                 b1_msb = b1_msb >> 1;
     198             : 
     199           0 :                 if (a1_msb == 0 && xq[k] != 0)
     200             :                 {
     201           0 :                     nbits_lsb++;
     202             :                 }
     203             : 
     204           0 :                 if (b1_msb == 0 && xq[k + 1] != 0)
     205             :                 {
     206           0 :                     nbits_lsb++;
     207             :                 }
     208             :             }
     209             : 
     210           0 :             bits = bits + (MIN(a1_msb, 1) << 11);
     211           0 :             bits = bits + (MIN(b1_msb, 1) << 11);
     212             :         }
     213             : 
     214           0 :         if (mode >= 0 && (abs(xq[k]) != 0 || abs(xq[k + 1]) != 0) && bits <= target * 2048)
     215             :         {
     216           0 :             lastnz2 = k + 2;
     217           0 :             bits2   = bits;
     218             :         }
     219             : 
     220           0 :         lev1 = lev1 - 1;
     221             :         
     222           0 :         if (lev1 <= 0)
     223             :         {
     224           0 :             t = 1 + (a + b) * (lev1 + 2);
     225             :         }
     226             :         else
     227             :         {
     228           0 :             t = 13 + lev1;
     229             :         }
     230             : 
     231           0 :         c = (c & 15) * 16 + t;
     232             :     }
     233             : 
     234           0 :     *nbits = (bits + 2047) >> 11; // Exactly same as ceil((LC3_FLOAT)*nbits / 2048.0);
     235             : 
     236           0 :     if (mode >= 0)
     237             :     {
     238           0 :         *nbits2 = (bits2 + 2047) >> 11;  //ceil((LC3_FLOAT)*nbits2 / 2048.0);
     239             :     }
     240             :     else
     241             :     {
     242           0 :         *nbits2 = *nbits;
     243             :     }
     244             : 
     245           0 :     if (mode > 0)
     246             :     {
     247           0 :         *nbits  += nbits_lsb;
     248           0 :         *nbits2 += nbits_lsb;
     249             :     }
     250             : 
     251             :     /* Truncation of high-frequency coefficients */
     252           0 :     for (i = lastnz2; i <= lastnz; i++)
     253             :     {
     254           0 :         xq[i] = 0;
     255             :     }
     256             : 
     257             :     /* Truncation of LSBs */
     258           0 :     if (mode > 0 && *nbits > target)
     259             :     {
     260           0 :         *lsbMode = 1;
     261             :     }
     262             :     else
     263             :     {
     264           0 :         *lsbMode = 0;
     265             :     }
     266             : 
     267           0 :     *lastnzout = lastnz2;
     268           0 : }

Generated by: LCOV version 1.14