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 0 : 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 0 : i = winLen - 1;
22 0 : j = 0;
23 :
24 0 : dct4_apply(dct, y, x_tda);
25 :
26 0 : move_float(x_ov, &x_tda[yLen / 2], yLen / 2);
27 :
28 0 : j = yLen / 2;
29 0 : for (i = 0; i < yLen / 2; i++) {
30 0 : x_ov[j] = -x_tda[yLen - 1 - i];
31 0 : j++;
32 : }
33 :
34 0 : j = yLen;
35 0 : for (i = 0; i < yLen / 2; i++) {
36 0 : x_ov[j] = -x_tda[yLen / 2 - 1 - i];
37 0 : j++;
38 : }
39 :
40 0 : j = yLen + yLen / 2;
41 0 : for (i = 0; i < yLen / 2; i++) {
42 0 : x_ov[j] = -x_tda[i];
43 0 : j++;
44 : }
45 :
46 0 : for (i = 0; i < winLen; i++) {
47 0 : x_ov[i] = x_ov[i] * win[winLen - 1 - i];
48 : }
49 :
50 : /* Buffer update */
51 0 : j = 0;
52 0 : for (i = last_zeros; i < yLen; i++) {
53 0 : x_ov[i] = x_ov[i] + mem[j];
54 0 : j++;
55 : }
56 :
57 0 : move_float(&x[0], &x_ov[last_zeros], yLen);
58 :
59 0 : move_float(&mem[0], &x_ov[yLen + last_zeros], (winLen - (yLen + last_zeros)));
60 0 : }
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 : }
|