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 2061584 : void processNoiseFilling_fl(LC3_FLOAT xq[], LC3_INT nfseed, LC3_INT fac_ns_idx, LC3_INT bw_stopband, LC3PLUS_FrameDuration frame_dms, LC3_FLOAT fac_ns_pc, LC3_INT spec_inv_idx) 15 : { 16 : LC3_INT zeroLines[MAX_LEN]; 17 2061584 : LC3_INT nTransWidth = 0, startOffset = 0, j, k, nzeros = 0, kZeroLines; 18 2061584 : LC3_FLOAT fac_ns = 0; 19 : 20 2061584 : switch (frame_dms) 21 : { 22 : #ifdef CR9_C_ADD_1p25MS 23 0 : case LC3PLUS_FRAME_DURATION_1p25MS: 24 0 : nTransWidth = 1; 25 0 : startOffset = 6; 26 0 : break; 27 : #endif 28 0 : case LC3PLUS_FRAME_DURATION_2p5MS: 29 0 : nTransWidth = 1; 30 0 : startOffset = 6; 31 0 : break; 32 1971600 : case LC3PLUS_FRAME_DURATION_5MS: 33 1971600 : nTransWidth = 1; 34 1971600 : startOffset = 12; 35 1971600 : break; 36 0 : case LC3PLUS_FRAME_DURATION_7p5MS: 37 0 : nTransWidth = 2; 38 0 : startOffset = 18; 39 0 : break; 40 89984 : case LC3PLUS_FRAME_DURATION_10MS: 41 89984 : nTransWidth = 3; 42 89984 : startOffset = 24; 43 89984 : break; 44 0 : case LC3PLUS_FRAME_DURATION_UNDEFINED: 45 0 : assert(0); 46 : } 47 : 48 2061584 : fac_ns = (8.0 - fac_ns_idx) / 16.0; 49 : 50 2061584 : j = 0; 51 : 52 6544688 : for (k = startOffset - nTransWidth; k < startOffset + nTransWidth; k++) 53 : { 54 4483104 : if (xq[k] != 0) 55 : { 56 4238200 : nzeros = -2 * nTransWidth - 1; 57 : } 58 4483104 : if (xq[k] == 0) 59 : { 60 244904 : nzeros ++; 61 : } 62 : } 63 400038816 : for (k = startOffset; k < bw_stopband - nTransWidth; k++) 64 : { 65 397977232 : if (xq[k + nTransWidth] != 0) 66 : { 67 329314053 : nzeros = -2 * nTransWidth - 1; 68 : } 69 397977232 : if (xq[k + nTransWidth] == 0) 70 : { 71 68663179 : nzeros ++; 72 : } 73 397977232 : if (nzeros >= 0) 74 : { 75 14613289 : zeroLines[j++] = k; 76 : } 77 : } 78 : 79 4303136 : for (k = bw_stopband - nTransWidth; k < bw_stopband; k++) 80 : { 81 2241552 : nzeros ++; 82 2241552 : if (nzeros >= 0) 83 : { 84 349074 : zeroLines[j++] = k; 85 : } 86 : } 87 : 88 2061584 : kZeroLines = j; 89 : 90 17023947 : for (k = 0; k < kZeroLines; k++) { 91 14962363 : nfseed = (13849 + (nfseed + 32768) * 31821) & 65535; 92 14962363 : nfseed -= 32768; 93 : 94 14962363 : if (nfseed >= 0) { 95 7484510 : if (zeroLines[k] < spec_inv_idx) 96 : { 97 7484510 : xq[zeroLines[k]] = fac_ns; 98 : } else { 99 0 : xq[zeroLines[k]] = fac_ns_pc; 100 : } 101 : } else { 102 7477853 : if (zeroLines[k] < spec_inv_idx) 103 : { 104 7477853 : xq[zeroLines[k]] = -fac_ns; 105 : } else { 106 0 : xq[zeroLines[k]] = -fac_ns_pc; 107 : } 108 : } 109 : } 110 : 111 2061584 : return; 112 : }