xref: /aosp_15_r20/external/libxaac/encoder/ixheaace_mps_polyphase.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
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