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