LCOV - code coverage report
Current view: top level - lib_lc3plus - noise_factor.c (source / functions) Hit Total Coverage
Test: Coverage on main -- short test vectors @ 867217ee32c8e8cd2cf5aae69e60c58e00160b49 Lines: 44 67 65.7 %
Date: 2025-12-13 06:47:12 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             : *                        ETSI TS 103 634 V1.6.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     1189311 : void processNoiseFactor_fl(LC3_INT* fac_ns_idx, LC3_FLOAT x[], LC3_INT xq[], LC3_FLOAT gg, LC3_INT BW_cutoff_idx, LC3PLUS_FrameDuration frame_dms,
      15             :                            LC3_INT target_bytes
      16             : )
      17             : {
      18     1189311 :     LC3_INT sumZeroLines = 0, kZeroLines = 0, startOffset = 0, nTransWidth = 0, i = 0, j = 0, k = 0, m = 0, nzeros = 0;
      19     1189311 :     LC3_FLOAT fac_ns_unq = 0, idx = 0, nsf1 = 0, nsf2 = 0;
      20             :     LC3_INT   zeroLines[MAX_LEN];
      21             : 
      22     1189311 :     switch (frame_dms)
      23             :     {
      24             : #ifdef CR9_C_ADD_1p25MS
      25           0 :         case LC3PLUS_FRAME_DURATION_1p25MS:
      26           0 :             nTransWidth = 1;
      27           0 :             startOffset = 6;
      28           0 :             break;
      29             : #endif
      30          16 :         case LC3PLUS_FRAME_DURATION_2p5MS:
      31          16 :             nTransWidth = 1;
      32          16 :             startOffset = 6;
      33          16 :             break;
      34     1139323 :         case LC3PLUS_FRAME_DURATION_5MS:
      35     1139323 :             nTransWidth = 1;
      36     1139323 :             startOffset = 12;
      37     1139323 :             break;
      38           0 :         case LC3PLUS_FRAME_DURATION_7p5MS:
      39           0 :             nTransWidth = 2;
      40           0 :             startOffset = 18;
      41           0 :             break;
      42       49972 :         case LC3PLUS_FRAME_DURATION_10MS:
      43       49972 :             nTransWidth = 3;
      44       49972 :             startOffset = 24;
      45       49972 :             break;
      46           0 :         case LC3PLUS_FRAME_DURATION_UNDEFINED:
      47           0 :             assert(0);
      48             :     }
      49             : 
      50     3767821 :     for (k = startOffset - nTransWidth; k < startOffset + nTransWidth; k++)
      51             :     {
      52     2578510 :         if (xq[k] != 0)
      53             :         {
      54     2352234 :             nzeros = -2 * nTransWidth - 1;
      55             :         }
      56     2578510 :         if (xq[k] == 0)
      57             :         {
      58      226276 :             nzeros ++;
      59             :         }
      60             :     }
      61   229763996 :     for (k = startOffset; k < BW_cutoff_idx - nTransWidth; k++)
      62             :     {
      63   228574685 :         if (xq[k + nTransWidth] != 0)
      64             :         {
      65   186454884 :             nzeros = -2 * nTransWidth - 1;
      66             :         }
      67   228574685 :         if (xq[k + nTransWidth] == 0)
      68             :         {
      69    42119801 :             nzeros ++;
      70             :         }
      71   228574685 :         if (nzeros >= 0)
      72             :         {
      73    11904450 :             zeroLines[j++] = k;
      74             :         }
      75             :     }
      76             : 
      77     2478566 :     for (k = BW_cutoff_idx - nTransWidth; k < BW_cutoff_idx; k++)
      78             :     {
      79     1289255 :         nzeros ++;
      80     1289255 :         if (nzeros >= 0)
      81             :         {
      82      219751 :             zeroLines[j++] = k;
      83             :         }
      84             :     }
      85             : 
      86     1189311 :     if (j == 0) {
      87      623421 :         fac_ns_unq = 0;
      88             :     }
      89             :     else
      90             :     {
      91      565890 :         kZeroLines = j;
      92             : 
      93      565890 :         fac_ns_unq = 0;
      94    12690091 :         for (j = 0; j < kZeroLines; j++) {
      95    12124201 :             fac_ns_unq += LC3_FABS(x[zeroLines[j]]);
      96             :         }
      97             : 
      98      565890 :         fac_ns_unq /= (gg) * kZeroLines;
      99             : 
     100             : 
     101             : 
     102      565890 :         if (kZeroLines > 1 && target_bytes <= 20 && frame_dms == LC3PLUS_FRAME_DURATION_10MS) {
     103             : 
     104           0 :             j = 0, k = 0, nsf1 = 0, nsf2 = 0, sumZeroLines = 0;
     105             : 
     106           0 :             for (i = 0; i < kZeroLines; i++) {
     107           0 :                 sumZeroLines += zeroLines[i];
     108             :             }
     109             : 
     110           0 :             m = floor(sumZeroLines / kZeroLines);
     111             : 
     112           0 :             for (i = 0; i < kZeroLines; i++) {
     113           0 :                 if (zeroLines[i] <= m) {
     114           0 :                     j++;
     115           0 :                     nsf1 += LC3_FABS(x[zeroLines[i]]);
     116             :                 }
     117             :                 else {
     118           0 :                     nsf2 += LC3_FABS(x[zeroLines[i]]);
     119           0 :                     k++;
     120             :                 }
     121             :             }
     122             : 
     123           0 :             nsf1 /= (gg) * j;
     124           0 :             nsf2 /= (gg) * k; 
     125             : 
     126           0 :             fac_ns_unq = MIN(nsf1, nsf2);
     127             :         }
     128             : 
     129             :     }
     130             : 
     131     1189311 :     idx = round(8 - 16 * fac_ns_unq);
     132     1189311 :     idx = MIN(MAX(idx, 0), 7);
     133             : 
     134     1189311 :     *fac_ns_idx = idx;
     135     1189311 : }

Generated by: LCOV version 1.14