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 : /* Function expects already flipped window */ 15 1179617 : void ProcessingIMDCT_fl(LC3_FLOAT* y, LC3_INT yLen, const LC3_FLOAT* win, LC3_INT winLen, LC3_INT last_zeros, LC3_FLOAT* mem, LC3_FLOAT* x, Dct4* dct) 16 : { 17 : LC3_FLOAT x_tda[MAX_LEN], x_ov[2 * MAX_LEN]; 18 : LC3_INT i, j; 19 : 20 : /* Flip imdct window up to down */ 21 1179617 : i = winLen - 1; 22 1179617 : j = 0; 23 : 24 1179617 : dct4_apply(dct, y, x_tda); 25 : 26 1179617 : move_float(x_ov, &x_tda[yLen / 2], yLen / 2); 27 : 28 1179617 : j = yLen / 2; 29 148724537 : for (i = 0; i < yLen / 2; i++) { 30 147544920 : x_ov[j] = -x_tda[yLen - 1 - i]; 31 147544920 : j++; 32 : } 33 : 34 1179617 : j = yLen; 35 148724537 : for (i = 0; i < yLen / 2; i++) { 36 147544920 : x_ov[j] = -x_tda[yLen / 2 - 1 - i]; 37 147544920 : j++; 38 : } 39 : 40 1179617 : j = yLen + yLen / 2; 41 148724537 : for (i = 0; i < yLen / 2; i++) { 42 147544920 : x_ov[j] = -x_tda[i]; 43 147544920 : j++; 44 : } 45 : 46 591359297 : for (i = 0; i < winLen; i++) { 47 590179680 : x_ov[i] = x_ov[i] * win[winLen - 1 - i]; 48 : } 49 : 50 : /* Buffer update */ 51 1179617 : j = 0; 52 219500837 : for (i = last_zeros; i < yLen; i++) { 53 218321220 : x_ov[i] = x_ov[i] + mem[j]; 54 218321220 : j++; 55 : } 56 : 57 1179617 : move_float(&x[0], &x_ov[last_zeros], yLen); 58 : 59 1179617 : move_float(&mem[0], &x_ov[yLen + last_zeros], (winLen - (yLen + last_zeros))); 60 1179617 : } 61 : 62 0 : void ProcessingITDA_WIN_OLA_fl(LC3_FLOAT* x_tda, LC3_INT32 yLen, const LC3_FLOAT* win, LC3_INT32 winLen, LC3_INT32 last_zeros, LC3_FLOAT* mem, LC3_FLOAT* x) 63 : { 64 : LC3_FLOAT x_ov[2 * MAX_LEN]; 65 : LC3_INT32 i, j; 66 : 67 0 : move_float(x_ov, &x_tda[yLen / 2], yLen / 2); 68 : 69 0 : j = yLen / 2; 70 0 : for (i = 0; i < yLen / 2; i++) { 71 0 : x_ov[j] = -x_tda[yLen - 1 - i]; 72 0 : j++; 73 : } 74 : 75 0 : j = yLen; 76 0 : for (i = 0; i < yLen / 2; i++) { 77 0 : x_ov[j] = -x_tda[yLen / 2 - 1 - i]; 78 0 : j++; 79 : } 80 : 81 0 : j = yLen + yLen / 2; 82 0 : for (i = 0; i < yLen / 2; i++) { 83 0 : x_ov[j] = -x_tda[i]; 84 0 : j++; 85 : } 86 : 87 0 : for (i = 0; i < winLen; i++) { 88 0 : x_ov[i] = x_ov[i] * win[winLen - 1 - i]; 89 : } 90 : 91 : /* Buffer update */ 92 0 : j = 0; 93 : 94 0 : for (i = last_zeros; i < yLen; i++) { 95 0 : x[j] = x_ov[i] + mem[j]; 96 0 : j++; 97 : } 98 : 99 0 : move_float(&x[j], &x_ov[last_zeros+j], yLen-j); 100 : 101 0 : move_float(&mem[0], &x_ov[yLen + last_zeros], (winLen - (yLen + last_zeros))); 102 0 : }