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 590506 : 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 590506 : LC3_INT sumZeroLines = 0, kZeroLines = 0, startOffset = 0, nTransWidth = 0, i = 0, j = 0, k = 0, m = 0, nzeros = 0; 19 590506 : LC3_FLOAT fac_ns_unq = 0, idx = 0, nsf1 = 0, nsf2 = 0; 20 : LC3_INT zeroLines[MAX_LEN]; 21 : 22 590506 : 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 0 : case LC3PLUS_FRAME_DURATION_2p5MS: 31 0 : nTransWidth = 1; 32 0 : startOffset = 6; 33 0 : break; 34 558314 : case LC3PLUS_FRAME_DURATION_5MS: 35 558314 : nTransWidth = 1; 36 558314 : startOffset = 12; 37 558314 : break; 38 0 : case LC3PLUS_FRAME_DURATION_7p5MS: 39 0 : nTransWidth = 2; 40 0 : startOffset = 18; 41 0 : break; 42 32192 : case LC3PLUS_FRAME_DURATION_10MS: 43 32192 : nTransWidth = 3; 44 32192 : startOffset = 24; 45 32192 : break; 46 0 : case LC3PLUS_FRAME_DURATION_UNDEFINED: 47 0 : assert(0); 48 : } 49 : 50 1900286 : for (k = startOffset - nTransWidth; k < startOffset + nTransWidth; k++) 51 : { 52 1309780 : if (xq[k] != 0) 53 : { 54 1275129 : nzeros = -2 * nTransWidth - 1; 55 : } 56 1309780 : if (xq[k] == 0) 57 : { 58 34651 : nzeros ++; 59 : } 60 : } 61 116033000 : for (k = startOffset; k < BW_cutoff_idx - nTransWidth; k++) 62 : { 63 115442494 : if (xq[k + nTransWidth] != 0) 64 : { 65 94841857 : nzeros = -2 * nTransWidth - 1; 66 : } 67 115442494 : if (xq[k + nTransWidth] == 0) 68 : { 69 20600637 : nzeros ++; 70 : } 71 115442494 : if (nzeros >= 0) 72 : { 73 3957668 : zeroLines[j++] = k; 74 : } 75 : } 76 : 77 1245396 : for (k = BW_cutoff_idx - nTransWidth; k < BW_cutoff_idx; k++) 78 : { 79 654890 : nzeros ++; 80 654890 : if (nzeros >= 0) 81 : { 82 113862 : zeroLines[j++] = k; 83 : } 84 : } 85 : 86 590506 : if (j == 0) { 87 325699 : fac_ns_unq = 0; 88 : } 89 : else 90 : { 91 264807 : kZeroLines = j; 92 : 93 264807 : fac_ns_unq = 0; 94 4336337 : for (j = 0; j < kZeroLines; j++) { 95 4071530 : fac_ns_unq += LC3_FABS(x[zeroLines[j]]); 96 : } 97 : 98 264807 : fac_ns_unq /= (gg) * kZeroLines; 99 : 100 : 101 : 102 264807 : 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 590506 : idx = round(8 - 16 * fac_ns_unq); 132 590506 : idx = MIN(MAX(idx, 0), 7); 133 : 134 590506 : *fac_ns_idx = idx; 135 590506 : }