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 0 : void processNoiseFactor_fl(LC3_INT* fac_ns_idx, LC3_FLOAT x[], LC3_INT xq[], LC3_FLOAT gg, LC3_INT BW_cutoff_idx, LC3_INT frame_dms, 15 : LC3_INT target_bytes 16 : ) 17 : { 18 0 : LC3_INT sumZeroLines = 0, kZeroLines = 0, startOffset = 0, nTransWidth = 0, i = 0, j = 0, k = 0, m = 0, nzeros = 0; 19 0 : LC3_FLOAT fac_ns_unq = 0, idx = 0, nsf1 = 0, nsf2 = 0; 20 : LC3_INT zeroLines[MAX_LEN]; 21 : 22 0 : switch (frame_dms) 23 : { 24 0 : case 25: 25 0 : nTransWidth = 1; 26 0 : startOffset = 6; 27 0 : break; 28 0 : case 50: 29 0 : nTransWidth = 1; 30 0 : startOffset = 12; 31 0 : break; 32 0 : case 75: 33 0 : nTransWidth = 2; 34 0 : startOffset = 18; 35 0 : break; 36 0 : case 100: 37 0 : nTransWidth = 3; 38 0 : startOffset = 24; 39 0 : break; 40 : } 41 : 42 0 : for (k = startOffset - nTransWidth; k < startOffset + nTransWidth; k++) 43 : { 44 0 : if (xq[k] != 0) 45 : { 46 0 : nzeros = -2 * nTransWidth - 1; 47 : } 48 0 : if (xq[k] == 0) 49 : { 50 0 : nzeros ++; 51 : } 52 : } 53 0 : for (k = startOffset; k < BW_cutoff_idx - nTransWidth; k++) 54 : { 55 0 : if (xq[k + nTransWidth] != 0) 56 : { 57 0 : nzeros = -2 * nTransWidth - 1; 58 : } 59 0 : if (xq[k + nTransWidth] == 0) 60 : { 61 0 : nzeros ++; 62 : } 63 0 : if (nzeros >= 0) 64 : { 65 0 : zeroLines[j++] = k; 66 : } 67 : } 68 : 69 0 : for (k = BW_cutoff_idx - nTransWidth; k < BW_cutoff_idx; k++) 70 : { 71 0 : nzeros ++; 72 0 : if (nzeros >= 0) 73 : { 74 0 : zeroLines[j++] = k; 75 : } 76 : } 77 : 78 0 : if (j == 0) { 79 0 : fac_ns_unq = 0; 80 : } 81 : else 82 : { 83 0 : kZeroLines = j; 84 : 85 0 : fac_ns_unq = 0; 86 0 : for (j = 0; j < kZeroLines; j++) { 87 0 : fac_ns_unq += LC3_FABS(x[zeroLines[j]]); 88 : } 89 : 90 0 : fac_ns_unq /= (gg) * kZeroLines; 91 : 92 : 93 : 94 0 : if (kZeroLines > 1 && target_bytes <= 20 && frame_dms == 100) { 95 : 96 0 : j = 0, k = 0, nsf1 = 0, nsf2 = 0, sumZeroLines = 0; 97 : 98 0 : for (i = 0; i < kZeroLines; i++) { 99 0 : sumZeroLines += zeroLines[i]; 100 : } 101 : 102 0 : m = floor(sumZeroLines / kZeroLines); 103 : 104 0 : for (i = 0; i < kZeroLines; i++) { 105 0 : if (zeroLines[i] <= m) { 106 0 : j++; 107 0 : nsf1 += LC3_FABS(x[zeroLines[i]]); 108 : } 109 : else { 110 0 : nsf2 += LC3_FABS(x[zeroLines[i]]); 111 0 : k++; 112 : } 113 : } 114 : 115 0 : nsf1 /= (gg) * j; 116 0 : nsf2 /= (gg) * k; 117 : 118 0 : fac_ns_unq = MIN(nsf1, nsf2); 119 : } 120 : 121 : } 122 : 123 0 : idx = round(8 - 16 * fac_ns_unq); 124 0 : idx = MIN(MAX(idx, 0), 7); 125 : 126 0 : *fac_ns_idx = idx; 127 0 : }