/src/libxaac/decoder/ixheaacd_acelp_tools.c
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * * |
3 | | * Copyright (C) 2018 The Android Open Source Project |
4 | | * |
5 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
6 | | * you may not use this file except in compliance with the License. |
7 | | * You may obtain a copy of the License at: |
8 | | * |
9 | | * http://www.apache.org/licenses/LICENSE-2.0 |
10 | | * |
11 | | * Unless required by applicable law or agreed to in writing, software |
12 | | * distributed under the License is distributed on an "AS IS" BASIS, |
13 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
14 | | * See the License for the specific language governing permissions and |
15 | | * limitations under the License. |
16 | | * |
17 | | ***************************************************************************** |
18 | | * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
19 | | */ |
20 | | #include <math.h> |
21 | | #include <memory.h> |
22 | | #include "ixheaac_type_def.h" |
23 | | |
24 | | #include "ixheaacd_cnst.h" |
25 | | #include "ixheaac_constants.h" |
26 | | #include "ixheaac_basic_ops32.h" |
27 | | #include "ixheaac_basic_ops40.h" |
28 | | |
29 | | const FLOAT32 ixheaacd_gamma_table[17] = { |
30 | | 1.0f, 0.92f, 0.8464f, 0.778688f, 0.716393f, 0.659082f, |
31 | | 0.606355f, 0.557847f, 0.513219f, 0.472161f, 0.434389f, 0.399637f, |
32 | | 0.367666f, 0.338253f, 0.311193f, 0.286298f, 0.263394f}; |
33 | | |
34 | 0 | WORD16 ixheaacd_rand_gen(WORD16 *seed) { |
35 | 0 | *seed = (WORD16)(*seed * 31821L + 13849L); |
36 | 0 | return (*seed); |
37 | 0 | } |
38 | | |
39 | | VOID ixheaacd_preemphsis_tool(WORD32 *signal, WORD32 mu, WORD32 len, |
40 | 0 | WORD32 mem) { |
41 | 0 | WORD32 i; |
42 | 0 | for (i = len - 1; i > 0; i--) { |
43 | 0 | signal[i] -= (WORD32)ixheaac_mul32_sh(mu, signal[i - 1], 16); |
44 | 0 | } |
45 | 0 | signal[0] -= (WORD32)ixheaac_mul32_sh(mu, mem, 16); |
46 | 0 | return; |
47 | 0 | } |
48 | | |
49 | | VOID ixheaacd_preemphsis_tool_float(FLOAT32 *signal, FLOAT32 mu, WORD32 len, |
50 | 943k | FLOAT32 mem) { |
51 | 943k | WORD32 i; |
52 | 123M | for (i = len - 1; i > 0; i--) { |
53 | 122M | signal[i] = signal[i] - mu * signal[i - 1]; |
54 | 122M | } |
55 | 943k | signal[0] -= mu * mem; |
56 | 943k | return; |
57 | 943k | } |
58 | | |
59 | 385k | VOID ixheaacd_deemphsis_tool(FLOAT32 *signal, WORD32 len, FLOAT32 mem) { |
60 | 385k | WORD32 i; |
61 | 385k | signal[0] = signal[0] + PREEMPH_FILT_FAC * mem; |
62 | 65.7M | for (i = 1; i < len; i++) { |
63 | 65.3M | signal[i] = signal[i] + PREEMPH_FILT_FAC * signal[i - 1]; |
64 | 65.3M | } |
65 | 385k | return; |
66 | 385k | } |
67 | | |
68 | 80.7k | VOID ixheaacd_lpc_wt_synthesis_tool(FLOAT32 a[], FLOAT32 x[], WORD32 l) { |
69 | 80.7k | FLOAT32 s; |
70 | 80.7k | WORD32 i, j; |
71 | | |
72 | 9.31M | for (i = 0; i < l; i++) { |
73 | 9.23M | s = x[i]; |
74 | 46.1M | for (j = 1; j <= ORDER; j += 4) { |
75 | 36.9M | s -= (a[j] * ixheaacd_gamma_table[j]) * x[i - j]; |
76 | 36.9M | s -= (a[j + 1] * ixheaacd_gamma_table[j + 1]) * x[i - (j + 1)]; |
77 | 36.9M | s -= (a[j + 2] * ixheaacd_gamma_table[j + 2]) * x[i - (j + 2)]; |
78 | 36.9M | s -= (a[j + 3] * ixheaacd_gamma_table[j + 3]) * x[i - (j + 3)]; |
79 | 36.9M | } |
80 | 9.23M | x[i] = s; |
81 | 9.23M | } |
82 | | |
83 | 80.7k | return; |
84 | 80.7k | } |
85 | | |
86 | | VOID ixheaacd_synthesis_tool_float(FLOAT32 a[], FLOAT32 x[], FLOAT32 y[], |
87 | 757k | WORD32 l, FLOAT32 mem[]) { |
88 | 757k | FLOAT32 buf[LEN_FRAME * 2]; |
89 | 757k | FLOAT32 s; |
90 | 757k | FLOAT32 *yy; |
91 | 757k | WORD32 i, j; |
92 | 757k | memcpy(buf, mem, ORDER * sizeof(FLOAT32)); |
93 | 757k | yy = &buf[ORDER]; |
94 | 61.1M | for (i = 0; i < l; i++) { |
95 | 60.4M | s = x[i]; |
96 | 302M | for (j = 1; j <= ORDER; j += 4) { |
97 | 241M | s -= a[j] * yy[i - j]; |
98 | 241M | s -= a[j + 1] * yy[i - (j + 1)]; |
99 | 241M | s -= a[j + 2] * yy[i - (j + 2)]; |
100 | 241M | s -= a[j + 3] * yy[i - (j + 3)]; |
101 | 241M | } |
102 | 60.4M | yy[i] = s; |
103 | 60.4M | y[i] = s; |
104 | 60.4M | } |
105 | | |
106 | 757k | return; |
107 | 757k | } |
108 | | |
109 | 212k | VOID ixheaacd_synthesis_tool_float1(FLOAT32 a[], FLOAT32 x[], WORD32 l) { |
110 | 212k | FLOAT32 s; |
111 | 212k | WORD32 i, j; |
112 | 27.0M | for (i = 0; i < l; i++) { |
113 | 26.8M | s = x[i]; |
114 | 134M | for (j = 1; j <= ORDER; j += 4) { |
115 | 107M | s -= a[j] * x[i - j]; |
116 | 107M | s -= a[j + 1] * x[i - (j + 1)]; |
117 | 107M | s -= a[j + 2] * x[i - (j + 2)]; |
118 | 107M | s -= a[j + 3] * x[i - (j + 3)]; |
119 | 107M | } |
120 | 26.8M | x[i] = s; |
121 | 26.8M | } |
122 | | |
123 | 212k | return; |
124 | 212k | } |
125 | | |
126 | | VOID ixheaacd_residual_tool(WORD32 *a, WORD32 *x, WORD32 *y, WORD32 l, |
127 | 0 | WORD32 count) { |
128 | 0 | WORD32 s; |
129 | 0 | WORD32 i, j; |
130 | 0 | WORD32 n = l * count; |
131 | |
|
132 | 0 | for (i = 0; i < n; i++) { |
133 | 0 | s = x[i]; |
134 | 0 | for (j = 1; j <= 16; j++) |
135 | 0 | s += (WORD32)ixheaac_mul32_sh(a[j], x[i - j], 24); |
136 | 0 | y[i] = s; |
137 | 0 | } |
138 | |
|
139 | 0 | return; |
140 | 0 | } |
141 | | |
142 | | VOID ixheaacd_residual_tool_float(FLOAT32 *a, FLOAT32 *x, FLOAT32 *y, WORD32 l, |
143 | 338k | WORD32 loop_count) { |
144 | 338k | FLOAT32 s; |
145 | 338k | WORD32 i, j; |
146 | 797k | for (j = 0; j < loop_count; j++) { |
147 | 59.2M | for (i = 0; i < l; i++) { |
148 | 58.8M | s = x[i]; |
149 | 58.8M | s += a[1] * x[i - 1]; |
150 | 58.8M | s += a[2] * x[i - 2]; |
151 | 58.8M | s += a[3] * x[i - 3]; |
152 | 58.8M | s += a[4] * x[i - 4]; |
153 | 58.8M | s += a[5] * x[i - 5]; |
154 | 58.8M | s += a[6] * x[i - 6]; |
155 | 58.8M | s += a[7] * x[i - 7]; |
156 | 58.8M | s += a[8] * x[i - 8]; |
157 | 58.8M | s += a[9] * x[i - 9]; |
158 | 58.8M | s += a[10] * x[i - 10]; |
159 | 58.8M | s += a[11] * x[i - 11]; |
160 | 58.8M | s += a[12] * x[i - 12]; |
161 | 58.8M | s += a[13] * x[i - 13]; |
162 | 58.8M | s += a[14] * x[i - 14]; |
163 | 58.8M | s += a[15] * x[i - 15]; |
164 | 58.8M | s += a[16] * x[i - 16]; |
165 | 58.8M | y[i] = s; |
166 | 58.8M | } |
167 | 459k | a += 17; |
168 | 459k | x += l; |
169 | 459k | y += l; |
170 | 459k | } |
171 | 338k | return; |
172 | 338k | } |
173 | | |
174 | | VOID ixheaacd_residual_tool_float1(FLOAT32 *a, FLOAT32 *x, FLOAT32 *y, WORD32 l, |
175 | 41.9k | WORD32 loop_count) { |
176 | 41.9k | FLOAT32 s; |
177 | 41.9k | WORD32 i, j; |
178 | 339k | for (j = 0; j < loop_count; j++) { |
179 | 19.3M | for (i = 0; i < l; i++) { |
180 | 19.0M | s = x[i]; |
181 | 19.0M | s += a[1] * x[i - 1]; |
182 | 19.0M | s += a[2] * x[i - 2]; |
183 | 19.0M | s += a[3] * x[i - 3]; |
184 | 19.0M | s += a[4] * x[i - 4]; |
185 | 19.0M | s += a[5] * x[i - 5]; |
186 | 19.0M | s += a[6] * x[i - 6]; |
187 | 19.0M | s += a[7] * x[i - 7]; |
188 | 19.0M | s += a[8] * x[i - 8]; |
189 | 19.0M | s += a[9] * x[i - 9]; |
190 | 19.0M | s += a[10] * x[i - 10]; |
191 | 19.0M | s += a[11] * x[i - 11]; |
192 | 19.0M | s += a[12] * x[i - 12]; |
193 | 19.0M | s += a[13] * x[i - 13]; |
194 | 19.0M | s += a[14] * x[i - 14]; |
195 | 19.0M | s += a[15] * x[i - 15]; |
196 | 19.0M | s += a[16] * x[i - 16]; |
197 | 19.0M | y[i] = s; |
198 | 19.0M | } |
199 | 297k | x += l; |
200 | 297k | y += l; |
201 | 297k | } |
202 | 41.9k | return; |
203 | 41.9k | } |