/src/libxaac/encoder/ixheaace_mps_polyphase.c
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * * |
3 | | * Copyright (C) 2023 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 | | |
21 | | #include <string.h> |
22 | | #include <math.h> |
23 | | #include "ixheaac_type_def.h" |
24 | | #include "ixheaace_mps_common_fix.h" |
25 | | #include "ixheaace_mps_defines.h" |
26 | | #include "ixheaace_mps_common_define.h" |
27 | | #include "ixheaace_bitbuffer.h" |
28 | | |
29 | | #include "ixheaace_mps_struct_def.h" |
30 | | #include "ixheaace_mps_sac_polyphase.h" |
31 | | #include "ixheaace_mps_sac_hybfilter.h" |
32 | | #include "ixheaace_mps_spatial_bitstream.h" |
33 | | #include "ixheaace_mps_bitstream.h" |
34 | | #include "ixheaace_mps_param_extract.h" |
35 | | #include "ixheaace_mps_tree.h" |
36 | | #include "ixheaace_mps_rom.h" |
37 | | |
38 | 153M | static VOID ixheaace_mps_bit_reversal(FLOAT32 *a, FLOAT32 *b) { |
39 | 153M | FLOAT32 temp; |
40 | 153M | temp = *a; |
41 | 153M | *a = *b; |
42 | 153M | *b = temp; |
43 | 153M | } |
44 | | |
45 | 181M | static VOID ixheaace_mps_bit_add_sub1(FLOAT32 *a, FLOAT32 *b) { |
46 | 181M | FLOAT32 temp; |
47 | 181M | temp = *a + *b; |
48 | 181M | *b = *b - *a; |
49 | 181M | *a = temp; |
50 | 181M | } |
51 | | |
52 | 265M | static VOID ixheaace_mps_bit_add_sub2(FLOAT32 *a, FLOAT32 *b) { |
53 | 265M | FLOAT32 temp; |
54 | 265M | temp = *a + *b; |
55 | 265M | *b = *a - *b; |
56 | 265M | *a = temp; |
57 | 265M | } |
58 | | |
59 | 875k | static VOID ixheaace_mps_fft32(FLOAT32 *subband) { |
60 | 875k | FLOAT32 val_0, val_1, val_2, val_3, val_4, val_5, val_6, val_7, val_8, val_9, val_10, val_11, |
61 | 875k | val_12, val_13, val_14, val_15; |
62 | 875k | FLOAT32 val_1_0, val_1_1, val_1_2, val_1_3, val_1_4, val_1_5, val_1_6, val_1_7, val_1_8, |
63 | 875k | val_1_9, val_1_10, val_1_11, val_1_12, val_1_13, val_1_14, val_1_15; |
64 | 875k | FLOAT32 val_2_0, val_2_1, val_2_2, val_2_3, val_2_4, val_2_5, val_2_6, val_2_7, val_2_8, |
65 | 875k | val_2_9, val_2_10, val_2_11, val_2_12, val_2_13, val_2_14, val_2_15; |
66 | 875k | FLOAT32 val_3_0, val_3_1, val_3_2, val_3_3, val_3_4, val_3_5, val_3_6, val_3_7, val_3_8, |
67 | 875k | val_3_9, val_3_10, val_3_11, val_3_12, val_3_13, val_3_14, val_3_15; |
68 | 875k | FLOAT32 val_3_16, val_3_17, val_3_18, val_3_19, val_3_20, val_3_21, val_3_22, val_3_23, |
69 | 875k | val_3_24, val_3_25, val_3_26, val_3_27, val_3_28, val_3_29, val_3_30, val_3_31; |
70 | 875k | FLOAT32 val_4_0, val_4_1, val_4_2, val_4_3, val_4_4, val_4_5, val_4_6, val_4_7, val_4_8, |
71 | 875k | val_4_9, val_4_10, val_4_11, val_4_12, val_4_13, val_4_14, val_4_15; |
72 | | |
73 | 875k | val_2_0 = subband[2] - subband[34]; |
74 | 875k | val_2_1 = subband[3] - subband[35]; |
75 | 875k | val_3_0 = subband[0] + subband[32]; |
76 | 875k | val_3_1 = subband[1] + subband[33]; |
77 | 875k | val_3_2 = subband[2] + subband[34]; |
78 | 875k | val_3_3 = subband[3] + subband[35]; |
79 | | |
80 | 875k | val_2_2 = subband[6] - subband[38]; |
81 | 875k | val_2_3 = subband[7] - subband[39]; |
82 | 875k | val_3_4 = subband[4] + subband[36]; |
83 | 875k | val_3_5 = subband[5] + subband[37]; |
84 | 875k | val_3_6 = subband[6] + subband[38]; |
85 | 875k | val_3_7 = subband[7] + subband[39]; |
86 | | |
87 | 875k | val_2_4 = subband[10] - subband[42]; |
88 | 875k | val_2_5 = subband[11] - subband[43]; |
89 | 875k | val_3_8 = subband[8] + subband[40]; |
90 | 875k | val_3_9 = subband[9] + subband[41]; |
91 | 875k | val_3_10 = subband[10] + subband[42]; |
92 | 875k | val_3_11 = subband[11] + subband[43]; |
93 | | |
94 | 875k | val_2_6 = subband[14] - subband[46]; |
95 | 875k | val_2_7 = subband[15] - subband[47]; |
96 | 875k | val_3_12 = subband[12] + subband[44]; |
97 | 875k | val_3_13 = subband[13] + subband[45]; |
98 | 875k | val_3_14 = subband[14] + subband[46]; |
99 | 875k | val_3_15 = subband[15] + subband[47]; |
100 | | |
101 | 875k | val_2_8 = subband[18] - subband[50]; |
102 | 875k | val_2_9 = subband[19] - subband[51]; |
103 | 875k | val_3_16 = subband[16] + subband[48]; |
104 | 875k | val_3_17 = subband[17] + subband[49]; |
105 | 875k | val_3_18 = subband[18] + subband[50]; |
106 | 875k | val_3_19 = subband[19] + subband[51]; |
107 | | |
108 | 875k | val_2_10 = subband[22] - subband[54]; |
109 | 875k | val_2_11 = subband[23] - subband[55]; |
110 | 875k | val_3_20 = subband[20] + subband[52]; |
111 | 875k | val_3_21 = subband[21] + subband[53]; |
112 | 875k | val_3_22 = subband[22] + subband[54]; |
113 | 875k | val_3_23 = subband[23] + subband[55]; |
114 | | |
115 | 875k | val_2_12 = subband[26] - subband[58]; |
116 | 875k | val_2_13 = subband[27] - subband[59]; |
117 | 875k | val_3_24 = subband[24] + subband[56]; |
118 | 875k | val_3_25 = subband[25] + subband[57]; |
119 | 875k | val_3_26 = subband[26] + subband[58]; |
120 | 875k | val_3_27 = subband[27] + subband[59]; |
121 | | |
122 | 875k | val_2_14 = subband[30] - subband[62]; |
123 | 875k | val_2_15 = subband[31] - subband[63]; |
124 | 875k | val_3_28 = subband[28] + subband[60]; |
125 | 875k | val_3_29 = subband[29] + subband[61]; |
126 | 875k | val_3_30 = subband[30] + subband[62]; |
127 | 875k | val_3_31 = subband[31] + subband[63]; |
128 | | |
129 | 875k | val_4_1 = -(val_2_0 + val_2_14); |
130 | 875k | val_4_2 = val_2_0 - val_2_14; |
131 | 875k | val_4_0 = val_2_1 + val_2_15; |
132 | 875k | val_4_3 = val_2_1 - val_2_15; |
133 | 875k | val_4_5 = -(val_2_2 + val_2_12); |
134 | 875k | val_4_6 = val_2_2 - val_2_12; |
135 | 875k | val_4_4 = val_2_3 + val_2_13; |
136 | 875k | val_4_7 = val_2_3 - val_2_13; |
137 | 875k | val_4_9 = -(val_2_4 + val_2_10); |
138 | 875k | val_4_10 = val_2_4 - val_2_10; |
139 | 875k | val_4_8 = val_2_5 + val_2_11; |
140 | 875k | val_4_11 = val_2_5 - val_2_11; |
141 | 875k | val_4_13 = -(val_2_6 + val_2_8); |
142 | 875k | val_4_14 = val_2_6 - val_2_8; |
143 | 875k | val_4_12 = val_2_7 + val_2_9; |
144 | 875k | val_4_15 = val_2_7 - val_2_9; |
145 | | |
146 | 875k | val_2_0 = val_4_0 * fft_c[3] + val_4_4 * fft_c[2] + val_4_8 * fft_c[1] + val_4_12 * fft_c[0]; |
147 | | |
148 | 875k | val_2_4 = val_4_0 * fft_c[2] + val_4_4 * fft_c[0] + val_4_8 * fft_c[3] - val_4_12 * fft_c[1]; |
149 | 875k | val_2_8 = val_4_0 * fft_c[1] + val_4_4 * fft_c[3] - val_4_8 * fft_c[0] + val_4_12 * fft_c[2]; |
150 | | |
151 | 875k | val_2_12 = val_4_0 * fft_c[0] - val_4_4 * fft_c[1] + val_4_8 * fft_c[2] - val_4_12 * fft_c[3]; |
152 | | |
153 | 875k | val_2_1 = val_4_1 * fft_c[3] + val_4_5 * fft_c[2] + val_4_9 * fft_c[1] + val_4_13 * fft_c[0]; |
154 | | |
155 | 875k | val_2_5 = val_4_1 * fft_c[2] + val_4_5 * fft_c[0] + val_4_9 * fft_c[3] - val_4_13 * fft_c[1]; |
156 | 875k | val_2_9 = val_4_1 * fft_c[1] + val_4_5 * fft_c[3] - val_4_9 * fft_c[0] + val_4_13 * fft_c[2]; |
157 | | |
158 | 875k | val_2_13 = val_4_1 * fft_c[0] - val_4_5 * fft_c[1] + val_4_9 * fft_c[2] - val_4_13 * fft_c[3]; |
159 | | |
160 | 875k | val_2_2 = val_4_2 * fft_c[0] + val_4_6 * fft_c[1] + val_4_10 * fft_c[2] + val_4_14 * fft_c[3]; |
161 | | |
162 | 875k | val_2_6 = val_4_2 * fft_c[1] - val_4_6 * fft_c[3] - val_4_10 * fft_c[0] - val_4_14 * fft_c[2]; |
163 | | |
164 | 875k | val_2_10 = val_4_2 * fft_c[2] - val_4_6 * fft_c[0] + val_4_10 * fft_c[3] + val_4_14 * fft_c[1]; |
165 | | |
166 | 875k | val_2_14 = val_4_2 * fft_c[3] - val_4_6 * fft_c[2] + val_4_10 * fft_c[1] - val_4_14 * fft_c[0]; |
167 | | |
168 | 875k | val_2_3 = val_4_3 * fft_c[0] + val_4_7 * fft_c[1] + val_4_11 * fft_c[2] + val_4_15 * fft_c[3]; |
169 | | |
170 | 875k | val_2_7 = val_4_3 * fft_c[1] - val_4_7 * fft_c[3] - val_4_11 * fft_c[0] - val_4_15 * fft_c[2]; |
171 | | |
172 | 875k | val_2_11 = val_4_3 * fft_c[2] - val_4_7 * fft_c[0] + val_4_11 * fft_c[3] + val_4_15 * fft_c[1]; |
173 | | |
174 | 875k | val_2_15 = val_4_3 * fft_c[3] - val_4_7 * fft_c[2] + val_4_11 * fft_c[1] - val_4_15 * fft_c[0]; |
175 | | |
176 | 875k | val_4_0 = val_2_0 + val_2_2; |
177 | 875k | val_4_14 = val_2_0 - val_2_2; |
178 | 875k | val_4_1 = val_2_1 + val_2_3; |
179 | 875k | val_4_15 = val_2_1 - val_2_3; |
180 | 875k | val_4_2 = val_2_4 + val_2_6; |
181 | 875k | val_4_12 = val_2_4 - val_2_6; |
182 | 875k | val_4_3 = val_2_5 + val_2_7; |
183 | 875k | val_4_13 = val_2_5 - val_2_7; |
184 | 875k | val_4_4 = val_2_8 + val_2_10; |
185 | 875k | val_4_10 = val_2_8 - val_2_10; |
186 | 875k | val_4_5 = val_2_9 + val_2_11; |
187 | 875k | val_4_11 = val_2_9 - val_2_11; |
188 | 875k | val_4_6 = val_2_12 + val_2_14; |
189 | 875k | val_4_8 = val_2_12 - val_2_14; |
190 | 875k | val_4_7 = val_2_13 + val_2_15; |
191 | 875k | val_4_9 = val_2_13 - val_2_15; |
192 | | |
193 | 875k | val_1_0 = val_3_0 + val_3_16; |
194 | 875k | val_1_1 = val_3_1 + val_3_17; |
195 | 875k | val_1_2 = val_3_2 + val_3_18; |
196 | 875k | val_1_3 = val_3_3 + val_3_19; |
197 | 875k | val_1_4 = val_3_4 + val_3_20; |
198 | 875k | val_1_5 = val_3_5 + val_3_21; |
199 | 875k | val_1_6 = val_3_6 + val_3_22; |
200 | 875k | val_1_7 = val_3_7 + val_3_23; |
201 | 875k | val_1_8 = val_3_8 + val_3_24; |
202 | 875k | val_1_9 = val_3_9 + val_3_25; |
203 | 875k | val_1_10 = val_3_10 + val_3_26; |
204 | 875k | val_1_11 = val_3_11 + val_3_27; |
205 | 875k | val_1_12 = val_3_12 + val_3_28; |
206 | 875k | val_1_13 = val_3_13 + val_3_29; |
207 | 875k | val_1_14 = val_3_14 + val_3_30; |
208 | 875k | val_1_15 = val_3_15 + val_3_31; |
209 | | |
210 | 875k | val_0 = val_1_0 + val_1_8; |
211 | 875k | val_2 = val_1_0 - val_1_8; |
212 | 875k | val_1 = val_1_1 + val_1_9; |
213 | 875k | val_3 = val_1_1 - val_1_9; |
214 | 875k | val_4 = val_1_2 + val_1_10; |
215 | 875k | val_6 = val_1_2 - val_1_10; |
216 | 875k | val_5 = val_1_3 + val_1_11; |
217 | 875k | val_7 = val_1_3 - val_1_11; |
218 | 875k | val_8 = val_1_4 + val_1_12; |
219 | 875k | val_10 = val_1_4 - val_1_12; |
220 | 875k | val_9 = val_1_5 + val_1_13; |
221 | 875k | val_11 = val_1_5 - val_1_13; |
222 | 875k | val_12 = val_1_6 + val_1_14; |
223 | 875k | val_14 = val_1_6 - val_1_14; |
224 | 875k | val_13 = val_1_7 + val_1_15; |
225 | 875k | val_15 = val_1_7 - val_1_15; |
226 | | |
227 | 875k | val_2_0 = val_0 + val_8; |
228 | 875k | val_2_4 = val_0 - val_8; |
229 | 875k | val_2_1 = val_1 + val_9; |
230 | 875k | val_2_5 = val_1 - val_9; |
231 | 875k | val_2_8 = val_2 - val_11; |
232 | 875k | val_2_10 = val_2 + val_11; |
233 | 875k | val_2_9 = val_3 + val_10; |
234 | 875k | val_2_11 = val_3 - val_10; |
235 | 875k | val_2_2 = val_4 + val_12; |
236 | 875k | val_2_7 = val_4 - val_12; |
237 | 875k | val_2_3 = val_5 + val_13; |
238 | 875k | val_2_6 = val_13 - val_5; |
239 | | |
240 | 875k | val_1 = val_6 + val_14; |
241 | 875k | val_2 = val_6 - val_14; |
242 | 875k | val_0 = val_7 + val_15; |
243 | 875k | val_3 = val_7 - val_15; |
244 | | |
245 | 875k | val_2_12 = (val_0 + val_2) * MPS_INV_SQRT2; |
246 | 875k | val_2_14 = (val_0 - val_2) * MPS_INV_SQRT2; |
247 | 875k | val_2_13 = (val_3 - val_1) * MPS_INV_SQRT2; |
248 | 875k | val_2_15 = (val_1 + val_3) * -MPS_INV_SQRT2; |
249 | | |
250 | 875k | val_1_0 = val_3_0 - val_3_16; |
251 | 875k | val_1_1 = val_3_1 - val_3_17; |
252 | 875k | val_1_2 = val_3_2 - val_3_18; |
253 | 875k | val_1_3 = val_3_3 - val_3_19; |
254 | 875k | val_1_4 = val_3_4 - val_3_20; |
255 | 875k | val_1_5 = val_3_5 - val_3_21; |
256 | 875k | val_1_6 = val_3_6 - val_3_22; |
257 | 875k | val_1_7 = val_3_7 - val_3_23; |
258 | 875k | val_1_8 = val_3_8 - val_3_24; |
259 | 875k | val_1_9 = val_3_9 - val_3_25; |
260 | 875k | val_1_10 = val_3_10 - val_3_26; |
261 | 875k | val_1_11 = val_3_11 - val_3_27; |
262 | 875k | val_1_12 = val_3_12 - val_3_28; |
263 | 875k | val_1_13 = val_3_13 - val_3_29; |
264 | 875k | val_1_14 = val_3_14 - val_3_30; |
265 | 875k | val_1_15 = val_3_15 - val_3_31; |
266 | | |
267 | 875k | val_3_0 = val_2_0 + val_2_2; |
268 | 875k | val_3_16 = val_2_0 - val_2_2; |
269 | 875k | val_3_1 = val_2_1 + val_2_3; |
270 | 875k | val_3_17 = val_2_1 - val_2_3; |
271 | 875k | val_3_8 = val_2_4 - val_2_6; |
272 | 875k | val_3_24 = val_2_4 + val_2_6; |
273 | 875k | val_3_9 = val_2_5 - val_2_7; |
274 | 875k | val_3_25 = val_2_5 + val_2_7; |
275 | 875k | val_3_12 = val_2_8 + val_2_14; |
276 | 875k | val_3_28 = val_2_8 - val_2_14; |
277 | 875k | val_3_13 = val_2_9 + val_2_15; |
278 | 875k | val_3_29 = val_2_9 - val_2_15; |
279 | 875k | val_3_4 = val_2_10 + val_2_12; |
280 | 875k | val_3_20 = val_2_10 - val_2_12; |
281 | 875k | val_3_5 = val_2_11 + val_2_13; |
282 | 875k | val_3_21 = val_2_11 - val_2_13; |
283 | | |
284 | 875k | val_9 = (val_1_2 + val_1_14) * -MPS_COS_3PI_DIV8; |
285 | 875k | val_10 = (val_1_2 - val_1_14) * MPS_COS_PI_DIV8; |
286 | 875k | val_8 = (val_1_3 + val_1_15) * MPS_COS_3PI_DIV8; |
287 | 875k | val_11 = (val_1_3 - val_1_15) * MPS_COS_PI_DIV8; |
288 | 875k | val_5 = (val_1_4 + val_1_12) * -MPS_INV_SQRT2; |
289 | 875k | val_6 = (val_1_4 - val_1_12) * MPS_INV_SQRT2; |
290 | 875k | val_4 = (val_1_5 + val_1_13) * MPS_INV_SQRT2; |
291 | 875k | val_7 = (val_1_5 - val_1_13) * MPS_INV_SQRT2; |
292 | 875k | val_13 = (val_1_6 + val_1_10) * -MPS_COS_PI_DIV8; |
293 | 875k | val_14 = (val_1_6 - val_1_10) * MPS_COS_3PI_DIV8; |
294 | 875k | val_12 = (val_1_7 + val_1_11) * MPS_COS_PI_DIV8; |
295 | 875k | val_15 = (val_1_7 - val_1_11) * MPS_COS_3PI_DIV8; |
296 | | |
297 | 875k | val_1_2 = val_8 * MPS_SQRT2PLUS1 - val_12 * MPS_SQRT2MINUS1; |
298 | 875k | val_1_3 = val_9 * MPS_SQRT2PLUS1 - val_13 * MPS_SQRT2MINUS1; |
299 | 875k | val_1_4 = val_10 * MPS_SQRT2MINUS1 - val_14 * MPS_SQRT2PLUS1; |
300 | 875k | val_1_5 = val_11 * MPS_SQRT2MINUS1 - val_15 * MPS_SQRT2PLUS1; |
301 | | |
302 | 875k | val_8 += val_12; |
303 | 875k | val_9 += val_13; |
304 | 875k | val_10 += val_14; |
305 | 875k | val_11 += val_15; |
306 | 875k | val_1_6 = val_1_0 + val_4; |
307 | 875k | val_1_10 = val_1_0 - val_4; |
308 | 875k | val_1_7 = val_1_1 + val_5; |
309 | 875k | val_1_11 = val_1_1 - val_5; |
310 | | |
311 | 875k | val_1_12 = val_6 - val_1_9; |
312 | 875k | val_1_14 = val_6 + val_1_9; |
313 | 875k | val_1_13 = val_1_8 + val_7; |
314 | 875k | val_1_15 = val_1_8 - val_7; |
315 | | |
316 | 875k | val_0 = val_1_6 - val_1_14; |
317 | 875k | val_2 = val_1_6 + val_1_14; |
318 | 875k | val_1 = val_1_7 + val_1_15; |
319 | 875k | val_3 = val_1_7 - val_1_15; |
320 | 875k | val_4 = val_1_10 + val_1_12; |
321 | 875k | val_6 = val_1_10 - val_1_12; |
322 | 875k | val_5 = val_1_11 + val_1_13; |
323 | 875k | val_7 = val_1_11 - val_1_13; |
324 | | |
325 | 875k | val_1_10 = val_8 + val_10; |
326 | 875k | val_10 = val_8 - val_10; |
327 | 875k | val_1_11 = val_9 + val_11; |
328 | 875k | val_11 = val_9 - val_11; |
329 | | |
330 | 875k | val_12 = val_1_2 + val_1_4; |
331 | 875k | val_14 = val_1_2 - val_1_4; |
332 | 875k | val_13 = val_1_3 + val_1_5; |
333 | 875k | val_15 = val_1_3 - val_1_5; |
334 | | |
335 | 875k | val_3_2 = val_2 + val_1_10; |
336 | 875k | val_3_18 = val_2 - val_1_10; |
337 | 875k | val_3_3 = val_3 + val_1_11; |
338 | 875k | val_3_19 = val_3 - val_1_11; |
339 | 875k | val_3_6 = val_0 + val_12; |
340 | 875k | val_3_22 = val_0 - val_12; |
341 | 875k | val_3_7 = val_1 + val_13; |
342 | 875k | val_3_23 = val_1 - val_13; |
343 | 875k | val_3_14 = val_4 + val_10; |
344 | 875k | val_3_30 = val_4 - val_10; |
345 | 875k | val_3_15 = val_5 + val_11; |
346 | 875k | val_3_31 = val_5 - val_11; |
347 | 875k | val_3_10 = val_6 + val_14; |
348 | 875k | val_3_26 = val_6 - val_14; |
349 | 875k | val_3_11 = val_7 + val_15; |
350 | 875k | val_3_27 = val_7 - val_15; |
351 | | |
352 | 875k | val_1_0 = subband[0] - subband[32]; |
353 | 875k | val_1_1 = subband[1] - subband[33]; |
354 | 875k | val_1_2 = subband[4] - subband[36]; |
355 | 875k | val_1_3 = subband[5] - subband[37]; |
356 | 875k | val_1_4 = subband[8] - subband[40]; |
357 | 875k | val_1_5 = subband[9] - subband[41]; |
358 | 875k | val_1_6 = subband[12] - subband[44]; |
359 | 875k | val_1_7 = subband[13] - subband[45]; |
360 | 875k | val_1_8 = subband[16] - subband[48]; |
361 | 875k | val_1_9 = subband[17] - subband[49]; |
362 | 875k | val_1_10 = subband[20] - subband[52]; |
363 | 875k | val_1_11 = subband[21] - subband[53]; |
364 | 875k | val_1_12 = subband[24] - subband[56]; |
365 | 875k | val_1_13 = subband[25] - subband[57]; |
366 | 875k | val_1_14 = subband[28] - subband[60]; |
367 | 875k | val_1_15 = subband[29] - subband[61]; |
368 | | |
369 | 875k | val_9 = (val_1_2 + val_1_14) * -MPS_COS_3PI_DIV8; |
370 | 875k | val_10 = (val_1_2 - val_1_14) * MPS_COS_PI_DIV8; |
371 | 875k | val_8 = (val_1_3 + val_1_15) * MPS_COS_3PI_DIV8; |
372 | 875k | val_11 = (val_1_3 - val_1_15) * MPS_COS_PI_DIV8; |
373 | 875k | val_5 = (val_1_4 + val_1_12) * -MPS_INV_SQRT2; |
374 | 875k | val_6 = (val_1_4 - val_1_12) * MPS_INV_SQRT2; |
375 | 875k | val_4 = (val_1_5 + val_1_13) * MPS_INV_SQRT2; |
376 | 875k | val_7 = (val_1_5 - val_1_13) * MPS_INV_SQRT2; |
377 | 875k | val_13 = (val_1_6 + val_1_10) * -MPS_COS_PI_DIV8; |
378 | 875k | val_14 = (val_1_6 - val_1_10) * MPS_COS_3PI_DIV8; |
379 | 875k | val_12 = (val_1_7 + val_1_11) * MPS_COS_PI_DIV8; |
380 | 875k | val_15 = (val_1_7 - val_1_11) * MPS_COS_3PI_DIV8; |
381 | | |
382 | 875k | val_1_2 = val_8 * MPS_SQRT2PLUS1 - val_12 * MPS_SQRT2MINUS1; |
383 | 875k | val_1_3 = val_9 * MPS_SQRT2PLUS1 - val_13 * MPS_SQRT2MINUS1; |
384 | 875k | val_1_4 = val_10 * MPS_SQRT2MINUS1 - val_14 * MPS_SQRT2PLUS1; |
385 | 875k | val_1_5 = val_11 * MPS_SQRT2MINUS1 - val_15 * MPS_SQRT2PLUS1; |
386 | | |
387 | 875k | val_8 += val_12; |
388 | 875k | val_9 += val_13; |
389 | 875k | val_10 += val_14; |
390 | 875k | val_11 += val_15; |
391 | 875k | val_1_6 = val_1_0 + val_4; |
392 | 875k | val_1_10 = val_1_0 - val_4; |
393 | 875k | val_1_7 = val_1_1 + val_5; |
394 | 875k | val_1_11 = val_1_1 - val_5; |
395 | | |
396 | 875k | val_1_12 = val_6 - val_1_9; |
397 | 875k | val_1_14 = val_6 + val_1_9; |
398 | 875k | val_1_13 = val_1_8 + val_7; |
399 | 875k | val_1_15 = val_1_8 - val_7; |
400 | | |
401 | 875k | val_0 = val_1_6 - val_1_14; |
402 | 875k | val_2 = val_1_6 + val_1_14; |
403 | 875k | val_1 = val_1_7 + val_1_15; |
404 | 875k | val_3 = val_1_7 - val_1_15; |
405 | 875k | val_4 = val_1_10 + val_1_12; |
406 | 875k | val_6 = val_1_10 - val_1_12; |
407 | 875k | val_5 = val_1_11 + val_1_13; |
408 | 875k | val_7 = val_1_11 - val_1_13; |
409 | | |
410 | 875k | val_1_10 = val_8 + val_10; |
411 | 875k | val_10 = val_8 - val_10; |
412 | 875k | val_1_11 = val_9 + val_11; |
413 | 875k | val_11 = val_9 - val_11; |
414 | | |
415 | 875k | val_12 = val_1_2 + val_1_4; |
416 | 875k | val_14 = val_1_2 - val_1_4; |
417 | 875k | val_13 = val_1_3 + val_1_5; |
418 | 875k | val_15 = val_1_3 - val_1_5; |
419 | | |
420 | 875k | val_1_0 = val_2 + val_1_10; |
421 | 875k | val_1_8 = val_2 - val_1_10; |
422 | 875k | val_1_1 = val_3 + val_1_11; |
423 | 875k | val_1_9 = val_3 - val_1_11; |
424 | 875k | val_1_2 = val_0 + val_12; |
425 | 875k | val_1_10 = val_0 - val_12; |
426 | 875k | val_1_3 = val_1 + val_13; |
427 | 875k | val_1_11 = val_1 - val_13; |
428 | 875k | val_1_6 = val_4 + val_10; |
429 | 875k | val_1_14 = val_4 - val_10; |
430 | 875k | val_1_7 = val_5 + val_11; |
431 | 875k | val_1_15 = val_5 - val_11; |
432 | 875k | val_1_4 = val_6 + val_14; |
433 | 875k | val_1_12 = val_6 - val_14; |
434 | 875k | val_1_5 = val_7 + val_15; |
435 | 875k | val_1_13 = val_7 - val_15; |
436 | | |
437 | 875k | *subband++ = val_3_0; |
438 | 875k | *subband++ = val_3_1; |
439 | 875k | *subband++ = val_1_0 + val_4_0; |
440 | 875k | *subband++ = val_1_1 + val_4_1; |
441 | 875k | *subband++ = val_3_2; |
442 | 875k | *subband++ = val_3_3; |
443 | 875k | *subband++ = val_1_2 + val_4_2; |
444 | 875k | *subband++ = val_1_3 + val_4_3; |
445 | 875k | *subband++ = val_3_4; |
446 | 875k | *subband++ = val_3_5; |
447 | 875k | *subband++ = val_1_4 + val_4_4; |
448 | 875k | *subband++ = val_1_5 + val_4_5; |
449 | 875k | *subband++ = val_3_6; |
450 | 875k | *subband++ = val_3_7; |
451 | 875k | *subband++ = val_1_6 + val_4_6; |
452 | 875k | *subband++ = val_1_7 + val_4_7; |
453 | 875k | *subband++ = val_3_8; |
454 | 875k | *subband++ = val_3_9; |
455 | 875k | *subband++ = val_1_8 + val_4_8; |
456 | 875k | *subband++ = val_1_9 + val_4_9; |
457 | 875k | *subband++ = val_3_10; |
458 | 875k | *subband++ = val_3_11; |
459 | 875k | *subband++ = val_1_10 + val_4_10; |
460 | 875k | *subband++ = val_1_11 + val_4_11; |
461 | 875k | *subband++ = val_3_12; |
462 | 875k | *subband++ = val_3_13; |
463 | 875k | *subband++ = val_1_12 + val_4_12; |
464 | 875k | *subband++ = val_1_13 + val_4_13; |
465 | 875k | *subband++ = val_3_14; |
466 | 875k | *subband++ = val_3_15; |
467 | 875k | *subband++ = val_1_14 + val_4_14; |
468 | 875k | *subband++ = val_1_15 + val_4_15; |
469 | 875k | *subband++ = val_3_16; |
470 | 875k | *subband++ = val_3_17; |
471 | 875k | *subband++ = val_1_0 - val_4_0; |
472 | 875k | *subband++ = val_1_1 - val_4_1; |
473 | 875k | *subband++ = val_3_18; |
474 | 875k | *subband++ = val_3_19; |
475 | 875k | *subband++ = val_1_2 - val_4_2; |
476 | 875k | *subband++ = val_1_3 - val_4_3; |
477 | 875k | *subband++ = val_3_20; |
478 | 875k | *subband++ = val_3_21; |
479 | 875k | *subband++ = val_1_4 - val_4_4; |
480 | 875k | *subband++ = val_1_5 - val_4_5; |
481 | 875k | *subband++ = val_3_22; |
482 | 875k | *subband++ = val_3_23; |
483 | 875k | *subband++ = val_1_6 - val_4_6; |
484 | 875k | *subband++ = val_1_7 - val_4_7; |
485 | 875k | *subband++ = val_3_24; |
486 | 875k | *subband++ = val_3_25; |
487 | 875k | *subband++ = val_1_8 - val_4_8; |
488 | 875k | *subband++ = val_1_9 - val_4_9; |
489 | 875k | *subband++ = val_3_26; |
490 | 875k | *subband++ = val_3_27; |
491 | 875k | *subband++ = val_1_10 - val_4_10; |
492 | 875k | *subband++ = val_1_11 - val_4_11; |
493 | 875k | *subband++ = val_3_28; |
494 | 875k | *subband++ = val_3_29; |
495 | 875k | *subband++ = val_1_12 - val_4_12; |
496 | 875k | *subband++ = val_1_13 - val_4_13; |
497 | 875k | *subband++ = val_3_30; |
498 | 875k | *subband++ = val_3_31; |
499 | 875k | *subband++ = val_1_14 - val_4_14; |
500 | 875k | *subband++ = val_1_15 - val_4_15; |
501 | 875k | } |
502 | | |
503 | | static VOID ixheaace_mps_cos_mod( |
504 | 437k | FLOAT32 *subband, ixheaace_mps_sac_pstr_qmf_synth_filter_bank pstr_qmf_synth_filter_bank) { |
505 | 437k | WORD32 idx, length; |
506 | 437k | FLOAT32 weight_imag, weight_real; |
507 | 437k | FLOAT32 real_1, real_2; |
508 | 437k | FLOAT32 imag_1, imag_2; |
509 | 437k | FLOAT32 accu1, accu2; |
510 | | |
511 | 437k | length = 32; |
512 | | |
513 | 7.44M | for (idx = 0; idx < (length / 2); idx++) { |
514 | 7.00M | real_1 = subband[2 * idx]; |
515 | 7.00M | imag_2 = subband[2 * idx + 1]; |
516 | 7.00M | real_2 = subband[2 * length - 2 - 2 * idx]; |
517 | 7.00M | imag_1 = subband[2 * length - 1 - 2 * idx]; |
518 | | |
519 | 7.00M | weight_imag = pstr_qmf_synth_filter_bank->sin_twiddle[idx]; |
520 | 7.00M | weight_real = pstr_qmf_synth_filter_bank->cos_twiddle[idx]; |
521 | | |
522 | 7.00M | accu1 = imag_1 * weight_imag + real_1 * weight_real; |
523 | 7.00M | accu2 = imag_1 * weight_real - real_1 * weight_imag; |
524 | | |
525 | 7.00M | subband[2 * idx] = accu1; |
526 | 7.00M | subband[2 * idx + 1] = accu2; |
527 | | |
528 | 7.00M | weight_imag = pstr_qmf_synth_filter_bank->sin_twiddle[length - 1 - idx]; |
529 | 7.00M | weight_real = pstr_qmf_synth_filter_bank->cos_twiddle[length - 1 - idx]; |
530 | | |
531 | 7.00M | accu1 = imag_2 * weight_imag + real_2 * weight_real; |
532 | 7.00M | accu2 = imag_2 * weight_real - real_2 * weight_imag; |
533 | | |
534 | 7.00M | subband[2 * length - 2 - 2 * idx] = accu1; |
535 | 7.00M | subband[2 * length - 1 - 2 * idx] = accu2; |
536 | 7.00M | } |
537 | | |
538 | 437k | ixheaace_mps_fft32(subband); |
539 | | |
540 | 437k | weight_imag = pstr_qmf_synth_filter_bank->alt_sin_twiddle[0]; |
541 | 437k | weight_real = pstr_qmf_synth_filter_bank->alt_sin_twiddle[length]; |
542 | | |
543 | 7.44M | for (idx = 0; idx < length / 2; idx++) { |
544 | 7.00M | real_1 = subband[2 * idx]; |
545 | 7.00M | imag_1 = subband[2 * idx + 1]; |
546 | 7.00M | real_2 = subband[2 * length - 2 - 2 * idx]; |
547 | 7.00M | imag_2 = subband[2 * length - 1 - 2 * idx]; |
548 | | |
549 | 7.00M | accu1 = real_1 * weight_real + imag_1 * weight_imag; |
550 | 7.00M | accu2 = real_1 * weight_imag - imag_1 * weight_real; |
551 | | |
552 | 7.00M | subband[2 * idx] = accu1; |
553 | 7.00M | subband[2 * length - 1 - 2 * idx] = accu2; |
554 | | |
555 | 7.00M | weight_imag = pstr_qmf_synth_filter_bank->alt_sin_twiddle[idx + 1]; |
556 | 7.00M | weight_real = pstr_qmf_synth_filter_bank->alt_sin_twiddle[length - 1 - idx]; |
557 | | |
558 | 7.00M | accu1 = real_2 * weight_imag + imag_2 * weight_real; |
559 | 7.00M | accu2 = real_2 * weight_real - imag_2 * weight_imag; |
560 | | |
561 | 7.00M | subband[2 * length - 2 - 2 * idx] = accu1; |
562 | 7.00M | subband[2 * idx + 1] = accu2; |
563 | 7.00M | } |
564 | 437k | } |
565 | | |
566 | | static VOID ixheaace_mps_sin_mod( |
567 | 437k | FLOAT32 *subband, ixheaace_mps_sac_pstr_qmf_synth_filter_bank pstr_qmf_synth_filter_bank) { |
568 | 437k | WORD32 idx, length; |
569 | 437k | FLOAT32 weight_real, weight_imag; |
570 | 437k | FLOAT32 real_1, imag_1, real_2, imag_2; |
571 | 437k | FLOAT32 accu1, accu2; |
572 | | |
573 | 437k | length = 32; |
574 | | |
575 | 7.44M | for (idx = 0; idx < length / 2; idx++) { |
576 | 7.00M | real_1 = subband[2 * idx]; |
577 | 7.00M | imag_2 = subband[2 * idx + 1]; |
578 | 7.00M | real_2 = subband[2 * length - 2 - 2 * idx]; |
579 | 7.00M | imag_1 = subband[2 * length - 1 - 2 * idx]; |
580 | | |
581 | 7.00M | weight_real = pstr_qmf_synth_filter_bank->sin_twiddle[idx]; |
582 | 7.00M | weight_imag = pstr_qmf_synth_filter_bank->cos_twiddle[idx]; |
583 | | |
584 | 7.00M | accu1 = imag_1 * weight_imag + real_1 * weight_real; |
585 | 7.00M | accu2 = imag_1 * weight_real - real_1 * weight_imag; |
586 | | |
587 | 7.00M | subband[2 * idx + 1] = accu1; |
588 | 7.00M | subband[2 * idx] = accu2; |
589 | | |
590 | 7.00M | weight_real = pstr_qmf_synth_filter_bank->sin_twiddle[length - 1 - idx]; |
591 | 7.00M | weight_imag = pstr_qmf_synth_filter_bank->cos_twiddle[length - 1 - idx]; |
592 | | |
593 | 7.00M | accu1 = imag_2 * weight_imag + real_2 * weight_real; |
594 | 7.00M | accu2 = imag_2 * weight_real - real_2 * weight_imag; |
595 | | |
596 | 7.00M | subband[2 * length - 1 - 2 * idx] = accu1; |
597 | 7.00M | subband[2 * length - 2 - 2 * idx] = accu2; |
598 | 7.00M | } |
599 | | |
600 | 437k | ixheaace_mps_fft32(subband); |
601 | | |
602 | 437k | weight_imag = pstr_qmf_synth_filter_bank->alt_sin_twiddle[0]; |
603 | 437k | weight_real = pstr_qmf_synth_filter_bank->alt_sin_twiddle[length]; |
604 | | |
605 | 7.44M | for (idx = 0; idx < length / 2; idx++) { |
606 | 7.00M | real_1 = subband[2 * idx]; |
607 | 7.00M | imag_1 = subband[2 * idx + 1]; |
608 | 7.00M | real_2 = subband[2 * length - 2 - 2 * idx]; |
609 | 7.00M | imag_2 = subband[2 * length - 1 - 2 * idx]; |
610 | | |
611 | 7.00M | accu1 = -(real_1 * weight_real + imag_1 * weight_imag); |
612 | 7.00M | accu2 = -(real_1 * weight_imag - imag_1 * weight_real); |
613 | | |
614 | 7.00M | subband[2 * length - 1 - 2 * idx] = accu1; |
615 | 7.00M | subband[2 * idx] = accu2; |
616 | | |
617 | 7.00M | weight_imag = pstr_qmf_synth_filter_bank->alt_sin_twiddle[idx + 1]; |
618 | 7.00M | weight_real = pstr_qmf_synth_filter_bank->alt_sin_twiddle[length - 1 - idx]; |
619 | | |
620 | 7.00M | accu1 = -(real_2 * weight_imag + imag_2 * weight_real); |
621 | 7.00M | accu2 = -(real_2 * weight_real - imag_2 * weight_imag); |
622 | | |
623 | 7.00M | subband[2 * idx + 1] = accu1; |
624 | 7.00M | subband[2 * length - 2 - 2 * idx] = accu2; |
625 | 7.00M | } |
626 | 437k | } |
627 | | |
628 | | static VOID ixheaace_mps_inverse_modulation( |
629 | | FLOAT32 *qmf_real, FLOAT32 *qmf_imag, |
630 | 437k | ixheaace_mps_sac_pstr_qmf_synth_filter_bank pstr_qmf_synth_filter_bank) { |
631 | 437k | WORD32 idx, no_synthesis_channels, length; |
632 | | |
633 | 437k | FLOAT32 r1, i1, r2, i2; |
634 | | |
635 | 437k | no_synthesis_channels = NUM_QMF_BANDS; |
636 | | |
637 | 437k | length = no_synthesis_channels / 2; |
638 | | |
639 | 437k | ixheaace_mps_cos_mod(qmf_real, pstr_qmf_synth_filter_bank); |
640 | 437k | ixheaace_mps_sin_mod(qmf_imag, pstr_qmf_synth_filter_bank); |
641 | | |
642 | 14.4M | for (idx = 0; idx < length; idx++) { |
643 | 14.0M | r1 = qmf_real[idx]; |
644 | 14.0M | i2 = qmf_imag[no_synthesis_channels - 1 - idx]; |
645 | 14.0M | r2 = qmf_real[no_synthesis_channels - idx - 1]; |
646 | 14.0M | i1 = qmf_imag[idx]; |
647 | | |
648 | 14.0M | qmf_real[idx] = (r1 - i1); |
649 | 14.0M | qmf_imag[no_synthesis_channels - 1 - idx] = -(r1 + i1); |
650 | 14.0M | qmf_real[no_synthesis_channels - idx - 1] = (r2 - i2); |
651 | 14.0M | qmf_imag[idx] = -(r2 + i2); |
652 | 14.0M | } |
653 | 437k | } |
654 | | |
655 | 20.9M | static VOID ixheaace_mps_fct3_4(FLOAT32 *subband) { |
656 | 20.9M | FLOAT32 val_00, val_01, val_10, val_11; |
657 | | |
658 | 20.9M | subband[1] *= MPS_INV_SQRT2; |
659 | | |
660 | 20.9M | val_00 = subband[0] + subband[1]; |
661 | 20.9M | val_01 = subband[0] - subband[1]; |
662 | | |
663 | 20.9M | val_10 = subband[2] * MPS_COS_6_PI_BY_16 + subband[3] * MPS_SIN_6_PI_BY_16; |
664 | 20.9M | val_11 = subband[2] * MPS_SIN_6_PI_BY_16 - subband[3] * MPS_COS_6_PI_BY_16; |
665 | | |
666 | 20.9M | subband[0] = val_00 + val_10; |
667 | 20.9M | subband[3] = val_00 - val_10; |
668 | 20.9M | subband[1] = val_01 + val_11; |
669 | 20.9M | subband[2] = val_01 - val_11; |
670 | 20.9M | } |
671 | | |
672 | 17.4M | static VOID ixheaace_mps_fst3_4r(FLOAT32 *subband) { |
673 | 17.4M | FLOAT32 val_00, val_01, val_10, val_11; |
674 | | |
675 | 17.4M | subband[2] *= MPS_INV_SQRT2; |
676 | | |
677 | 17.4M | val_00 = subband[3] + subband[2]; |
678 | 17.4M | val_01 = subband[3] - subband[2]; |
679 | | |
680 | 17.4M | val_10 = subband[1] * MPS_COS_6_PI_BY_16 + subband[0] * MPS_SIN_6_PI_BY_16; |
681 | 17.4M | val_11 = subband[0] * MPS_COS_6_PI_BY_16 - subband[1] * MPS_SIN_6_PI_BY_16; |
682 | | |
683 | 17.4M | subband[3] = val_00 + val_10; |
684 | 17.4M | subband[0] = val_10 - val_00; |
685 | 17.4M | subband[2] = val_11 - val_01; |
686 | 17.4M | subband[1] = val_11 + val_01; |
687 | 17.4M | } |
688 | | |
689 | 10.4M | static VOID ixheaace_mps_fct4_4r(FLOAT32 *subband) { |
690 | 10.4M | FLOAT32 val_00, val_01, val_10, val_11; |
691 | 10.4M | subband[1] *= MPS_INV_SQRT2; |
692 | | |
693 | 10.4M | val_00 = subband[0] + subband[1]; |
694 | 10.4M | val_01 = subband[0] - subband[1]; |
695 | | |
696 | 10.4M | subband[2] *= MPS_INV_SQRT2; |
697 | | |
698 | 10.4M | val_11 = subband[3] - subband[2]; |
699 | 10.4M | val_10 = subband[3] + subband[2]; |
700 | | |
701 | 10.4M | subband[3] = val_00 * MPS_COS_PI_BY_16 + val_10 * MPS_SIN_PI_BY_16; |
702 | 10.4M | subband[0] = val_00 * MPS_SIN_PI_BY_16 - val_10 * MPS_COS_PI_BY_16; |
703 | | |
704 | 10.4M | subband[2] = val_01 * MPS_COS_3_PI_BY_16 - val_11 * MPS_SIN_3_PI_BY_16; |
705 | 10.4M | subband[1] = val_01 * MPS_SIN_3_PI_BY_16 + val_11 * MPS_COS_3_PI_BY_16; |
706 | 10.4M | } |
707 | | |
708 | 6.97M | static VOID ixheaace_mps_fst4_4(FLOAT32 *subband) { |
709 | 6.97M | FLOAT32 val_00, val_01, val_10, val_11; |
710 | | |
711 | 6.97M | subband[1] *= MPS_INV_SQRT2; |
712 | | |
713 | 6.97M | val_10 = subband[0] + subband[1]; |
714 | 6.97M | val_11 = subband[0] - subband[1]; |
715 | | |
716 | 6.97M | subband[2] *= MPS_INV_SQRT2; |
717 | | |
718 | 6.97M | val_01 = subband[3] - subband[2]; |
719 | 6.97M | val_00 = subband[3] + subband[2]; |
720 | | |
721 | 6.97M | subband[0] = val_00 * MPS_COS_PI_BY_16 + val_10 * MPS_SIN_PI_BY_16; |
722 | 6.97M | subband[3] = val_10 * MPS_COS_PI_BY_16 - val_00 * MPS_SIN_PI_BY_16; |
723 | | |
724 | 6.97M | subband[1] = val_11 * MPS_SIN_3_PI_BY_16 - val_01 * MPS_COS_3_PI_BY_16; |
725 | 6.97M | subband[2] = val_01 * MPS_SIN_3_PI_BY_16 + val_11 * MPS_COS_3_PI_BY_16; |
726 | 6.97M | } |
727 | | |
728 | 3.48M | static VOID ixheaace_mps_fct3_64(FLOAT32 *subband) { |
729 | 3.48M | WORD32 idx; |
730 | 3.48M | const FLOAT32 *t_ptr; |
731 | 3.48M | FLOAT32 cos_val, sine_val; |
732 | 3.48M | FLOAT32 xp; |
733 | | |
734 | 3.48M | ixheaace_mps_bit_reversal(&subband[1], &subband[32]); |
735 | 3.48M | ixheaace_mps_bit_reversal(&subband[2], &subband[16]); |
736 | 3.48M | ixheaace_mps_bit_reversal(&subband[3], &subband[48]); |
737 | 3.48M | ixheaace_mps_bit_reversal(&subband[4], &subband[8]); |
738 | 3.48M | ixheaace_mps_bit_reversal(&subband[5], &subband[40]); |
739 | 3.48M | ixheaace_mps_bit_reversal(&subband[6], &subband[24]); |
740 | 3.48M | ixheaace_mps_bit_reversal(&subband[7], &subband[56]); |
741 | 3.48M | ixheaace_mps_bit_reversal(&subband[9], &subband[36]); |
742 | 3.48M | ixheaace_mps_bit_reversal(&subband[10], &subband[20]); |
743 | 3.48M | ixheaace_mps_bit_reversal(&subband[11], &subband[52]); |
744 | 3.48M | ixheaace_mps_bit_reversal(&subband[13], &subband[44]); |
745 | 3.48M | ixheaace_mps_bit_reversal(&subband[14], &subband[28]); |
746 | 3.48M | ixheaace_mps_bit_reversal(&subband[15], &subband[60]); |
747 | 3.48M | ixheaace_mps_bit_reversal(&subband[17], &subband[34]); |
748 | 3.48M | ixheaace_mps_bit_reversal(&subband[19], &subband[50]); |
749 | 3.48M | ixheaace_mps_bit_reversal(&subband[21], &subband[42]); |
750 | 3.48M | ixheaace_mps_bit_reversal(&subband[22], &subband[26]); |
751 | 3.48M | ixheaace_mps_bit_reversal(&subband[23], &subband[58]); |
752 | 3.48M | ixheaace_mps_bit_reversal(&subband[25], &subband[38]); |
753 | 3.48M | ixheaace_mps_bit_reversal(&subband[27], &subband[54]); |
754 | 3.48M | ixheaace_mps_bit_reversal(&subband[29], &subband[46]); |
755 | 3.48M | ixheaace_mps_bit_reversal(&subband[31], &subband[62]); |
756 | 3.48M | ixheaace_mps_bit_reversal(&subband[35], &subband[49]); |
757 | 3.48M | ixheaace_mps_bit_reversal(&subband[37], &subband[41]); |
758 | 3.48M | ixheaace_mps_bit_reversal(&subband[39], &subband[57]); |
759 | 3.48M | ixheaace_mps_bit_reversal(&subband[43], &subband[53]); |
760 | 3.48M | ixheaace_mps_bit_reversal(&subband[47], &subband[61]); |
761 | 3.48M | ixheaace_mps_bit_reversal(&subband[55], &subband[59]); |
762 | | |
763 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[33], &subband[62]); |
764 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[34], &subband[60]); |
765 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[35], &subband[61]); |
766 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[36], &subband[56]); |
767 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[37], &subband[57]); |
768 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[38], &subband[58]); |
769 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[39], &subband[59]); |
770 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[40], &subband[48]); |
771 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[41], &subband[49]); |
772 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[42], &subband[50]); |
773 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[43], &subband[51]); |
774 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[44], &subband[52]); |
775 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[45], &subband[53]); |
776 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[46], &subband[54]); |
777 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[47], &subband[55]); |
778 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[17], &subband[30]); |
779 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[18], &subband[28]); |
780 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[19], &subband[29]); |
781 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[20], &subband[24]); |
782 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[21], &subband[25]); |
783 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[22], &subband[26]); |
784 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[23], &subband[27]); |
785 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[9], &subband[14]); |
786 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[10], &subband[12]); |
787 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[11], &subband[13]); |
788 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[41], &subband[46]); |
789 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[42], &subband[44]); |
790 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[43], &subband[45]); |
791 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[54], &subband[49]); |
792 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[52], &subband[50]); |
793 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[53], &subband[51]); |
794 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[5], &subband[6]); |
795 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[21], &subband[22]); |
796 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[26], &subband[25]); |
797 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[37], &subband[38]); |
798 | 3.48M | ixheaace_mps_bit_add_sub1(&subband[58], &subband[57]); |
799 | | |
800 | 3.48M | ixheaace_mps_fct3_4(subband); |
801 | 3.48M | ixheaace_mps_fct4_4r(subband + 4); |
802 | 3.48M | ixheaace_mps_fct3_4(subband + 8); |
803 | 3.48M | ixheaace_mps_fst3_4r(subband + 12); |
804 | 3.48M | ixheaace_mps_fct3_4(subband + 16); |
805 | 3.48M | ixheaace_mps_fct4_4r(subband + 20); |
806 | 3.48M | ixheaace_mps_fst4_4(subband + 24); |
807 | 3.48M | ixheaace_mps_fst3_4r(subband + 28); |
808 | 3.48M | ixheaace_mps_fct3_4(subband + 32); |
809 | 3.48M | ixheaace_mps_fct4_4r(subband + 36); |
810 | 3.48M | ixheaace_mps_fct3_4(subband + 40); |
811 | 3.48M | ixheaace_mps_fst3_4r(subband + 44); |
812 | 3.48M | ixheaace_mps_fct3_4(subband + 48); |
813 | 3.48M | ixheaace_mps_fst3_4r(subband + 52); |
814 | 3.48M | ixheaace_mps_fst4_4(subband + 56); |
815 | 3.48M | ixheaace_mps_fst3_4r(subband + 60); |
816 | | |
817 | 17.4M | for (idx = 0; idx < 4; idx++) { |
818 | 13.9M | ixheaace_mps_bit_add_sub2(&subband[idx], &subband[7 - idx]); |
819 | 13.9M | ixheaace_mps_bit_add_sub2(&subband[16 + idx], &subband[23 - idx]); |
820 | 13.9M | ixheaace_mps_bit_add_sub1(&subband[31 - idx], &subband[24 + idx]); |
821 | 13.9M | ixheaace_mps_bit_add_sub2(&subband[32 + idx], &subband[39 - idx]); |
822 | 13.9M | ixheaace_mps_bit_add_sub1(&subband[63 - idx], &subband[56 + idx]); |
823 | 13.9M | } |
824 | 3.48M | t_ptr = trig_data_fct4_8; |
825 | | |
826 | 17.4M | for (idx = 0; idx < 4; idx++) { |
827 | 13.9M | cos_val = *t_ptr++; |
828 | 13.9M | sine_val = *t_ptr++; |
829 | | |
830 | 13.9M | xp = subband[8 + idx] * cos_val + subband[15 - idx] * sine_val; |
831 | 13.9M | subband[8 + idx] = subband[8 + idx] * sine_val - subband[15 - idx] * cos_val; |
832 | 13.9M | subband[15 - idx] = xp; |
833 | 13.9M | xp = subband[40 + idx] * cos_val + subband[47 - idx] * sine_val; |
834 | 13.9M | subband[40 + idx] = subband[40 + idx] * sine_val - subband[47 - idx] * cos_val; |
835 | 13.9M | subband[47 - idx] = xp; |
836 | 13.9M | xp = subband[48 + idx] * sine_val + subband[55 - idx] * cos_val; |
837 | 13.9M | subband[55 - idx] = subband[48 + idx] * cos_val - subband[55 - idx] * sine_val; |
838 | 13.9M | subband[48 + idx] = xp; |
839 | 13.9M | } |
840 | | |
841 | 31.3M | for (idx = 0; idx < 8; idx++) { |
842 | 27.9M | ixheaace_mps_bit_add_sub2(&subband[idx], &subband[15 - idx]); |
843 | 27.9M | ixheaace_mps_bit_add_sub2(&subband[32 + idx], &subband[47 - idx]); |
844 | 27.9M | ixheaace_mps_bit_add_sub1(&subband[63 - idx], &subband[48 + idx]); |
845 | 27.9M | } |
846 | | |
847 | 3.48M | t_ptr = trig_data_fct4_16; |
848 | | |
849 | 31.3M | for (idx = 0; idx < 8; idx++) { |
850 | 27.9M | cos_val = *t_ptr++; |
851 | 27.9M | sine_val = *t_ptr++; |
852 | | |
853 | 27.9M | xp = subband[16 + idx] * cos_val + subband[31 - idx] * sine_val; |
854 | 27.9M | subband[16 + idx] = subband[16 + idx] * sine_val - subband[31 - idx] * cos_val; |
855 | 27.9M | subband[31 - idx] = xp; |
856 | 27.9M | } |
857 | | |
858 | 59.2M | for (idx = 0; idx < 16; idx++) { |
859 | 55.8M | ixheaace_mps_bit_add_sub2(&subband[idx], &subband[31 - idx]); |
860 | 55.8M | } |
861 | | |
862 | 3.48M | t_ptr = trig_data_fct4_32; |
863 | | |
864 | 59.2M | for (idx = 0; idx < 16; idx++) { |
865 | 55.8M | cos_val = *t_ptr++; |
866 | 55.8M | sine_val = *t_ptr++; |
867 | | |
868 | 55.8M | xp = subband[32 + idx] * cos_val + subband[63 - idx] * sine_val; |
869 | 55.8M | subband[32 + idx] = subband[32 + idx] * sine_val - subband[63 - idx] * cos_val; |
870 | 55.8M | subband[63 - idx] = xp; |
871 | 55.8M | } |
872 | | |
873 | 115M | for (idx = 0; idx < 32; idx++) { |
874 | 111M | ixheaace_mps_bit_add_sub2(&subband[idx], &subband[63 - idx]); |
875 | 111M | } |
876 | 3.48M | } |
877 | | |
878 | 1.74M | static VOID ixheaace_mps_fst3_64(FLOAT32 *subband) { |
879 | 1.74M | WORD32 k; |
880 | | |
881 | 57.5M | for (k = 0; k < 32; k++) { |
882 | 55.8M | ixheaace_mps_bit_reversal(&subband[k], &subband[63 - k]); |
883 | 55.8M | } |
884 | | |
885 | 1.74M | ixheaace_mps_fct3_64(subband); |
886 | | |
887 | 57.5M | for (k = 1; k < NUM_QMF_BANDS; k += 2) { |
888 | 55.8M | subband[k] = -subband[k]; |
889 | 55.8M | } |
890 | 1.74M | } |
891 | | |
892 | | static VOID ixheaace_mps_forward_modulation(const FLOAT32 *time_in, FLOAT32 *real_subband, |
893 | 1.74M | FLOAT32 *imag_subband) { |
894 | 1.74M | WORD32 idx; |
895 | 1.74M | real_subband[0] = time_in[0]; |
896 | | |
897 | 111M | for (idx = 1; idx < NUM_QMF_BANDS; idx++) { |
898 | 109M | real_subband[idx] = time_in[idx] - time_in[(NUM_QMF_BANDS * 2) - idx]; |
899 | 109M | imag_subband[idx - 1] = time_in[idx] + time_in[(NUM_QMF_BANDS * 2) - idx]; |
900 | 109M | } |
901 | | |
902 | 1.74M | imag_subband[63] = time_in[NUM_QMF_BANDS]; |
903 | | |
904 | 1.74M | ixheaace_mps_fct3_64(real_subband); |
905 | | |
906 | 1.74M | ixheaace_mps_fst3_64(imag_subband); |
907 | 1.74M | } |
908 | | |
909 | | VOID ixheaace_mps_515_calculate_sbr_syn_filterbank( |
910 | | FLOAT32 *real_subband, FLOAT32 *imag_subband, FLOAT32 *time_sig, WORD32 channel, |
911 | | ixheaace_mps_sac_pstr_qmf_synth_filter_bank pstr_qmf_synth_filter_bank, WORD32 slots, |
912 | 28.1k | FLOAT32 *sbr_qmf_states_synthesis_per) { |
913 | 28.1k | WORD32 idx, subband, slot; |
914 | 28.1k | const FLOAT32 *ptr_filter; |
915 | 28.1k | FLOAT32 accumlate; |
916 | 28.1k | FLOAT32 *synth_buf; |
917 | | |
918 | 28.1k | synth_buf = &(sbr_qmf_states_synthesis_per[channel * QMF_FILTER_STATE_SYN_SIZE]); |
919 | | |
920 | 465k | for (slot = 0; slot < slots; slot++) { |
921 | 437k | ptr_filter = pstr_qmf_synth_filter_bank->p_filter; |
922 | 437k | ixheaace_mps_inverse_modulation(real_subband + NUM_QMF_BANDS * slot, |
923 | 437k | imag_subband + NUM_QMF_BANDS * slot, |
924 | 437k | pstr_qmf_synth_filter_bank); |
925 | | |
926 | 28.4M | for (subband = 0; subband < NUM_QMF_BANDS; subband++) { |
927 | 28.0M | real_subband[NUM_QMF_BANDS * slot + subband] = |
928 | 28.0M | real_subband[NUM_QMF_BANDS * slot + subband] * (-0.015625f); |
929 | 28.0M | imag_subband[NUM_QMF_BANDS * slot + subband] = |
930 | 28.0M | imag_subband[NUM_QMF_BANDS * slot + subband] * (-0.015625f); |
931 | 28.0M | } |
932 | | |
933 | 28.4M | for (subband = 0; subband < NUM_QMF_BANDS; subband++) { |
934 | 28.0M | FLOAT32 new_sample; |
935 | 28.0M | new_sample = imag_subband[NUM_QMF_BANDS * slot + 63 - subband]; |
936 | | |
937 | 168M | for (idx = 0; idx < 5; idx++) { |
938 | 140M | accumlate = synth_buf[2 * idx * NUM_QMF_BANDS + subband] + (*ptr_filter++) * new_sample; |
939 | 140M | synth_buf[2 * idx * NUM_QMF_BANDS + subband] = accumlate; |
940 | 140M | } |
941 | 28.0M | } |
942 | | |
943 | 2.62M | for (idx = 0; idx < 5; idx++) { |
944 | 2.18M | accumlate = synth_buf[2 * idx * NUM_QMF_BANDS + NUM_QMF_BANDS + (NUM_QMF_BANDS - 1)] + |
945 | 2.18M | (*ptr_filter++) * real_subband[NUM_QMF_BANDS * slot]; |
946 | 2.18M | synth_buf[2 * idx * NUM_QMF_BANDS + NUM_QMF_BANDS + (NUM_QMF_BANDS - 1)] = accumlate; |
947 | 2.18M | } |
948 | 437k | time_sig[0] = accumlate; |
949 | | |
950 | 437k | ptr_filter -= 10; |
951 | | |
952 | 28.0M | for (subband = 0; subband < 63; subband++) { |
953 | 27.5M | FLOAT32 new_sample; |
954 | | |
955 | 27.5M | new_sample = real_subband[NUM_QMF_BANDS * slot + 63 - subband]; |
956 | | |
957 | 165M | for (idx = 0; idx < 5; idx++) { |
958 | 137M | accumlate = synth_buf[2 * idx * NUM_QMF_BANDS + NUM_QMF_BANDS + subband] + |
959 | 137M | (*--ptr_filter) * new_sample; |
960 | 137M | synth_buf[2 * idx * NUM_QMF_BANDS + NUM_QMF_BANDS + subband] = accumlate; |
961 | 137M | } |
962 | | |
963 | 27.5M | time_sig[NUM_QMF_BANDS - 1 - subband] = accumlate; |
964 | 27.5M | } |
965 | | |
966 | 437k | time_sig += NUM_QMF_BANDS; |
967 | | |
968 | 437k | memmove((synth_buf + NUM_QMF_BANDS), synth_buf, (640 - NUM_QMF_BANDS) * sizeof(FLOAT32)); |
969 | | |
970 | 437k | memset((synth_buf), 0, NUM_QMF_BANDS * sizeof(FLOAT32)); |
971 | 437k | } |
972 | 28.1k | } |
973 | | |
974 | | VOID ixheaace_mps_515_calculate_ana_filterbank( |
975 | | ixheaace_mps_sac_sbr_encoder_ana_filter_bank *pstr_sbr_enc_ana_filter_bank, FLOAT32 *time_sig, |
976 | | FLOAT32 *real_subband, FLOAT32 *imag_subband, |
977 | 1.74M | ixheaace_mps_sac_pstr_qmf_ana_filter_bank pstr_qmf_synth_filter_bank) { |
978 | 1.74M | WORD32 idx; |
979 | 1.74M | FLOAT32 temp_array[128]; |
980 | 1.74M | const FLOAT32 *ptr_filter = pstr_qmf_synth_filter_bank->p_filter; |
981 | 1.74M | FLOAT32 accumlate; |
982 | | |
983 | 1.00G | for (idx = 0; idx < 576; idx++) { |
984 | 1.00G | pstr_sbr_enc_ana_filter_bank->x[idx] = pstr_sbr_enc_ana_filter_bank->x[idx + NUM_QMF_BANDS]; |
985 | 1.00G | } |
986 | 113M | for (idx = 0; idx < NUM_QMF_BANDS; idx++) { |
987 | 111M | pstr_sbr_enc_ana_filter_bank->x[idx + 576] = time_sig[idx]; |
988 | 111M | } |
989 | | |
990 | 113M | for (idx = 0; idx < NUM_QMF_BANDS; idx++) { |
991 | 111M | accumlate = 0.0f; |
992 | 111M | accumlate += (*ptr_filter++ * pstr_sbr_enc_ana_filter_bank->x[idx]); |
993 | 111M | accumlate += (*ptr_filter++ * pstr_sbr_enc_ana_filter_bank->x[idx + (NUM_QMF_BANDS * 2)]); |
994 | 111M | accumlate += (*ptr_filter++ * pstr_sbr_enc_ana_filter_bank->x[idx + (NUM_QMF_BANDS * 4)]); |
995 | 111M | accumlate += (*ptr_filter++ * pstr_sbr_enc_ana_filter_bank->x[idx + (NUM_QMF_BANDS * 6)]); |
996 | 111M | accumlate += (*ptr_filter++ * pstr_sbr_enc_ana_filter_bank->x[idx + (NUM_QMF_BANDS * 8)]); |
997 | 111M | temp_array[127 - idx] = accumlate; |
998 | 111M | } |
999 | | |
1000 | 1.74M | accumlate = 0.0f; |
1001 | 10.4M | for (idx = 0; idx < 5; idx++) { |
1002 | 8.71M | accumlate += |
1003 | 8.71M | (*ptr_filter++ * pstr_sbr_enc_ana_filter_bank->x[127 + idx * (NUM_QMF_BANDS * 2)]); |
1004 | 8.71M | } |
1005 | 1.74M | temp_array[0] = accumlate; |
1006 | | |
1007 | 1.74M | ptr_filter -= 10; |
1008 | 111M | for (idx = 0; idx < 63; idx++) { |
1009 | 109M | accumlate = 0.0f; |
1010 | 109M | accumlate += (*--ptr_filter * pstr_sbr_enc_ana_filter_bank->x[NUM_QMF_BANDS + idx]); |
1011 | 109M | accumlate += (*--ptr_filter * |
1012 | 109M | pstr_sbr_enc_ana_filter_bank->x[NUM_QMF_BANDS + idx + (NUM_QMF_BANDS * 2)]); |
1013 | 109M | accumlate += (*--ptr_filter * |
1014 | 109M | pstr_sbr_enc_ana_filter_bank->x[NUM_QMF_BANDS + idx + (NUM_QMF_BANDS * 4)]); |
1015 | 109M | accumlate += (*--ptr_filter * |
1016 | 109M | pstr_sbr_enc_ana_filter_bank->x[NUM_QMF_BANDS + idx + (NUM_QMF_BANDS * 6)]); |
1017 | 109M | accumlate += (*--ptr_filter * |
1018 | 109M | pstr_sbr_enc_ana_filter_bank->x[NUM_QMF_BANDS + idx + (NUM_QMF_BANDS * 8)]); |
1019 | 109M | temp_array[63 - idx] = accumlate; |
1020 | 109M | } |
1021 | | |
1022 | 1.74M | ixheaace_mps_forward_modulation(temp_array, real_subband, imag_subband); |
1023 | 1.74M | } |