xref: /aosp_15_r20/external/libxaac/encoder/ixheaace_sbr_qmf_enc.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2023 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker  *
5*15dc779aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker  *
9*15dc779aSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker  *
11*15dc779aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker  * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker  *
17*15dc779aSAndroid Build Coastguard Worker  *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker  */
20*15dc779aSAndroid Build Coastguard Worker 
21*15dc779aSAndroid Build Coastguard Worker #include <string.h>
22*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
23*15dc779aSAndroid Build Coastguard Worker 
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_def.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_resampler.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_rom.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_hbe.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_qmf_enc.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_hybrid.h"
33*15dc779aSAndroid Build Coastguard Worker 
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
39*15dc779aSAndroid Build Coastguard Worker 
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_const.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns_params.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_rom.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_fft.h"
45*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_fct3_4(FLOAT32 * ptr_x)46*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_fct3_4(FLOAT32 *ptr_x) {
47*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tmp00, tmp01, tmp10, tmp11, xp, xp2;
48*15dc779aSAndroid Build Coastguard Worker 
49*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_x[1];
50*15dc779aSAndroid Build Coastguard Worker   xp = ptr_x[0];
51*15dc779aSAndroid Build Coastguard Worker 
52*15dc779aSAndroid Build Coastguard Worker   xp2 = xp2 * IXHEAACE_COS_PI_BY_4;
53*15dc779aSAndroid Build Coastguard Worker 
54*15dc779aSAndroid Build Coastguard Worker   tmp00 = xp + xp2;
55*15dc779aSAndroid Build Coastguard Worker   tmp01 = xp - xp2;
56*15dc779aSAndroid Build Coastguard Worker 
57*15dc779aSAndroid Build Coastguard Worker   xp = ptr_x[2];
58*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_x[3];
59*15dc779aSAndroid Build Coastguard Worker 
60*15dc779aSAndroid Build Coastguard Worker   tmp10 = (xp * IXHEAACE_COS_PI_BY_8) + (xp2 * IXHEAACE_SIN_PI_BY_8);
61*15dc779aSAndroid Build Coastguard Worker 
62*15dc779aSAndroid Build Coastguard Worker   ptr_x[0] = tmp00 + tmp10;
63*15dc779aSAndroid Build Coastguard Worker   ptr_x[3] = tmp00 - tmp10;
64*15dc779aSAndroid Build Coastguard Worker 
65*15dc779aSAndroid Build Coastguard Worker   tmp11 = (xp * IXHEAACE_SIN_PI_BY_8) - (xp2 * IXHEAACE_COS_PI_BY_8);
66*15dc779aSAndroid Build Coastguard Worker 
67*15dc779aSAndroid Build Coastguard Worker   ptr_x[1] = tmp01 + tmp11;
68*15dc779aSAndroid Build Coastguard Worker   ptr_x[2] = tmp01 - tmp11;
69*15dc779aSAndroid Build Coastguard Worker }
70*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_fst3_4r(FLOAT32 * ptr_x)71*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_fst3_4r(FLOAT32 *ptr_x) {
72*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tmp00, tmp01, tmp10, tmp11, xp, xp2;
73*15dc779aSAndroid Build Coastguard Worker 
74*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_x[2];
75*15dc779aSAndroid Build Coastguard Worker   xp = ptr_x[3];
76*15dc779aSAndroid Build Coastguard Worker 
77*15dc779aSAndroid Build Coastguard Worker   xp2 = xp2 * IXHEAACE_COS_PI_BY_4;
78*15dc779aSAndroid Build Coastguard Worker 
79*15dc779aSAndroid Build Coastguard Worker   tmp00 = xp + xp2;
80*15dc779aSAndroid Build Coastguard Worker   tmp01 = xp - xp2;
81*15dc779aSAndroid Build Coastguard Worker 
82*15dc779aSAndroid Build Coastguard Worker   xp = ptr_x[1];
83*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_x[0];
84*15dc779aSAndroid Build Coastguard Worker 
85*15dc779aSAndroid Build Coastguard Worker   tmp10 = (xp * IXHEAACE_COS_PI_BY_8) + (xp2 * IXHEAACE_SIN_PI_BY_8);
86*15dc779aSAndroid Build Coastguard Worker 
87*15dc779aSAndroid Build Coastguard Worker   ptr_x[3] = tmp00 + tmp10;
88*15dc779aSAndroid Build Coastguard Worker   ptr_x[0] = tmp10 - tmp00;
89*15dc779aSAndroid Build Coastguard Worker 
90*15dc779aSAndroid Build Coastguard Worker   tmp11 = (xp2 * IXHEAACE_COS_PI_BY_8) - (xp * IXHEAACE_SIN_PI_BY_8);
91*15dc779aSAndroid Build Coastguard Worker 
92*15dc779aSAndroid Build Coastguard Worker   ptr_x[2] = tmp11 - tmp01;
93*15dc779aSAndroid Build Coastguard Worker   ptr_x[1] = tmp11 + tmp01;
94*15dc779aSAndroid Build Coastguard Worker }
95*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_fct4_4r(FLOAT32 * ptr_x)96*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_fct4_4r(FLOAT32 *ptr_x) {
97*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tmp00, tmp01, tmp10, tmp11, xp, xp2;
98*15dc779aSAndroid Build Coastguard Worker 
99*15dc779aSAndroid Build Coastguard Worker   xp = ptr_x[1];
100*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_x[0];
101*15dc779aSAndroid Build Coastguard Worker 
102*15dc779aSAndroid Build Coastguard Worker   xp = xp * IXHEAACE_COS_PI_BY_4;
103*15dc779aSAndroid Build Coastguard Worker   tmp00 = xp2 + xp;
104*15dc779aSAndroid Build Coastguard Worker   tmp01 = xp2 - xp;
105*15dc779aSAndroid Build Coastguard Worker 
106*15dc779aSAndroid Build Coastguard Worker   xp = ptr_x[2];
107*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_x[3];
108*15dc779aSAndroid Build Coastguard Worker 
109*15dc779aSAndroid Build Coastguard Worker   xp = xp * IXHEAACE_COS_PI_BY_4;
110*15dc779aSAndroid Build Coastguard Worker   tmp11 = xp2 - xp;
111*15dc779aSAndroid Build Coastguard Worker   tmp10 = xp2 + xp;
112*15dc779aSAndroid Build Coastguard Worker 
113*15dc779aSAndroid Build Coastguard Worker   ptr_x[3] = tmp00 * IXHEAACE_COS_PI_BY_16 + tmp10 * IXHEAACE_SIN_PI_BY_16;
114*15dc779aSAndroid Build Coastguard Worker   ptr_x[0] = tmp00 * IXHEAACE_SIN_PI_BY_16 - tmp10 * IXHEAACE_COS_PI_BY_16;
115*15dc779aSAndroid Build Coastguard Worker 
116*15dc779aSAndroid Build Coastguard Worker   ptr_x[2] = tmp01 * IXHEAACE_COS_3_PI_BY_16 - tmp11 * IXHEAACE_SIN_3_PI_BY_16;
117*15dc779aSAndroid Build Coastguard Worker   ptr_x[1] = tmp01 * IXHEAACE_SIN_3_PI_BY_16 + tmp11 * IXHEAACE_COS_3_PI_BY_16;
118*15dc779aSAndroid Build Coastguard Worker }
119*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_fst4_4(FLOAT32 * ptr_x)120*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_fst4_4(FLOAT32 *ptr_x) {
121*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tmp00, tmp01, tmp10, tmp11, xp, xp2;
122*15dc779aSAndroid Build Coastguard Worker 
123*15dc779aSAndroid Build Coastguard Worker   xp = ptr_x[1];
124*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_x[0];
125*15dc779aSAndroid Build Coastguard Worker 
126*15dc779aSAndroid Build Coastguard Worker   xp = xp * IXHEAACE_COS_PI_BY_4;
127*15dc779aSAndroid Build Coastguard Worker   tmp10 = xp2 + xp;
128*15dc779aSAndroid Build Coastguard Worker   tmp11 = xp2 - xp;
129*15dc779aSAndroid Build Coastguard Worker 
130*15dc779aSAndroid Build Coastguard Worker   xp = ptr_x[2];
131*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_x[3];
132*15dc779aSAndroid Build Coastguard Worker 
133*15dc779aSAndroid Build Coastguard Worker   xp = xp * IXHEAACE_COS_PI_BY_4;
134*15dc779aSAndroid Build Coastguard Worker   tmp01 = xp2 - xp;
135*15dc779aSAndroid Build Coastguard Worker   tmp00 = xp2 + xp;
136*15dc779aSAndroid Build Coastguard Worker 
137*15dc779aSAndroid Build Coastguard Worker   ptr_x[0] = tmp00 * IXHEAACE_COS_PI_BY_16 + tmp10 * IXHEAACE_SIN_PI_BY_16;
138*15dc779aSAndroid Build Coastguard Worker   ptr_x[3] = tmp10 * IXHEAACE_COS_PI_BY_16 - tmp00 * IXHEAACE_SIN_PI_BY_16;
139*15dc779aSAndroid Build Coastguard Worker   ptr_x[1] = tmp11 * IXHEAACE_SIN_3_PI_BY_16 - tmp01 * IXHEAACE_COS_3_PI_BY_16;
140*15dc779aSAndroid Build Coastguard Worker   ptr_x[2] = tmp01 * IXHEAACE_SIN_3_PI_BY_16 + tmp11 * IXHEAACE_COS_3_PI_BY_16;
141*15dc779aSAndroid Build Coastguard Worker }
142*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_fct3_64(FLOAT32 * ptr_a,ixheaace_str_qmf_tabs * pstr_qmf_tab)143*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_fct3_64(FLOAT32 *ptr_a, ixheaace_str_qmf_tabs *pstr_qmf_tab) {
144*15dc779aSAndroid Build Coastguard Worker   WORD32 k;
145*15dc779aSAndroid Build Coastguard Worker 
146*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_t1;
147*15dc779aSAndroid Build Coastguard Worker   FLOAT32 xp, xp2, xp3, xp4, wc, ws;
148*15dc779aSAndroid Build Coastguard Worker 
149*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr1, *ptr2;
150*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_ap, *ptr_an;
151*15dc779aSAndroid Build Coastguard Worker 
152*15dc779aSAndroid Build Coastguard Worker   /* bit reversal */
153*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[1];
154*15dc779aSAndroid Build Coastguard Worker   ptr_a[1] = ptr_a[32];
155*15dc779aSAndroid Build Coastguard Worker   ptr_a[32] = xp;
156*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[2];
157*15dc779aSAndroid Build Coastguard Worker   ptr_a[2] = ptr_a[16];
158*15dc779aSAndroid Build Coastguard Worker   ptr_a[16] = xp;
159*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[3];
160*15dc779aSAndroid Build Coastguard Worker   ptr_a[3] = ptr_a[48];
161*15dc779aSAndroid Build Coastguard Worker   ptr_a[48] = xp;
162*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[4];
163*15dc779aSAndroid Build Coastguard Worker   ptr_a[4] = ptr_a[8];
164*15dc779aSAndroid Build Coastguard Worker   ptr_a[8] = xp;
165*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[5];
166*15dc779aSAndroid Build Coastguard Worker   ptr_a[5] = ptr_a[40];
167*15dc779aSAndroid Build Coastguard Worker   ptr_a[40] = xp;
168*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[6];
169*15dc779aSAndroid Build Coastguard Worker   ptr_a[6] = ptr_a[24];
170*15dc779aSAndroid Build Coastguard Worker   ptr_a[24] = xp;
171*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[7];
172*15dc779aSAndroid Build Coastguard Worker   ptr_a[7] = ptr_a[56];
173*15dc779aSAndroid Build Coastguard Worker   ptr_a[56] = xp;
174*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[9];
175*15dc779aSAndroid Build Coastguard Worker   ptr_a[9] = ptr_a[36];
176*15dc779aSAndroid Build Coastguard Worker   ptr_a[36] = xp;
177*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[10];
178*15dc779aSAndroid Build Coastguard Worker   ptr_a[10] = ptr_a[20];
179*15dc779aSAndroid Build Coastguard Worker   ptr_a[20] = xp;
180*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[11];
181*15dc779aSAndroid Build Coastguard Worker   ptr_a[11] = ptr_a[52];
182*15dc779aSAndroid Build Coastguard Worker   ptr_a[52] = xp;
183*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[13];
184*15dc779aSAndroid Build Coastguard Worker   ptr_a[13] = ptr_a[44];
185*15dc779aSAndroid Build Coastguard Worker   ptr_a[44] = xp;
186*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[14];
187*15dc779aSAndroid Build Coastguard Worker   ptr_a[14] = ptr_a[28];
188*15dc779aSAndroid Build Coastguard Worker   ptr_a[28] = xp;
189*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[15];
190*15dc779aSAndroid Build Coastguard Worker   ptr_a[15] = ptr_a[60];
191*15dc779aSAndroid Build Coastguard Worker   ptr_a[60] = xp;
192*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[17];
193*15dc779aSAndroid Build Coastguard Worker   ptr_a[17] = ptr_a[34];
194*15dc779aSAndroid Build Coastguard Worker   ptr_a[34] = xp;
195*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[19];
196*15dc779aSAndroid Build Coastguard Worker   ptr_a[19] = ptr_a[50];
197*15dc779aSAndroid Build Coastguard Worker   ptr_a[50] = xp;
198*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[21];
199*15dc779aSAndroid Build Coastguard Worker   ptr_a[21] = ptr_a[42];
200*15dc779aSAndroid Build Coastguard Worker   ptr_a[42] = xp;
201*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[22];
202*15dc779aSAndroid Build Coastguard Worker   ptr_a[22] = ptr_a[26];
203*15dc779aSAndroid Build Coastguard Worker   ptr_a[26] = xp;
204*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[23];
205*15dc779aSAndroid Build Coastguard Worker   ptr_a[23] = ptr_a[58];
206*15dc779aSAndroid Build Coastguard Worker   ptr_a[58] = xp;
207*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[25];
208*15dc779aSAndroid Build Coastguard Worker   ptr_a[25] = ptr_a[38];
209*15dc779aSAndroid Build Coastguard Worker   ptr_a[38] = xp;
210*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[27];
211*15dc779aSAndroid Build Coastguard Worker   ptr_a[27] = ptr_a[54];
212*15dc779aSAndroid Build Coastguard Worker   ptr_a[54] = xp;
213*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[29];
214*15dc779aSAndroid Build Coastguard Worker   ptr_a[29] = ptr_a[46];
215*15dc779aSAndroid Build Coastguard Worker   ptr_a[46] = xp;
216*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[31];
217*15dc779aSAndroid Build Coastguard Worker   ptr_a[31] = ptr_a[62];
218*15dc779aSAndroid Build Coastguard Worker   ptr_a[62] = xp;
219*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[35];
220*15dc779aSAndroid Build Coastguard Worker   ptr_a[35] = ptr_a[49];
221*15dc779aSAndroid Build Coastguard Worker   ptr_a[49] = xp;
222*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[37];
223*15dc779aSAndroid Build Coastguard Worker   ptr_a[37] = ptr_a[41];
224*15dc779aSAndroid Build Coastguard Worker   ptr_a[41] = xp;
225*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[39];
226*15dc779aSAndroid Build Coastguard Worker   ptr_a[39] = ptr_a[57];
227*15dc779aSAndroid Build Coastguard Worker   ptr_a[57] = xp;
228*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[43];
229*15dc779aSAndroid Build Coastguard Worker   ptr_a[43] = ptr_a[53];
230*15dc779aSAndroid Build Coastguard Worker   ptr_a[53] = xp;
231*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[47];
232*15dc779aSAndroid Build Coastguard Worker   ptr_a[47] = ptr_a[61];
233*15dc779aSAndroid Build Coastguard Worker   ptr_a[61] = xp;
234*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[55];
235*15dc779aSAndroid Build Coastguard Worker   ptr_a[55] = ptr_a[59];
236*15dc779aSAndroid Build Coastguard Worker   ptr_a[59] = xp;
237*15dc779aSAndroid Build Coastguard Worker 
238*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[33];
239*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[62];
240*15dc779aSAndroid Build Coastguard Worker   ptr_a[62] = xp2 - xp;
241*15dc779aSAndroid Build Coastguard Worker   ptr_a[33] = xp2 + xp;
242*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[34];
243*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[60];
244*15dc779aSAndroid Build Coastguard Worker   ptr_a[60] = xp2 - xp;
245*15dc779aSAndroid Build Coastguard Worker   ptr_a[34] = xp2 + xp;
246*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[35];
247*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[61];
248*15dc779aSAndroid Build Coastguard Worker   ptr_a[61] = xp2 - xp;
249*15dc779aSAndroid Build Coastguard Worker   ptr_a[35] = xp2 + xp;
250*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[36];
251*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[56];
252*15dc779aSAndroid Build Coastguard Worker   ptr_a[56] = xp2 - xp;
253*15dc779aSAndroid Build Coastguard Worker   ptr_a[36] = xp2 + xp;
254*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[37];
255*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[57];
256*15dc779aSAndroid Build Coastguard Worker   ptr_a[57] = xp2 - xp;
257*15dc779aSAndroid Build Coastguard Worker   ptr_a[37] = xp2 + xp;
258*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[38];
259*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[58];
260*15dc779aSAndroid Build Coastguard Worker   ptr_a[58] = xp2 - xp;
261*15dc779aSAndroid Build Coastguard Worker   ptr_a[38] = xp2 + xp;
262*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[39];
263*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[59];
264*15dc779aSAndroid Build Coastguard Worker   ptr_a[59] = xp2 - xp;
265*15dc779aSAndroid Build Coastguard Worker   ptr_a[39] = xp2 + xp;
266*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[40];
267*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[48];
268*15dc779aSAndroid Build Coastguard Worker   ptr_a[48] = xp2 - xp;
269*15dc779aSAndroid Build Coastguard Worker   ptr_a[40] = xp2 + xp;
270*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[41];
271*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[49];
272*15dc779aSAndroid Build Coastguard Worker   ptr_a[49] = xp2 - xp;
273*15dc779aSAndroid Build Coastguard Worker   ptr_a[41] = xp2 + xp;
274*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[42];
275*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[50];
276*15dc779aSAndroid Build Coastguard Worker   ptr_a[50] = xp2 - xp;
277*15dc779aSAndroid Build Coastguard Worker   ptr_a[42] = xp2 + xp;
278*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[43];
279*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[51];
280*15dc779aSAndroid Build Coastguard Worker   ptr_a[51] = xp2 - xp;
281*15dc779aSAndroid Build Coastguard Worker   ptr_a[43] = xp2 + xp;
282*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[44];
283*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[52];
284*15dc779aSAndroid Build Coastguard Worker   ptr_a[52] = xp2 - xp;
285*15dc779aSAndroid Build Coastguard Worker   ptr_a[44] = xp2 + xp;
286*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[45];
287*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[53];
288*15dc779aSAndroid Build Coastguard Worker   ptr_a[53] = xp2 - xp;
289*15dc779aSAndroid Build Coastguard Worker   ptr_a[45] = xp2 + xp;
290*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[46];
291*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[54];
292*15dc779aSAndroid Build Coastguard Worker   ptr_a[54] = xp2 - xp;
293*15dc779aSAndroid Build Coastguard Worker   ptr_a[46] = xp2 + xp;
294*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[47];
295*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[55];
296*15dc779aSAndroid Build Coastguard Worker   ptr_a[55] = xp2 - xp;
297*15dc779aSAndroid Build Coastguard Worker   ptr_a[47] = xp2 + xp;
298*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[17];
299*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[30];
300*15dc779aSAndroid Build Coastguard Worker   ptr_a[30] = xp2 - xp;
301*15dc779aSAndroid Build Coastguard Worker   ptr_a[17] = xp2 + xp;
302*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[18];
303*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[28];
304*15dc779aSAndroid Build Coastguard Worker   ptr_a[28] = xp2 - xp;
305*15dc779aSAndroid Build Coastguard Worker   ptr_a[18] = xp2 + xp;
306*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[19];
307*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[29];
308*15dc779aSAndroid Build Coastguard Worker   ptr_a[29] = xp2 - xp;
309*15dc779aSAndroid Build Coastguard Worker   ptr_a[19] = xp2 + xp;
310*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[20];
311*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[24];
312*15dc779aSAndroid Build Coastguard Worker   ptr_a[24] = xp2 - xp;
313*15dc779aSAndroid Build Coastguard Worker   ptr_a[20] = xp2 + xp;
314*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[21];
315*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[25];
316*15dc779aSAndroid Build Coastguard Worker   ptr_a[25] = xp2 - xp;
317*15dc779aSAndroid Build Coastguard Worker   ptr_a[21] = xp2 + xp;
318*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[22];
319*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[26];
320*15dc779aSAndroid Build Coastguard Worker   ptr_a[26] = xp2 - xp;
321*15dc779aSAndroid Build Coastguard Worker   ptr_a[22] = xp2 + xp;
322*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[23];
323*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[27];
324*15dc779aSAndroid Build Coastguard Worker   ptr_a[27] = xp2 - xp;
325*15dc779aSAndroid Build Coastguard Worker   ptr_a[23] = xp2 + xp;
326*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[9];
327*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[14];
328*15dc779aSAndroid Build Coastguard Worker   ptr_a[14] = xp2 - xp;
329*15dc779aSAndroid Build Coastguard Worker   ptr_a[9] = xp2 + xp;
330*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[10];
331*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[12];
332*15dc779aSAndroid Build Coastguard Worker   ptr_a[12] = xp2 - xp;
333*15dc779aSAndroid Build Coastguard Worker   ptr_a[10] = xp2 + xp;
334*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[11];
335*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[13];
336*15dc779aSAndroid Build Coastguard Worker   ptr_a[13] = xp2 - xp;
337*15dc779aSAndroid Build Coastguard Worker   ptr_a[11] = xp2 + xp;
338*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[41];
339*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[46];
340*15dc779aSAndroid Build Coastguard Worker   ptr_a[46] = xp2 - xp;
341*15dc779aSAndroid Build Coastguard Worker   ptr_a[41] = xp2 + xp;
342*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[42];
343*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[44];
344*15dc779aSAndroid Build Coastguard Worker   ptr_a[44] = xp2 - xp;
345*15dc779aSAndroid Build Coastguard Worker   ptr_a[42] = xp2 + xp;
346*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[43];
347*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[45];
348*15dc779aSAndroid Build Coastguard Worker   ptr_a[45] = xp2 - xp;
349*15dc779aSAndroid Build Coastguard Worker   ptr_a[43] = xp2 + xp;
350*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[49];
351*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[54];
352*15dc779aSAndroid Build Coastguard Worker   ptr_a[49] = xp - xp2;
353*15dc779aSAndroid Build Coastguard Worker   ptr_a[54] = xp2 + xp;
354*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[50];
355*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[52];
356*15dc779aSAndroid Build Coastguard Worker   ptr_a[50] = xp - xp2;
357*15dc779aSAndroid Build Coastguard Worker   ptr_a[52] = xp2 + xp;
358*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[51];
359*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[53];
360*15dc779aSAndroid Build Coastguard Worker   ptr_a[51] = xp - xp2;
361*15dc779aSAndroid Build Coastguard Worker   ptr_a[53] = xp2 + xp;
362*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[5];
363*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[6];
364*15dc779aSAndroid Build Coastguard Worker   ptr_a[6] = xp2 - xp;
365*15dc779aSAndroid Build Coastguard Worker   ptr_a[5] = xp2 + xp;
366*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[21];
367*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[22];
368*15dc779aSAndroid Build Coastguard Worker   ptr_a[22] = xp2 - xp;
369*15dc779aSAndroid Build Coastguard Worker   ptr_a[21] = xp2 + xp;
370*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[25];
371*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[26];
372*15dc779aSAndroid Build Coastguard Worker   ptr_a[25] = xp - xp2;
373*15dc779aSAndroid Build Coastguard Worker   ptr_a[26] = xp2 + xp;
374*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[37];
375*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[38];
376*15dc779aSAndroid Build Coastguard Worker   ptr_a[38] = xp2 - xp;
377*15dc779aSAndroid Build Coastguard Worker   ptr_a[37] = xp2 + xp;
378*15dc779aSAndroid Build Coastguard Worker   xp = ptr_a[57];
379*15dc779aSAndroid Build Coastguard Worker   xp2 = ptr_a[58];
380*15dc779aSAndroid Build Coastguard Worker   ptr_a[57] = xp - xp2;
381*15dc779aSAndroid Build Coastguard Worker   ptr_a[58] = xp2 + xp;
382*15dc779aSAndroid Build Coastguard Worker 
383*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_fct3_4(ptr_a);
384*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_fct4_4r(ptr_a + 4);
385*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_fct3_4(ptr_a + 8);
386*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_fst3_4r(ptr_a + 12);
387*15dc779aSAndroid Build Coastguard Worker 
388*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_fct3_4(ptr_a + 16);
389*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_fct4_4r(ptr_a + 20);
390*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_fst4_4(ptr_a + 24);
391*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_fst3_4r(ptr_a + 28);
392*15dc779aSAndroid Build Coastguard Worker 
393*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_fct3_4(ptr_a + 32);
394*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_fct4_4r(ptr_a + 36);
395*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_fct3_4(ptr_a + 40);
396*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_fst3_4r(ptr_a + 44);
397*15dc779aSAndroid Build Coastguard Worker 
398*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_fct3_4(ptr_a + 48);
399*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_fst3_4r(ptr_a + 52);
400*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_fst4_4(ptr_a + 56);
401*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_fst3_4r(ptr_a + 60);
402*15dc779aSAndroid Build Coastguard Worker 
403*15dc779aSAndroid Build Coastguard Worker   ptr_ap = ptr_a;
404*15dc779aSAndroid Build Coastguard Worker   ptr_an = ptr_a + 7;
405*15dc779aSAndroid Build Coastguard Worker   for (k = 4; k != 0; k--) {
406*15dc779aSAndroid Build Coastguard Worker     xp = *ptr_ap++;
407*15dc779aSAndroid Build Coastguard Worker     xp2 = *ptr_an--;
408*15dc779aSAndroid Build Coastguard Worker     xp3 = *(ptr_ap + 15);
409*15dc779aSAndroid Build Coastguard Worker     xp4 = *(ptr_an + 17);
410*15dc779aSAndroid Build Coastguard Worker     *(ptr_an + 1) = xp - xp2;
411*15dc779aSAndroid Build Coastguard Worker     *(ptr_ap - 1) = xp + xp2;
412*15dc779aSAndroid Build Coastguard Worker 
413*15dc779aSAndroid Build Coastguard Worker     xp = *(ptr_ap + 23);
414*15dc779aSAndroid Build Coastguard Worker     xp2 = *(ptr_an + 25);
415*15dc779aSAndroid Build Coastguard Worker     *(ptr_an + 17) = xp3 - xp4;
416*15dc779aSAndroid Build Coastguard Worker     *(ptr_ap + 15) = xp3 + xp4;
417*15dc779aSAndroid Build Coastguard Worker 
418*15dc779aSAndroid Build Coastguard Worker     xp3 = *(ptr_ap + 31);
419*15dc779aSAndroid Build Coastguard Worker     xp4 = *(ptr_an + 33);
420*15dc779aSAndroid Build Coastguard Worker     *(ptr_ap + 23) = xp - xp2;
421*15dc779aSAndroid Build Coastguard Worker     *(ptr_an + 25) = xp + xp2;
422*15dc779aSAndroid Build Coastguard Worker 
423*15dc779aSAndroid Build Coastguard Worker     xp = *(ptr_ap + 55);
424*15dc779aSAndroid Build Coastguard Worker     xp2 = *(ptr_an + 57);
425*15dc779aSAndroid Build Coastguard Worker     *(ptr_an + 33) = xp3 - xp4;
426*15dc779aSAndroid Build Coastguard Worker     *(ptr_ap + 31) = xp3 + xp4;
427*15dc779aSAndroid Build Coastguard Worker 
428*15dc779aSAndroid Build Coastguard Worker     *(ptr_ap + 55) = xp - xp2;
429*15dc779aSAndroid Build Coastguard Worker     *(ptr_an + 57) = xp + xp2;
430*15dc779aSAndroid Build Coastguard Worker   }
431*15dc779aSAndroid Build Coastguard Worker 
432*15dc779aSAndroid Build Coastguard Worker   ptr_t1 = pstr_qmf_tab->cos_sin_fct4_8;
433*15dc779aSAndroid Build Coastguard Worker 
434*15dc779aSAndroid Build Coastguard Worker   ptr_ap = ptr_a + 8;
435*15dc779aSAndroid Build Coastguard Worker   ptr_an = ptr_a + 15;
436*15dc779aSAndroid Build Coastguard Worker   for (k = 4; k != 0; k--) {
437*15dc779aSAndroid Build Coastguard Worker     wc = *ptr_t1++;
438*15dc779aSAndroid Build Coastguard Worker     ws = *ptr_t1++;
439*15dc779aSAndroid Build Coastguard Worker 
440*15dc779aSAndroid Build Coastguard Worker     xp = *ptr_ap * wc + *ptr_an * ws;
441*15dc779aSAndroid Build Coastguard Worker     *ptr_ap = *ptr_ap * ws - *ptr_an * wc;
442*15dc779aSAndroid Build Coastguard Worker     ptr_ap++;
443*15dc779aSAndroid Build Coastguard Worker     *ptr_an-- = xp;
444*15dc779aSAndroid Build Coastguard Worker 
445*15dc779aSAndroid Build Coastguard Worker     xp = *(ptr_ap + 31) * wc + *(ptr_an + 33) * ws;
446*15dc779aSAndroid Build Coastguard Worker     *(ptr_ap + 31) = *(ptr_ap + 31) * ws - *(ptr_an + 33) * wc;
447*15dc779aSAndroid Build Coastguard Worker     *(ptr_an + 33) = xp;
448*15dc779aSAndroid Build Coastguard Worker 
449*15dc779aSAndroid Build Coastguard Worker     xp = *(ptr_ap + 39) * ws + *(ptr_an + 41) * wc;
450*15dc779aSAndroid Build Coastguard Worker     *(ptr_an + 41) = *(ptr_ap + 39) * wc - *(ptr_an + 41) * ws;
451*15dc779aSAndroid Build Coastguard Worker     *(ptr_ap + 39) = xp;
452*15dc779aSAndroid Build Coastguard Worker   }
453*15dc779aSAndroid Build Coastguard Worker 
454*15dc779aSAndroid Build Coastguard Worker   ptr_ap = ptr_a;
455*15dc779aSAndroid Build Coastguard Worker   ptr_an = ptr_a + 15;
456*15dc779aSAndroid Build Coastguard Worker   for (k = 8; k != 0; k--) {
457*15dc779aSAndroid Build Coastguard Worker     xp = *ptr_ap++;
458*15dc779aSAndroid Build Coastguard Worker     xp2 = *ptr_an--;
459*15dc779aSAndroid Build Coastguard Worker     xp3 = *(ptr_ap + 31);
460*15dc779aSAndroid Build Coastguard Worker     xp4 = *(ptr_an + 33);
461*15dc779aSAndroid Build Coastguard Worker 
462*15dc779aSAndroid Build Coastguard Worker     *(ptr_an + 1) = xp - xp2;
463*15dc779aSAndroid Build Coastguard Worker     *(ptr_ap - 1) = xp + xp2;
464*15dc779aSAndroid Build Coastguard Worker 
465*15dc779aSAndroid Build Coastguard Worker     xp = *(ptr_ap + 47);
466*15dc779aSAndroid Build Coastguard Worker     xp2 = *(ptr_an + 49);
467*15dc779aSAndroid Build Coastguard Worker     *(ptr_an + 33) = xp3 - xp4;
468*15dc779aSAndroid Build Coastguard Worker     *(ptr_ap + 31) = xp3 + xp4;
469*15dc779aSAndroid Build Coastguard Worker     *(ptr_ap + 47) = xp - xp2;
470*15dc779aSAndroid Build Coastguard Worker     *(ptr_an + 49) = xp + xp2;
471*15dc779aSAndroid Build Coastguard Worker   }
472*15dc779aSAndroid Build Coastguard Worker 
473*15dc779aSAndroid Build Coastguard Worker   ptr_t1 = pstr_qmf_tab->cos_sin_fct4_16;
474*15dc779aSAndroid Build Coastguard Worker 
475*15dc779aSAndroid Build Coastguard Worker   ptr1 = &ptr_a[16];
476*15dc779aSAndroid Build Coastguard Worker   ptr2 = &ptr_a[31];
477*15dc779aSAndroid Build Coastguard Worker   for (k = 7; k >= 0; k--) {
478*15dc779aSAndroid Build Coastguard Worker     wc = *ptr_t1++;
479*15dc779aSAndroid Build Coastguard Worker     ws = *ptr_t1++;
480*15dc779aSAndroid Build Coastguard Worker 
481*15dc779aSAndroid Build Coastguard Worker     xp = *ptr1;
482*15dc779aSAndroid Build Coastguard Worker     xp2 = *ptr2;
483*15dc779aSAndroid Build Coastguard Worker 
484*15dc779aSAndroid Build Coastguard Worker     *ptr2-- = xp * wc + xp2 * ws;
485*15dc779aSAndroid Build Coastguard Worker     *ptr1++ = xp * ws - xp2 * wc;
486*15dc779aSAndroid Build Coastguard Worker   }
487*15dc779aSAndroid Build Coastguard Worker 
488*15dc779aSAndroid Build Coastguard Worker   ptr1 = &ptr_a[0];
489*15dc779aSAndroid Build Coastguard Worker   ptr2 = &ptr_a[31];
490*15dc779aSAndroid Build Coastguard Worker   for (k = 15; k >= 0; k--) {
491*15dc779aSAndroid Build Coastguard Worker     xp = *ptr1;
492*15dc779aSAndroid Build Coastguard Worker     xp2 = *ptr2;
493*15dc779aSAndroid Build Coastguard Worker 
494*15dc779aSAndroid Build Coastguard Worker     *ptr1++ = xp + xp2;
495*15dc779aSAndroid Build Coastguard Worker     *ptr2-- = xp - xp2;
496*15dc779aSAndroid Build Coastguard Worker   }
497*15dc779aSAndroid Build Coastguard Worker 
498*15dc779aSAndroid Build Coastguard Worker   ptr_t1 = pstr_qmf_tab->cos_sin_fct4_32;
499*15dc779aSAndroid Build Coastguard Worker   ptr1 = &ptr_a[32];
500*15dc779aSAndroid Build Coastguard Worker   ptr2 = &ptr_a[63];
501*15dc779aSAndroid Build Coastguard Worker 
502*15dc779aSAndroid Build Coastguard Worker   for (k = 15; k >= 0; k--) {
503*15dc779aSAndroid Build Coastguard Worker     wc = *ptr_t1++;
504*15dc779aSAndroid Build Coastguard Worker     ws = *ptr_t1++;
505*15dc779aSAndroid Build Coastguard Worker 
506*15dc779aSAndroid Build Coastguard Worker     xp = *ptr1;
507*15dc779aSAndroid Build Coastguard Worker     xp2 = *ptr2;
508*15dc779aSAndroid Build Coastguard Worker 
509*15dc779aSAndroid Build Coastguard Worker     *ptr2-- = xp * wc + xp2 * ws;
510*15dc779aSAndroid Build Coastguard Worker     *ptr1++ = xp * ws - xp2 * wc;
511*15dc779aSAndroid Build Coastguard Worker   }
512*15dc779aSAndroid Build Coastguard Worker 
513*15dc779aSAndroid Build Coastguard Worker   ptr1 = &ptr_a[0];
514*15dc779aSAndroid Build Coastguard Worker   ptr2 = &ptr_a[63];
515*15dc779aSAndroid Build Coastguard Worker   for (k = 31; k >= 0; k--) {
516*15dc779aSAndroid Build Coastguard Worker     xp = *ptr1;
517*15dc779aSAndroid Build Coastguard Worker     xp2 = *ptr2;
518*15dc779aSAndroid Build Coastguard Worker 
519*15dc779aSAndroid Build Coastguard Worker     *ptr1++ = xp + xp2;
520*15dc779aSAndroid Build Coastguard Worker     *ptr2-- = xp - xp2;
521*15dc779aSAndroid Build Coastguard Worker   }
522*15dc779aSAndroid Build Coastguard Worker }
523*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_fst3_64(FLOAT32 * ptr_a,ixheaace_str_qmf_tabs * pstr_qmf_tab)524*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_fst3_64(FLOAT32 *ptr_a, ixheaace_str_qmf_tabs *pstr_qmf_tab) {
525*15dc779aSAndroid Build Coastguard Worker   WORD32 k;
526*15dc779aSAndroid Build Coastguard Worker   FLOAT32 xp, xp2;
527*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr1, *ptr2;
528*15dc779aSAndroid Build Coastguard Worker 
529*15dc779aSAndroid Build Coastguard Worker   ptr1 = &ptr_a[0];
530*15dc779aSAndroid Build Coastguard Worker   ptr2 = &ptr_a[63];
531*15dc779aSAndroid Build Coastguard Worker 
532*15dc779aSAndroid Build Coastguard Worker   for (k = 31; k >= 0; k--) {
533*15dc779aSAndroid Build Coastguard Worker     xp = *ptr1;
534*15dc779aSAndroid Build Coastguard Worker     xp2 = *ptr2;
535*15dc779aSAndroid Build Coastguard Worker     *ptr2-- = xp;
536*15dc779aSAndroid Build Coastguard Worker     *ptr1++ = xp2;
537*15dc779aSAndroid Build Coastguard Worker   }
538*15dc779aSAndroid Build Coastguard Worker 
539*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_fct3_64(ptr_a, pstr_qmf_tab);
540*15dc779aSAndroid Build Coastguard Worker 
541*15dc779aSAndroid Build Coastguard Worker   ptr1 = &ptr_a[1];
542*15dc779aSAndroid Build Coastguard Worker 
543*15dc779aSAndroid Build Coastguard Worker   for (k = 15; k >= 0; k--) {
544*15dc779aSAndroid Build Coastguard Worker     xp = *ptr1;
545*15dc779aSAndroid Build Coastguard Worker     xp2 = *(ptr1 + 2);
546*15dc779aSAndroid Build Coastguard Worker     *ptr1++ = -xp;
547*15dc779aSAndroid Build Coastguard Worker     ptr1++;
548*15dc779aSAndroid Build Coastguard Worker     *ptr1++ = -xp2;
549*15dc779aSAndroid Build Coastguard Worker     ptr1++;
550*15dc779aSAndroid Build Coastguard Worker   }
551*15dc779aSAndroid Build Coastguard Worker }
552*15dc779aSAndroid Build Coastguard Worker 
ixheaace_sbr_pre_mdct(FLOAT32 * ptr_x,WORD32 len,const FLOAT32 * ptr_sine_window)553*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_sbr_pre_mdct(FLOAT32 *ptr_x, WORD32 len, const FLOAT32 *ptr_sine_window) {
554*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
555*15dc779aSAndroid Build Coastguard Worker   FLOAT32 wre, wim, re1, re2, im1, im2;
556*15dc779aSAndroid Build Coastguard Worker 
557*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < len / 4; i++) {
558*15dc779aSAndroid Build Coastguard Worker     re1 = ptr_x[2 * i];
559*15dc779aSAndroid Build Coastguard Worker     re2 = ptr_x[2 * i + 1];
560*15dc779aSAndroid Build Coastguard Worker     im2 = ptr_x[len - 2 - 2 * i];
561*15dc779aSAndroid Build Coastguard Worker     im1 = ptr_x[len - 1 - 2 * i];
562*15dc779aSAndroid Build Coastguard Worker 
563*15dc779aSAndroid Build Coastguard Worker     wim = ptr_sine_window[2 * i];
564*15dc779aSAndroid Build Coastguard Worker     wre = ptr_sine_window[len - 1 - 2 * i];
565*15dc779aSAndroid Build Coastguard Worker 
566*15dc779aSAndroid Build Coastguard Worker     ptr_x[2 * i] = im1 * wim + re1 * wre;
567*15dc779aSAndroid Build Coastguard Worker 
568*15dc779aSAndroid Build Coastguard Worker     ptr_x[2 * i + 1] = im1 * wre - re1 * wim;
569*15dc779aSAndroid Build Coastguard Worker 
570*15dc779aSAndroid Build Coastguard Worker     wre = ptr_sine_window[len - 2 - 2 * i];
571*15dc779aSAndroid Build Coastguard Worker     wim = ptr_sine_window[2 * i + 1];
572*15dc779aSAndroid Build Coastguard Worker 
573*15dc779aSAndroid Build Coastguard Worker     ptr_x[len - 2 - 2 * i] = im2 * wim + re2 * wre;
574*15dc779aSAndroid Build Coastguard Worker 
575*15dc779aSAndroid Build Coastguard Worker     ptr_x[len - 1 - 2 * i] = -(im2 * wre - re2 * wim);
576*15dc779aSAndroid Build Coastguard Worker   }
577*15dc779aSAndroid Build Coastguard Worker }
ixheaace_sbr_pre_mdst(FLOAT32 * ptr_x,WORD32 len,const FLOAT32 * ptr_sine_window)578*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_sbr_pre_mdst(FLOAT32 *ptr_x, WORD32 len, const FLOAT32 *ptr_sine_window) {
579*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
580*15dc779aSAndroid Build Coastguard Worker   FLOAT32 wre, wim, re1, re2, im1, im2;
581*15dc779aSAndroid Build Coastguard Worker 
582*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < len / 4; i++) {
583*15dc779aSAndroid Build Coastguard Worker     re1 = -ptr_x[2 * i];
584*15dc779aSAndroid Build Coastguard Worker     re2 = ptr_x[2 * i + 1];
585*15dc779aSAndroid Build Coastguard Worker     im2 = -ptr_x[len - 2 - 2 * i];
586*15dc779aSAndroid Build Coastguard Worker     im1 = ptr_x[len - 1 - 2 * i];
587*15dc779aSAndroid Build Coastguard Worker 
588*15dc779aSAndroid Build Coastguard Worker     wim = ptr_sine_window[2 * i];
589*15dc779aSAndroid Build Coastguard Worker     wre = ptr_sine_window[len - 1 - 2 * i];
590*15dc779aSAndroid Build Coastguard Worker 
591*15dc779aSAndroid Build Coastguard Worker     ptr_x[2 * i] = im1 * wim + re1 * wre;
592*15dc779aSAndroid Build Coastguard Worker 
593*15dc779aSAndroid Build Coastguard Worker     ptr_x[2 * i + 1] = im1 * wre - re1 * wim;
594*15dc779aSAndroid Build Coastguard Worker 
595*15dc779aSAndroid Build Coastguard Worker     wim = ptr_sine_window[2 * i + 1];
596*15dc779aSAndroid Build Coastguard Worker     wre = ptr_sine_window[len - 2 - 2 * i];
597*15dc779aSAndroid Build Coastguard Worker 
598*15dc779aSAndroid Build Coastguard Worker     ptr_x[len - 2 - 2 * i] = im2 * wim + re2 * wre;
599*15dc779aSAndroid Build Coastguard Worker 
600*15dc779aSAndroid Build Coastguard Worker     ptr_x[len - 1 - 2 * i] = -(im2 * wre - re2 * wim);
601*15dc779aSAndroid Build Coastguard Worker   }
602*15dc779aSAndroid Build Coastguard Worker }
ixheaace_sbr_post_mdct(FLOAT32 * ptr_x,WORD32 len,const FLOAT32 * ptr_trig_data)603*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_sbr_post_mdct(FLOAT32 *ptr_x, WORD32 len, const FLOAT32 *ptr_trig_data) {
604*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
605*15dc779aSAndroid Build Coastguard Worker   FLOAT32 wre, wim, re1, re2, im1, im2;
606*15dc779aSAndroid Build Coastguard Worker 
607*15dc779aSAndroid Build Coastguard Worker   FLOAT32 temp1 = -ptr_x[1];
608*15dc779aSAndroid Build Coastguard Worker   FLOAT32 temp2 = ptr_x[len / 2];
609*15dc779aSAndroid Build Coastguard Worker   FLOAT32 temp3 = ptr_x[len / 2 + 1];
610*15dc779aSAndroid Build Coastguard Worker   FLOAT32 val = 0.70709228515625f;
611*15dc779aSAndroid Build Coastguard Worker 
612*15dc779aSAndroid Build Coastguard Worker   re2 = ptr_x[len - 2];
613*15dc779aSAndroid Build Coastguard Worker   im2 = ptr_x[len - 1];
614*15dc779aSAndroid Build Coastguard Worker   for (i = 1; i < len / 4; i++) {
615*15dc779aSAndroid Build Coastguard Worker     wim = ptr_trig_data[i];
616*15dc779aSAndroid Build Coastguard Worker     wre = ptr_trig_data[len / 2 - 1 - i];
617*15dc779aSAndroid Build Coastguard Worker 
618*15dc779aSAndroid Build Coastguard Worker     ptr_x[2 * i - 1] = (re2 * wre - im2 * wim);
619*15dc779aSAndroid Build Coastguard Worker     ptr_x[len - 2 * i] = (re2 * wim + im2 * wre);
620*15dc779aSAndroid Build Coastguard Worker 
621*15dc779aSAndroid Build Coastguard Worker     re1 = ptr_x[2 * i];
622*15dc779aSAndroid Build Coastguard Worker     im1 = ptr_x[2 * i + 1];
623*15dc779aSAndroid Build Coastguard Worker     re2 = ptr_x[len - 2 - 2 * i];
624*15dc779aSAndroid Build Coastguard Worker     im2 = ptr_x[len - 1 - 2 * i];
625*15dc779aSAndroid Build Coastguard Worker 
626*15dc779aSAndroid Build Coastguard Worker     ptr_x[2 * i] = (re1 * wre + im1 * wim);
627*15dc779aSAndroid Build Coastguard Worker     ptr_x[len - 1 - 2 * i] = (re1 * wim - im1 * wre);
628*15dc779aSAndroid Build Coastguard Worker   }
629*15dc779aSAndroid Build Coastguard Worker 
630*15dc779aSAndroid Build Coastguard Worker   ptr_x[len / 2 - 1] = (temp2 - temp3) * val;
631*15dc779aSAndroid Build Coastguard Worker   ptr_x[len / 2] = (temp2 + temp3) * val;
632*15dc779aSAndroid Build Coastguard Worker   ptr_x[len - 1] = temp1;
633*15dc779aSAndroid Build Coastguard Worker }
ixheaace_sbr_post_mdst(FLOAT32 * ptr_x,WORD32 len,const FLOAT32 * ptr_trig_data)634*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_sbr_post_mdst(FLOAT32 *ptr_x, WORD32 len, const FLOAT32 *ptr_trig_data) {
635*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
636*15dc779aSAndroid Build Coastguard Worker   FLOAT32 wre, wim, re1, re2, im1, im2;
637*15dc779aSAndroid Build Coastguard Worker   FLOAT32 temp0 = -ptr_x[0];
638*15dc779aSAndroid Build Coastguard Worker   FLOAT32 temp1 = ptr_x[1];
639*15dc779aSAndroid Build Coastguard Worker   FLOAT32 temp2 = ptr_x[len / 2];
640*15dc779aSAndroid Build Coastguard Worker   FLOAT32 temp3 = ptr_x[len / 2 + 1];
641*15dc779aSAndroid Build Coastguard Worker   FLOAT32 val = 0.70709228515625f;
642*15dc779aSAndroid Build Coastguard Worker 
643*15dc779aSAndroid Build Coastguard Worker   re2 = ptr_x[len - 2];
644*15dc779aSAndroid Build Coastguard Worker   im2 = ptr_x[len - 1];
645*15dc779aSAndroid Build Coastguard Worker 
646*15dc779aSAndroid Build Coastguard Worker   for (i = 1; i < len / 4; i++) {
647*15dc779aSAndroid Build Coastguard Worker     wim = ptr_trig_data[i];
648*15dc779aSAndroid Build Coastguard Worker     wre = ptr_trig_data[len / 2 - 1 - i];
649*15dc779aSAndroid Build Coastguard Worker 
650*15dc779aSAndroid Build Coastguard Worker     ptr_x[2 * i - 1] = -(re2 * wim + im2 * wre);
651*15dc779aSAndroid Build Coastguard Worker     ptr_x[len - 2 * i] = -(re2 * wre - im2 * wim);
652*15dc779aSAndroid Build Coastguard Worker 
653*15dc779aSAndroid Build Coastguard Worker     re1 = ptr_x[2 * i];
654*15dc779aSAndroid Build Coastguard Worker     im1 = ptr_x[2 * i + 1];
655*15dc779aSAndroid Build Coastguard Worker     re2 = ptr_x[len - 2 - 2 * i];
656*15dc779aSAndroid Build Coastguard Worker     im2 = ptr_x[len - 1 - 2 * i];
657*15dc779aSAndroid Build Coastguard Worker 
658*15dc779aSAndroid Build Coastguard Worker     ptr_x[len - 1 - 2 * i] = -(re1 * wre + im1 * wim);
659*15dc779aSAndroid Build Coastguard Worker     ptr_x[2 * i] = -(re1 * wim - im1 * wre);
660*15dc779aSAndroid Build Coastguard Worker   }
661*15dc779aSAndroid Build Coastguard Worker 
662*15dc779aSAndroid Build Coastguard Worker   ptr_x[len / 2] = (temp3 - temp2) * val;
663*15dc779aSAndroid Build Coastguard Worker   ptr_x[len / 2 - 1] = -(temp3 + temp2) * val;
664*15dc779aSAndroid Build Coastguard Worker 
665*15dc779aSAndroid Build Coastguard Worker   ptr_x[0] = temp1;
666*15dc779aSAndroid Build Coastguard Worker   ptr_x[len - 1] = temp0;
667*15dc779aSAndroid Build Coastguard Worker }
ixheaace_sbr_mdct(FLOAT32 * ptr_dct_data,WORD32 n,FLOAT32 * ptr_sbr_scratch)668*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_sbr_mdct(FLOAT32 *ptr_dct_data, WORD32 n, FLOAT32 *ptr_sbr_scratch) {
669*15dc779aSAndroid Build Coastguard Worker   ixheaace_sbr_pre_mdct(ptr_dct_data, n, &long_window_sine_ld_64[0]);
670*15dc779aSAndroid Build Coastguard Worker 
671*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_complex_fft_p2(ptr_dct_data, n / 2, ptr_sbr_scratch);
672*15dc779aSAndroid Build Coastguard Worker 
673*15dc779aSAndroid Build Coastguard Worker   ixheaace_sbr_post_mdct(ptr_dct_data, n, &fft_twiddle_tab_32[0]);
674*15dc779aSAndroid Build Coastguard Worker }
675*15dc779aSAndroid Build Coastguard Worker 
ixheaace_sbr_mdst(FLOAT32 * ptr_dct_data,WORD32 n,FLOAT32 * ptr_sbr_scratch)676*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_sbr_mdst(FLOAT32 *ptr_dct_data, WORD32 n, FLOAT32 *ptr_sbr_scratch) {
677*15dc779aSAndroid Build Coastguard Worker   ixheaace_sbr_pre_mdst(ptr_dct_data, n, &long_window_sine_ld_64[0]);
678*15dc779aSAndroid Build Coastguard Worker 
679*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_complex_fft_p2(ptr_dct_data, n / 2, ptr_sbr_scratch);
680*15dc779aSAndroid Build Coastguard Worker 
681*15dc779aSAndroid Build Coastguard Worker   ixheaace_sbr_post_mdst(ptr_dct_data, n, &fft_twiddle_tab_32[0]);
682*15dc779aSAndroid Build Coastguard Worker }
ia_enhaacplus_enc_forward_modulation(const FLOAT32 * ptr_time_in,FLOAT32 * ptr_r_subband,FLOAT32 * ptr_i_subband,ixheaace_str_qmf_tabs * pstr_qmf_tab,WORD32 is_ld_sbr,FLOAT32 * ptr_sbr_scratch)683*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_forward_modulation(const FLOAT32 *ptr_time_in,
684*15dc779aSAndroid Build Coastguard Worker                                                  FLOAT32 *ptr_r_subband, FLOAT32 *ptr_i_subband,
685*15dc779aSAndroid Build Coastguard Worker                                                  ixheaace_str_qmf_tabs *pstr_qmf_tab,
686*15dc779aSAndroid Build Coastguard Worker                                                  WORD32 is_ld_sbr, FLOAT32 *ptr_sbr_scratch) {
687*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
688*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tmp1, tmp2, tmp3, tmp4;
689*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_inp1, *ptr_inp2;
690*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_re, *ptr_im;
691*15dc779aSAndroid Build Coastguard Worker   FLOAT32 real, imag;
692*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_window = &sbr_sin_cos_window[0];
693*15dc779aSAndroid Build Coastguard Worker   if (is_ld_sbr) {
694*15dc779aSAndroid Build Coastguard Worker     ptr_re = &ptr_r_subband[0];
695*15dc779aSAndroid Build Coastguard Worker     ptr_im = &ptr_i_subband[0];
696*15dc779aSAndroid Build Coastguard Worker     ptr_inp1 = &ptr_time_in[0];
697*15dc779aSAndroid Build Coastguard Worker   } else {
698*15dc779aSAndroid Build Coastguard Worker     ptr_r_subband[0] = ptr_time_in[0];
699*15dc779aSAndroid Build Coastguard Worker     ptr_re = &ptr_r_subband[1];
700*15dc779aSAndroid Build Coastguard Worker     ptr_im = &ptr_i_subband[0];
701*15dc779aSAndroid Build Coastguard Worker     ptr_inp1 = &ptr_time_in[1];
702*15dc779aSAndroid Build Coastguard Worker   }
703*15dc779aSAndroid Build Coastguard Worker   ptr_inp2 = &ptr_time_in[127];
704*15dc779aSAndroid Build Coastguard Worker   if (is_ld_sbr) {
705*15dc779aSAndroid Build Coastguard Worker     i = IXHEAACE_QMF_CHANNELS / 2 - 1;
706*15dc779aSAndroid Build Coastguard Worker     while (i >= 0) {
707*15dc779aSAndroid Build Coastguard Worker       tmp1 = *ptr_inp1++;
708*15dc779aSAndroid Build Coastguard Worker       tmp2 = *ptr_inp2--;
709*15dc779aSAndroid Build Coastguard Worker       tmp3 = *ptr_inp1++;
710*15dc779aSAndroid Build Coastguard Worker       tmp4 = *ptr_inp2--;
711*15dc779aSAndroid Build Coastguard Worker       *ptr_re++ = (tmp1 - tmp2);
712*15dc779aSAndroid Build Coastguard Worker       *ptr_im++ = (tmp1 + tmp2);
713*15dc779aSAndroid Build Coastguard Worker       *ptr_re++ = (tmp3 - tmp4);
714*15dc779aSAndroid Build Coastguard Worker       *ptr_im++ = (tmp3 + tmp4);
715*15dc779aSAndroid Build Coastguard Worker       i--;
716*15dc779aSAndroid Build Coastguard Worker     }
717*15dc779aSAndroid Build Coastguard Worker 
718*15dc779aSAndroid Build Coastguard Worker     ixheaace_sbr_mdct(ptr_r_subband, 64, ptr_sbr_scratch);
719*15dc779aSAndroid Build Coastguard Worker     ixheaace_sbr_mdst(ptr_i_subband, 64, ptr_sbr_scratch);
720*15dc779aSAndroid Build Coastguard Worker 
721*15dc779aSAndroid Build Coastguard Worker     i = 0;
722*15dc779aSAndroid Build Coastguard Worker     while (i < IXHEAACE_QMF_CHANNELS) {
723*15dc779aSAndroid Build Coastguard Worker       real = ptr_r_subband[i];
724*15dc779aSAndroid Build Coastguard Worker       imag = ptr_i_subband[i];
725*15dc779aSAndroid Build Coastguard Worker       ptr_r_subband[i] =
726*15dc779aSAndroid Build Coastguard Worker           imag * ptr_window[i] + real * ptr_window[2 * IXHEAACE_QMF_CHANNELS - 1 - i];
727*15dc779aSAndroid Build Coastguard Worker       ptr_i_subband[i] =
728*15dc779aSAndroid Build Coastguard Worker           imag * ptr_window[2 * IXHEAACE_QMF_CHANNELS - 1 - i] - real * ptr_window[i];
729*15dc779aSAndroid Build Coastguard Worker       i++;
730*15dc779aSAndroid Build Coastguard Worker     }
731*15dc779aSAndroid Build Coastguard Worker   } else {
732*15dc779aSAndroid Build Coastguard Worker     for (i = 30; i >= 0; i--) {
733*15dc779aSAndroid Build Coastguard Worker       tmp1 = *ptr_inp1++;
734*15dc779aSAndroid Build Coastguard Worker       tmp2 = *ptr_inp2--;
735*15dc779aSAndroid Build Coastguard Worker       tmp3 = *ptr_inp1++;
736*15dc779aSAndroid Build Coastguard Worker 
737*15dc779aSAndroid Build Coastguard Worker       *ptr_re++ = tmp1 - tmp2;
738*15dc779aSAndroid Build Coastguard Worker       tmp4 = *ptr_inp2--;
739*15dc779aSAndroid Build Coastguard Worker       *ptr_im++ = tmp1 + tmp2;
740*15dc779aSAndroid Build Coastguard Worker       *ptr_re++ = tmp3 - tmp4;
741*15dc779aSAndroid Build Coastguard Worker       *ptr_im++ = tmp3 + tmp4;
742*15dc779aSAndroid Build Coastguard Worker     }
743*15dc779aSAndroid Build Coastguard Worker     tmp1 = *ptr_inp1;
744*15dc779aSAndroid Build Coastguard Worker     tmp2 = *ptr_inp2;
745*15dc779aSAndroid Build Coastguard Worker     *ptr_re = tmp1 - tmp2;
746*15dc779aSAndroid Build Coastguard Worker     *ptr_im = tmp1 + tmp2;
747*15dc779aSAndroid Build Coastguard Worker 
748*15dc779aSAndroid Build Coastguard Worker     ptr_i_subband[63] = ptr_time_in[64];
749*15dc779aSAndroid Build Coastguard Worker 
750*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_fct3_64(ptr_r_subband, pstr_qmf_tab);
751*15dc779aSAndroid Build Coastguard Worker 
752*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_fst3_64(ptr_i_subband, pstr_qmf_tab);
753*15dc779aSAndroid Build Coastguard Worker   }
754*15dc779aSAndroid Build Coastguard Worker }
755*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_sbr_qmf_analysis_win_add(const FLOAT32 * ptr_pf_l,const FLOAT32 * ptr_pf_r,FLOAT32 * ptr_fp1,FLOAT32 * ptr_fp2,FLOAT32 * ptr_syn_buffer)756*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_sbr_qmf_analysis_win_add(const FLOAT32 *ptr_pf_l,
757*15dc779aSAndroid Build Coastguard Worker                                                        const FLOAT32 *ptr_pf_r, FLOAT32 *ptr_fp1,
758*15dc779aSAndroid Build Coastguard Worker                                                        FLOAT32 *ptr_fp2,
759*15dc779aSAndroid Build Coastguard Worker                                                        FLOAT32 *ptr_syn_buffer) {
760*15dc779aSAndroid Build Coastguard Worker   FLOAT32 accu_l = 0, accu_r = 0;
761*15dc779aSAndroid Build Coastguard Worker   WORD k;
762*15dc779aSAndroid Build Coastguard Worker   for (k = 0; k < 64; k++) {
763*15dc779aSAndroid Build Coastguard Worker     accu_l = 0;
764*15dc779aSAndroid Build Coastguard Worker     accu_r = 0;
765*15dc779aSAndroid Build Coastguard Worker 
766*15dc779aSAndroid Build Coastguard Worker     {
767*15dc779aSAndroid Build Coastguard Worker       accu_l += *ptr_pf_l++ * ptr_fp1[k];
768*15dc779aSAndroid Build Coastguard Worker       accu_l += *ptr_pf_l++ * ptr_fp1[128 + k];
769*15dc779aSAndroid Build Coastguard Worker       accu_l += *ptr_pf_l++ * ptr_fp1[256 + k];
770*15dc779aSAndroid Build Coastguard Worker       accu_l += *ptr_pf_l++ * ptr_fp1[384 + k];
771*15dc779aSAndroid Build Coastguard Worker       accu_l += *ptr_pf_l++ * ptr_fp1[512 + k];
772*15dc779aSAndroid Build Coastguard Worker 
773*15dc779aSAndroid Build Coastguard Worker       accu_r += *--ptr_pf_r * ptr_fp2[k];
774*15dc779aSAndroid Build Coastguard Worker       accu_r += *--ptr_pf_r * ptr_fp2[128 + k];
775*15dc779aSAndroid Build Coastguard Worker       accu_r += *--ptr_pf_r * ptr_fp2[256 + k];
776*15dc779aSAndroid Build Coastguard Worker       accu_r += *--ptr_pf_r * ptr_fp2[384 + k];
777*15dc779aSAndroid Build Coastguard Worker       accu_r += *--ptr_pf_r * ptr_fp2[512 + k];
778*15dc779aSAndroid Build Coastguard Worker     }
779*15dc779aSAndroid Build Coastguard Worker     ptr_syn_buffer[127 - k] = accu_l;
780*15dc779aSAndroid Build Coastguard Worker     ptr_syn_buffer[63 - k] = accu_r;
781*15dc779aSAndroid Build Coastguard Worker     ptr_pf_l += 5;
782*15dc779aSAndroid Build Coastguard Worker     ptr_pf_r -= 5;
783*15dc779aSAndroid Build Coastguard Worker   }
784*15dc779aSAndroid Build Coastguard Worker }
785*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_sbr_cld_analysis_win_add(FLOAT32 * ptr_filter_states,const FLOAT32 * ptr_coeffs,FLOAT32 * ptr_sync_buffer,WORD32 num_qmf_ch,WORD32 time_sn_stride)786*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_sbr_cld_analysis_win_add(FLOAT32 *ptr_filter_states,
787*15dc779aSAndroid Build Coastguard Worker                                                        const FLOAT32 *ptr_coeffs,
788*15dc779aSAndroid Build Coastguard Worker                                                        FLOAT32 *ptr_sync_buffer,
789*15dc779aSAndroid Build Coastguard Worker                                                        WORD32 num_qmf_ch, WORD32 time_sn_stride) {
790*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
791*15dc779aSAndroid Build Coastguard Worker   WORD32 len = num_qmf_ch * time_sn_stride;
792*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_fil_states = &ptr_filter_states[CLD_FILTER_LENGTH - 1];
793*15dc779aSAndroid Build Coastguard Worker 
794*15dc779aSAndroid Build Coastguard Worker   memset(ptr_sync_buffer, 0, len * sizeof(*ptr_sync_buffer));
795*15dc779aSAndroid Build Coastguard Worker 
796*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < CLD_FILTER_LENGTH; i++) {
797*15dc779aSAndroid Build Coastguard Worker     ptr_sync_buffer[i % len] += (*ptr_fil_states-- * ptr_coeffs[i]);
798*15dc779aSAndroid Build Coastguard Worker   }
799*15dc779aSAndroid Build Coastguard Worker }
ixheaace_sbr_analysis_filtering(const FLOAT32 * ptr_time_in,WORD32 time_sn_stride,FLOAT32 ** ptr_ana_r,FLOAT32 ** ptr_ana_i,ixheaace_pstr_sbr_qmf_filter_bank pstr_qmf_bank,ixheaace_str_qmf_tabs * pstr_qmf_tab,WORD32 num_qmf_subsamp,WORD32 is_ld_sbr,FLOAT32 * ptr_sbr_scratch,WORD32 is_ps_960)800*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_sbr_analysis_filtering(const FLOAT32 *ptr_time_in, WORD32 time_sn_stride,
801*15dc779aSAndroid Build Coastguard Worker                                      FLOAT32 **ptr_ana_r, FLOAT32 **ptr_ana_i,
802*15dc779aSAndroid Build Coastguard Worker                                      ixheaace_pstr_sbr_qmf_filter_bank pstr_qmf_bank,
803*15dc779aSAndroid Build Coastguard Worker                                      ixheaace_str_qmf_tabs *pstr_qmf_tab, WORD32 num_qmf_subsamp,
804*15dc779aSAndroid Build Coastguard Worker                                      WORD32 is_ld_sbr, FLOAT32 *ptr_sbr_scratch,
805*15dc779aSAndroid Build Coastguard Worker                                      WORD32 is_ps_960) {
806*15dc779aSAndroid Build Coastguard Worker   WORD32 i, k;
807*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_pf_l, *ptr_pf_r;
808*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_fp1, *ptr_fp2, *ptr_tmp;
809*15dc779aSAndroid Build Coastguard Worker   FLOAT32 syn_buffer[2 * IXHEAACE_QMF_CHANNELS] = {0};
810*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_start_coeff_l;
811*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_start_coeff_r;
812*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_qmf_states_curr_pos;
813*15dc779aSAndroid Build Coastguard Worker   WORD32 start_coeff_cnt = 0;
814*15dc779aSAndroid Build Coastguard Worker   WORD16 flag = 0;
815*15dc779aSAndroid Build Coastguard Worker   WORD32 offset;
816*15dc779aSAndroid Build Coastguard Worker   if (is_ld_sbr) {
817*15dc779aSAndroid Build Coastguard Worker     offset = 576;
818*15dc779aSAndroid Build Coastguard Worker     i = 0;
819*15dc779aSAndroid Build Coastguard Worker     while (i < num_qmf_subsamp) {
820*15dc779aSAndroid Build Coastguard Worker       ptr_qmf_states_curr_pos = pstr_qmf_bank->ptr_qmf_states_curr_pos;
821*15dc779aSAndroid Build Coastguard Worker 
822*15dc779aSAndroid Build Coastguard Worker       if (ptr_time_in) {
823*15dc779aSAndroid Build Coastguard Worker         FLOAT32 *ptr_qmf_states = pstr_qmf_bank->ptr_qmf_states_curr_pos + offset;
824*15dc779aSAndroid Build Coastguard Worker 
825*15dc779aSAndroid Build Coastguard Worker         const FLOAT32 *ptr_inp = &ptr_time_in[(i * 64 * time_sn_stride)];
826*15dc779aSAndroid Build Coastguard Worker         FLOAT32 tmp1, tmp2, tmp3, tmp4;
827*15dc779aSAndroid Build Coastguard Worker         for (k = 15; k >= 0; k--) {
828*15dc779aSAndroid Build Coastguard Worker           tmp1 = *ptr_inp;
829*15dc779aSAndroid Build Coastguard Worker           ptr_inp += time_sn_stride;
830*15dc779aSAndroid Build Coastguard Worker 
831*15dc779aSAndroid Build Coastguard Worker           tmp2 = *ptr_inp;
832*15dc779aSAndroid Build Coastguard Worker           ptr_inp += time_sn_stride;
833*15dc779aSAndroid Build Coastguard Worker 
834*15dc779aSAndroid Build Coastguard Worker           tmp3 = *ptr_inp;
835*15dc779aSAndroid Build Coastguard Worker           ptr_inp += time_sn_stride;
836*15dc779aSAndroid Build Coastguard Worker 
837*15dc779aSAndroid Build Coastguard Worker           *ptr_qmf_states++ = tmp1;
838*15dc779aSAndroid Build Coastguard Worker           tmp4 = *ptr_inp;
839*15dc779aSAndroid Build Coastguard Worker           ptr_inp += time_sn_stride;
840*15dc779aSAndroid Build Coastguard Worker 
841*15dc779aSAndroid Build Coastguard Worker           *ptr_qmf_states++ = tmp2;
842*15dc779aSAndroid Build Coastguard Worker           *ptr_qmf_states++ = tmp3;
843*15dc779aSAndroid Build Coastguard Worker           *ptr_qmf_states++ = tmp4;
844*15dc779aSAndroid Build Coastguard Worker         }
845*15dc779aSAndroid Build Coastguard Worker       } else {
846*15dc779aSAndroid Build Coastguard Worker         memset(&ptr_qmf_states_curr_pos[0], 0,
847*15dc779aSAndroid Build Coastguard Worker                sizeof(ptr_qmf_states_curr_pos[0]) * IXHEAACE_QMF_CHANNELS);
848*15dc779aSAndroid Build Coastguard Worker       }
849*15dc779aSAndroid Build Coastguard Worker 
850*15dc779aSAndroid Build Coastguard Worker       ia_enhaacplus_enc_sbr_cld_analysis_win_add(&ptr_qmf_states_curr_pos[0],
851*15dc779aSAndroid Build Coastguard Worker                                                  pstr_qmf_bank->ptr_filter, syn_buffer,
852*15dc779aSAndroid Build Coastguard Worker                                                  IXHEAACE_QMF_CHANNELS, time_sn_stride);
853*15dc779aSAndroid Build Coastguard Worker 
854*15dc779aSAndroid Build Coastguard Worker       ia_enhaacplus_enc_forward_modulation(syn_buffer, &(ptr_ana_r[i][0]), &(ptr_ana_i[i][0]),
855*15dc779aSAndroid Build Coastguard Worker                                            pstr_qmf_tab, is_ld_sbr, ptr_sbr_scratch);
856*15dc779aSAndroid Build Coastguard Worker 
857*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < offset; k++) {
858*15dc779aSAndroid Build Coastguard Worker         pstr_qmf_bank->ptr_qmf_states_curr_pos[k] =
859*15dc779aSAndroid Build Coastguard Worker             pstr_qmf_bank->ptr_qmf_states_curr_pos[64 + k];
860*15dc779aSAndroid Build Coastguard Worker       }
861*15dc779aSAndroid Build Coastguard Worker 
862*15dc779aSAndroid Build Coastguard Worker       i++;
863*15dc779aSAndroid Build Coastguard Worker     }
864*15dc779aSAndroid Build Coastguard Worker   } else {
865*15dc779aSAndroid Build Coastguard Worker     flag = pstr_qmf_bank->flag;
866*15dc779aSAndroid Build Coastguard Worker     ptr_fp1 = pstr_qmf_bank->ptr_qmf_states_buf;
867*15dc779aSAndroid Build Coastguard Worker     ptr_fp2 = pstr_qmf_bank->ptr_qmf_states_buf + 64;
868*15dc779aSAndroid Build Coastguard Worker     pstr_qmf_bank->ptr_qmf_states_curr_pos =
869*15dc779aSAndroid Build Coastguard Worker         ((FLOAT32 *)(pstr_qmf_bank->ptr_qmf_states_buf) + (pstr_qmf_bank->offset * 64));
870*15dc779aSAndroid Build Coastguard Worker 
871*15dc779aSAndroid Build Coastguard Worker     if (pstr_qmf_bank->offset == 8) {
872*15dc779aSAndroid Build Coastguard Worker       pstr_qmf_bank->offset = 0;
873*15dc779aSAndroid Build Coastguard Worker     } else {
874*15dc779aSAndroid Build Coastguard Worker       pstr_qmf_bank->offset += 2;
875*15dc779aSAndroid Build Coastguard Worker     }
876*15dc779aSAndroid Build Coastguard Worker 
877*15dc779aSAndroid Build Coastguard Worker     ptr_start_coeff_l = pstr_qmf_bank->ptr_ref_coeff_l + pstr_qmf_bank->offset_l;
878*15dc779aSAndroid Build Coastguard Worker     ptr_start_coeff_r = pstr_qmf_bank->ptr_ref_coeff_r - pstr_qmf_bank->offset_r;
879*15dc779aSAndroid Build Coastguard Worker 
880*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < num_qmf_subsamp; i++) {
881*15dc779aSAndroid Build Coastguard Worker       ptr_qmf_states_curr_pos = pstr_qmf_bank->ptr_qmf_states_curr_pos;
882*15dc779aSAndroid Build Coastguard Worker       ptr_tmp = ptr_fp1;
883*15dc779aSAndroid Build Coastguard Worker       ptr_fp1 = ptr_fp2;
884*15dc779aSAndroid Build Coastguard Worker       ptr_fp2 = ptr_tmp;
885*15dc779aSAndroid Build Coastguard Worker       if (((1 == is_ld_sbr) && start_coeff_cnt) || ((0 == is_ld_sbr) && (i % 2))) {
886*15dc779aSAndroid Build Coastguard Worker         ptr_start_coeff_l--;
887*15dc779aSAndroid Build Coastguard Worker         if (ptr_start_coeff_l == pstr_qmf_bank->ptr_ref_coeff_l) {
888*15dc779aSAndroid Build Coastguard Worker           ptr_start_coeff_l += 5;
889*15dc779aSAndroid Build Coastguard Worker         }
890*15dc779aSAndroid Build Coastguard Worker       } else {
891*15dc779aSAndroid Build Coastguard Worker         ptr_start_coeff_r++;
892*15dc779aSAndroid Build Coastguard Worker         if (ptr_start_coeff_r == pstr_qmf_bank->ptr_ref_coeff_r) {
893*15dc779aSAndroid Build Coastguard Worker           ptr_start_coeff_r -= 5;
894*15dc779aSAndroid Build Coastguard Worker         }
895*15dc779aSAndroid Build Coastguard Worker       }
896*15dc779aSAndroid Build Coastguard Worker 
897*15dc779aSAndroid Build Coastguard Worker       if (ptr_time_in) {
898*15dc779aSAndroid Build Coastguard Worker         FLOAT32 *ptr_qmf_states = &ptr_qmf_states_curr_pos[0];
899*15dc779aSAndroid Build Coastguard Worker         const FLOAT32 *ptr_inp = &ptr_time_in[(i * 64 * time_sn_stride)];
900*15dc779aSAndroid Build Coastguard Worker         FLOAT32 tmp1, tmp2, tmp3, tmp4;
901*15dc779aSAndroid Build Coastguard Worker         for (k = 15; k >= 0; k--) {
902*15dc779aSAndroid Build Coastguard Worker           tmp1 = *ptr_inp;
903*15dc779aSAndroid Build Coastguard Worker           ptr_inp += time_sn_stride;
904*15dc779aSAndroid Build Coastguard Worker 
905*15dc779aSAndroid Build Coastguard Worker           tmp2 = *ptr_inp;
906*15dc779aSAndroid Build Coastguard Worker           ptr_inp += time_sn_stride;
907*15dc779aSAndroid Build Coastguard Worker 
908*15dc779aSAndroid Build Coastguard Worker           tmp3 = *ptr_inp;
909*15dc779aSAndroid Build Coastguard Worker           ptr_inp += time_sn_stride;
910*15dc779aSAndroid Build Coastguard Worker 
911*15dc779aSAndroid Build Coastguard Worker           *ptr_qmf_states++ = tmp1;
912*15dc779aSAndroid Build Coastguard Worker           tmp4 = *ptr_inp;
913*15dc779aSAndroid Build Coastguard Worker           ptr_inp += time_sn_stride;
914*15dc779aSAndroid Build Coastguard Worker 
915*15dc779aSAndroid Build Coastguard Worker           *ptr_qmf_states++ = tmp2;
916*15dc779aSAndroid Build Coastguard Worker           *ptr_qmf_states++ = tmp3;
917*15dc779aSAndroid Build Coastguard Worker           *ptr_qmf_states++ = tmp4;
918*15dc779aSAndroid Build Coastguard Worker         }
919*15dc779aSAndroid Build Coastguard Worker       } else {
920*15dc779aSAndroid Build Coastguard Worker         memset(&ptr_qmf_states_curr_pos[0], 0,
921*15dc779aSAndroid Build Coastguard Worker                sizeof(ptr_qmf_states_curr_pos[0]) * IXHEAACE_QMF_CHANNELS);
922*15dc779aSAndroid Build Coastguard Worker       }
923*15dc779aSAndroid Build Coastguard Worker 
924*15dc779aSAndroid Build Coastguard Worker       ptr_pf_l = ptr_start_coeff_l;
925*15dc779aSAndroid Build Coastguard Worker       ptr_pf_r = ptr_start_coeff_r;
926*15dc779aSAndroid Build Coastguard Worker 
927*15dc779aSAndroid Build Coastguard Worker       ia_enhaacplus_enc_sbr_qmf_analysis_win_add(ptr_pf_l, ptr_pf_r, ptr_fp1, ptr_fp2,
928*15dc779aSAndroid Build Coastguard Worker                                                  syn_buffer);
929*15dc779aSAndroid Build Coastguard Worker 
930*15dc779aSAndroid Build Coastguard Worker       ia_enhaacplus_enc_forward_modulation(syn_buffer, &(ptr_ana_r[i][0]), &(ptr_ana_i[i][0]),
931*15dc779aSAndroid Build Coastguard Worker                                            pstr_qmf_tab, is_ld_sbr, ptr_sbr_scratch);
932*15dc779aSAndroid Build Coastguard Worker 
933*15dc779aSAndroid Build Coastguard Worker       pstr_qmf_bank->ptr_qmf_states_curr_pos = pstr_qmf_bank->ptr_qmf_states_curr_pos + 64;
934*15dc779aSAndroid Build Coastguard Worker       if (pstr_qmf_bank->ptr_qmf_states_curr_pos == pstr_qmf_bank->ptr_qmf_states_buf + 640) {
935*15dc779aSAndroid Build Coastguard Worker         pstr_qmf_bank->ptr_qmf_states_curr_pos = pstr_qmf_bank->ptr_qmf_states_buf;
936*15dc779aSAndroid Build Coastguard Worker       }
937*15dc779aSAndroid Build Coastguard Worker     }
938*15dc779aSAndroid Build Coastguard Worker 
939*15dc779aSAndroid Build Coastguard Worker     pstr_qmf_bank->offset_l = ptr_start_coeff_l - pstr_qmf_bank->ptr_ref_coeff_l;
940*15dc779aSAndroid Build Coastguard Worker     pstr_qmf_bank->offset_r = pstr_qmf_bank->ptr_ref_coeff_r - ptr_start_coeff_r;
941*15dc779aSAndroid Build Coastguard Worker     pstr_qmf_bank->flag = flag;
942*15dc779aSAndroid Build Coastguard Worker   }
943*15dc779aSAndroid Build Coastguard Worker   if (is_ps_960 == 1) {
944*15dc779aSAndroid Build Coastguard Worker     memset(&ptr_ana_r[num_qmf_subsamp][0], 0, sizeof(ptr_ana_r[num_qmf_subsamp][0]) *
945*15dc779aSAndroid Build Coastguard Worker            IXHEAACE_QMF_CHANNELS * (IXHEAACE_QMF_TIME_SLOTS - num_qmf_subsamp));
946*15dc779aSAndroid Build Coastguard Worker     memset(&ptr_ana_i[num_qmf_subsamp][0], 0, sizeof(ptr_ana_i[num_qmf_subsamp][0]) *
947*15dc779aSAndroid Build Coastguard Worker            IXHEAACE_QMF_CHANNELS * (IXHEAACE_QMF_TIME_SLOTS - num_qmf_subsamp));
948*15dc779aSAndroid Build Coastguard Worker   }
949*15dc779aSAndroid Build Coastguard Worker }
950*15dc779aSAndroid Build Coastguard Worker 
ixheaace_get_energy_from_cplx_qmf(FLOAT32 ** ptr_energy_vals,FLOAT32 ** ptr_real_values,FLOAT32 ** ptr_imag_values,WORD32 is_ld_sbr,WORD32 num_time_slots,WORD32 samp_ratio_fac,ixheaace_str_hbe_enc * pstr_hbe_enc,WORD32 op_delay,WORD32 harmonic_sbr)951*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_get_energy_from_cplx_qmf(
952*15dc779aSAndroid Build Coastguard Worker     FLOAT32 **ptr_energy_vals, FLOAT32 **ptr_real_values, FLOAT32 **ptr_imag_values,
953*15dc779aSAndroid Build Coastguard Worker     WORD32 is_ld_sbr, WORD32 num_time_slots, WORD32 samp_ratio_fac,
954*15dc779aSAndroid Build Coastguard Worker     ixheaace_str_hbe_enc *pstr_hbe_enc, WORD32 op_delay, WORD32 harmonic_sbr)
955*15dc779aSAndroid Build Coastguard Worker 
956*15dc779aSAndroid Build Coastguard Worker {
957*15dc779aSAndroid Build Coastguard Worker   WORD32 j, k;
958*15dc779aSAndroid Build Coastguard Worker   FLOAT32 avg_fac = 0.5f;
959*15dc779aSAndroid Build Coastguard Worker   if (samp_ratio_fac == 4) {
960*15dc779aSAndroid Build Coastguard Worker     avg_fac = 0.25f;
961*15dc779aSAndroid Build Coastguard Worker   }
962*15dc779aSAndroid Build Coastguard Worker   if (0 == is_ld_sbr) {
963*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_energy_val = &ptr_energy_vals[0][0];
964*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_real = &ptr_real_values[0][0];
965*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_imag = &ptr_imag_values[0][0];
966*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_hbe_real = NULL;
967*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_hbe_imag = NULL;
968*15dc779aSAndroid Build Coastguard Worker     if (harmonic_sbr == 1) {
969*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_real = &pstr_hbe_enc->qmf_buf_real[op_delay][0];
970*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_imag = &pstr_hbe_enc->qmf_buf_imag[op_delay][0];
971*15dc779aSAndroid Build Coastguard Worker     }
972*15dc779aSAndroid Build Coastguard Worker     k = (num_time_slots - 1);
973*15dc779aSAndroid Build Coastguard Worker     while (k >= 0) {
974*15dc779aSAndroid Build Coastguard Worker       for (j = 63; j >= 0; j--) {
975*15dc779aSAndroid Build Coastguard Worker         FLOAT32 tmp = 0.0f;
976*15dc779aSAndroid Build Coastguard Worker         if (harmonic_sbr == 1) {
977*15dc779aSAndroid Build Coastguard Worker           FLOAT32 real_hbe, imag_hbe;
978*15dc779aSAndroid Build Coastguard Worker           real_hbe = *(ptr_hbe_real);
979*15dc779aSAndroid Build Coastguard Worker           imag_hbe = *(ptr_hbe_imag);
980*15dc779aSAndroid Build Coastguard Worker           tmp += (real_hbe * real_hbe) + (imag_hbe * imag_hbe);
981*15dc779aSAndroid Build Coastguard Worker           *ptr_energy_val = tmp;
982*15dc779aSAndroid Build Coastguard Worker           ptr_hbe_real++;
983*15dc779aSAndroid Build Coastguard Worker           ptr_hbe_imag++;
984*15dc779aSAndroid Build Coastguard Worker         } else {
985*15dc779aSAndroid Build Coastguard Worker           FLOAT32 real, imag;
986*15dc779aSAndroid Build Coastguard Worker           WORD32 i;
987*15dc779aSAndroid Build Coastguard Worker           for (i = 0; i < samp_ratio_fac; i++) {
988*15dc779aSAndroid Build Coastguard Worker             real = *(ptr_real + i * IXHEAACE_QMF_CHANNELS);
989*15dc779aSAndroid Build Coastguard Worker             imag = *(ptr_imag + i * IXHEAACE_QMF_CHANNELS);
990*15dc779aSAndroid Build Coastguard Worker             tmp += (real * real) + (imag * imag);
991*15dc779aSAndroid Build Coastguard Worker           }
992*15dc779aSAndroid Build Coastguard Worker           *ptr_energy_val = tmp * avg_fac;
993*15dc779aSAndroid Build Coastguard Worker           ptr_real++;
994*15dc779aSAndroid Build Coastguard Worker           ptr_imag++;
995*15dc779aSAndroid Build Coastguard Worker         }
996*15dc779aSAndroid Build Coastguard Worker         ptr_energy_val++;
997*15dc779aSAndroid Build Coastguard Worker       }
998*15dc779aSAndroid Build Coastguard Worker       if (harmonic_sbr == 1) {
999*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_real += 64;
1000*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_imag += 64;
1001*15dc779aSAndroid Build Coastguard Worker       } else {
1002*15dc779aSAndroid Build Coastguard Worker         ptr_real += 64;
1003*15dc779aSAndroid Build Coastguard Worker         ptr_imag += 64;
1004*15dc779aSAndroid Build Coastguard Worker       }
1005*15dc779aSAndroid Build Coastguard Worker       k--;
1006*15dc779aSAndroid Build Coastguard Worker     }
1007*15dc779aSAndroid Build Coastguard Worker   } else {
1008*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_real = &ptr_real_values[0][0];
1009*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_imag = &ptr_imag_values[0][0];
1010*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < num_time_slots; k++) {
1011*15dc779aSAndroid Build Coastguard Worker       FLOAT32 *ptr_energy_val = &ptr_energy_vals[k][0];
1012*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j < 64; j++) {
1013*15dc779aSAndroid Build Coastguard Worker         FLOAT32 real, imag, tmp;
1014*15dc779aSAndroid Build Coastguard Worker         real = *ptr_real;
1015*15dc779aSAndroid Build Coastguard Worker         ptr_real++;
1016*15dc779aSAndroid Build Coastguard Worker         imag = *ptr_imag;
1017*15dc779aSAndroid Build Coastguard Worker         ptr_imag++;
1018*15dc779aSAndroid Build Coastguard Worker 
1019*15dc779aSAndroid Build Coastguard Worker         tmp = (real * real) + (imag * imag);
1020*15dc779aSAndroid Build Coastguard Worker         *ptr_energy_val = tmp;
1021*15dc779aSAndroid Build Coastguard Worker         ptr_energy_val++;
1022*15dc779aSAndroid Build Coastguard Worker       }
1023*15dc779aSAndroid Build Coastguard Worker     }
1024*15dc779aSAndroid Build Coastguard Worker   }
1025*15dc779aSAndroid Build Coastguard Worker }
1026*15dc779aSAndroid Build Coastguard Worker 
ixheaace_fft16(FLOAT32 * vector)1027*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_fft16(FLOAT32 *vector) {
1028*15dc779aSAndroid Build Coastguard Worker   FLOAT32 var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, var110, var111,
1029*15dc779aSAndroid Build Coastguard Worker       var112, var113, var114, var115;
1030*15dc779aSAndroid Build Coastguard Worker   FLOAT32 var20, var21, var22, var23, var24, var25, var26, var27, var28, var29, var210, var211,
1031*15dc779aSAndroid Build Coastguard Worker       var212, var213, var214, var215;
1032*15dc779aSAndroid Build Coastguard Worker   FLOAT32 arr0, arr1, arr2, arr3, arr4, arr5, arr6, arr7, arr8, arr9, arr10, arr11, arr12, arr13,
1033*15dc779aSAndroid Build Coastguard Worker       arr14, arr15;
1034*15dc779aSAndroid Build Coastguard Worker 
1035*15dc779aSAndroid Build Coastguard Worker   arr0 = vector[0] + vector[16];
1036*15dc779aSAndroid Build Coastguard Worker   arr8 = vector[8] + vector[24];
1037*15dc779aSAndroid Build Coastguard Worker   var10 = arr0 + arr8;
1038*15dc779aSAndroid Build Coastguard Worker   var12 = arr0 - arr8;
1039*15dc779aSAndroid Build Coastguard Worker   arr1 = vector[1] + vector[17];
1040*15dc779aSAndroid Build Coastguard Worker   arr9 = vector[9] + vector[25];
1041*15dc779aSAndroid Build Coastguard Worker   var11 = arr1 + arr9;
1042*15dc779aSAndroid Build Coastguard Worker   var13 = arr1 - arr9;
1043*15dc779aSAndroid Build Coastguard Worker   arr2 = vector[2] + vector[18];
1044*15dc779aSAndroid Build Coastguard Worker   arr10 = vector[10] + vector[26];
1045*15dc779aSAndroid Build Coastguard Worker   var14 = arr2 + arr10;
1046*15dc779aSAndroid Build Coastguard Worker   var16 = arr2 - arr10;
1047*15dc779aSAndroid Build Coastguard Worker   arr3 = vector[3] + vector[19];
1048*15dc779aSAndroid Build Coastguard Worker   arr11 = vector[11] + vector[27];
1049*15dc779aSAndroid Build Coastguard Worker   var15 = arr3 + arr11;
1050*15dc779aSAndroid Build Coastguard Worker   var17 = arr3 - arr11;
1051*15dc779aSAndroid Build Coastguard Worker   arr4 = vector[4] + vector[20];
1052*15dc779aSAndroid Build Coastguard Worker   arr12 = vector[12] + vector[28];
1053*15dc779aSAndroid Build Coastguard Worker   var18 = arr4 + arr12;
1054*15dc779aSAndroid Build Coastguard Worker   var110 = arr4 - arr12;
1055*15dc779aSAndroid Build Coastguard Worker   arr5 = vector[5] + vector[21];
1056*15dc779aSAndroid Build Coastguard Worker   arr13 = vector[13] + vector[29];
1057*15dc779aSAndroid Build Coastguard Worker   var19 = arr5 + arr13;
1058*15dc779aSAndroid Build Coastguard Worker   var111 = arr5 - arr13;
1059*15dc779aSAndroid Build Coastguard Worker   arr6 = vector[6] + vector[22];
1060*15dc779aSAndroid Build Coastguard Worker   arr14 = vector[14] + vector[30];
1061*15dc779aSAndroid Build Coastguard Worker   var112 = arr6 + arr14;
1062*15dc779aSAndroid Build Coastguard Worker   var114 = arr6 - arr14;
1063*15dc779aSAndroid Build Coastguard Worker   arr7 = vector[7] + vector[23];
1064*15dc779aSAndroid Build Coastguard Worker   arr15 = vector[15] + vector[31];
1065*15dc779aSAndroid Build Coastguard Worker   var113 = arr7 + arr15;
1066*15dc779aSAndroid Build Coastguard Worker   var115 = arr7 - arr15;
1067*15dc779aSAndroid Build Coastguard Worker 
1068*15dc779aSAndroid Build Coastguard Worker   var20 = var10 + var18;
1069*15dc779aSAndroid Build Coastguard Worker   var24 = var10 - var18;
1070*15dc779aSAndroid Build Coastguard Worker   var21 = var11 + var19;
1071*15dc779aSAndroid Build Coastguard Worker   var25 = var11 - var19;
1072*15dc779aSAndroid Build Coastguard Worker   var28 = var12 - var111;
1073*15dc779aSAndroid Build Coastguard Worker   var210 = var12 + var111;
1074*15dc779aSAndroid Build Coastguard Worker   var29 = var13 + var110;
1075*15dc779aSAndroid Build Coastguard Worker   var211 = var13 - var110;
1076*15dc779aSAndroid Build Coastguard Worker   var22 = var14 + var112;
1077*15dc779aSAndroid Build Coastguard Worker   var27 = var14 - var112;
1078*15dc779aSAndroid Build Coastguard Worker   var23 = var15 + var113;
1079*15dc779aSAndroid Build Coastguard Worker   var26 = var113 - var15;
1080*15dc779aSAndroid Build Coastguard Worker 
1081*15dc779aSAndroid Build Coastguard Worker   var11 = var16 + var114;
1082*15dc779aSAndroid Build Coastguard Worker   var12 = var16 - var114;
1083*15dc779aSAndroid Build Coastguard Worker   var10 = var17 + var115;
1084*15dc779aSAndroid Build Coastguard Worker   var13 = var17 - var115;
1085*15dc779aSAndroid Build Coastguard Worker 
1086*15dc779aSAndroid Build Coastguard Worker   var212 = (var10 + var12) * IXHEAACE_INV_SQRT2;
1087*15dc779aSAndroid Build Coastguard Worker   var214 = (var10 - var12) * IXHEAACE_INV_SQRT2;
1088*15dc779aSAndroid Build Coastguard Worker   var213 = (var13 - var11) * IXHEAACE_INV_SQRT2;
1089*15dc779aSAndroid Build Coastguard Worker   var215 = (var11 + var13) * -IXHEAACE_INV_SQRT2;
1090*15dc779aSAndroid Build Coastguard Worker 
1091*15dc779aSAndroid Build Coastguard Worker   arr0 = vector[0] - vector[16];
1092*15dc779aSAndroid Build Coastguard Worker   arr1 = vector[1] - vector[17];
1093*15dc779aSAndroid Build Coastguard Worker   arr2 = vector[2] - vector[18];
1094*15dc779aSAndroid Build Coastguard Worker   arr3 = vector[3] - vector[19];
1095*15dc779aSAndroid Build Coastguard Worker   arr4 = vector[4] - vector[20];
1096*15dc779aSAndroid Build Coastguard Worker   arr5 = vector[5] - vector[21];
1097*15dc779aSAndroid Build Coastguard Worker   arr6 = vector[6] - vector[22];
1098*15dc779aSAndroid Build Coastguard Worker   arr7 = vector[7] - vector[23];
1099*15dc779aSAndroid Build Coastguard Worker   arr8 = vector[8] - vector[24];
1100*15dc779aSAndroid Build Coastguard Worker   arr9 = vector[9] - vector[25];
1101*15dc779aSAndroid Build Coastguard Worker   arr10 = vector[10] - vector[26];
1102*15dc779aSAndroid Build Coastguard Worker   arr11 = vector[11] - vector[27];
1103*15dc779aSAndroid Build Coastguard Worker   arr12 = vector[12] - vector[28];
1104*15dc779aSAndroid Build Coastguard Worker   arr13 = vector[13] - vector[29];
1105*15dc779aSAndroid Build Coastguard Worker   arr14 = vector[14] - vector[30];
1106*15dc779aSAndroid Build Coastguard Worker   arr15 = vector[15] - vector[31];
1107*15dc779aSAndroid Build Coastguard Worker 
1108*15dc779aSAndroid Build Coastguard Worker   var19 = ((arr2 + arr14) * -IXHEAACE_COS_3PI_DIV8);
1109*15dc779aSAndroid Build Coastguard Worker   var110 = ((arr2 - arr14) * IXHEAACE_COS_PI_DIV8);
1110*15dc779aSAndroid Build Coastguard Worker   var18 = ((arr3 + arr15) * IXHEAACE_COS_3PI_DIV8);
1111*15dc779aSAndroid Build Coastguard Worker   var111 = ((arr3 - arr15) * IXHEAACE_COS_PI_DIV8);
1112*15dc779aSAndroid Build Coastguard Worker   var15 = ((arr4 + arr12) * -IXHEAACE_INV_SQRT2);
1113*15dc779aSAndroid Build Coastguard Worker   var16 = ((arr4 - arr12) * IXHEAACE_INV_SQRT2);
1114*15dc779aSAndroid Build Coastguard Worker   var14 = ((arr5 + arr13) * IXHEAACE_INV_SQRT2);
1115*15dc779aSAndroid Build Coastguard Worker   var17 = ((arr5 - arr13) * IXHEAACE_INV_SQRT2);
1116*15dc779aSAndroid Build Coastguard Worker   var113 = ((arr6 + arr10) * -IXHEAACE_COS_PI_DIV8);
1117*15dc779aSAndroid Build Coastguard Worker   var114 = ((arr6 - arr10) * IXHEAACE_COS_3PI_DIV8);
1118*15dc779aSAndroid Build Coastguard Worker   var112 = ((arr7 + arr11) * IXHEAACE_COS_PI_DIV8);
1119*15dc779aSAndroid Build Coastguard Worker   var115 = ((arr7 - arr11) * IXHEAACE_COS_3PI_DIV8);
1120*15dc779aSAndroid Build Coastguard Worker 
1121*15dc779aSAndroid Build Coastguard Worker   arr2 = (var18 * IXHEAACE_SQRT2PLUS1) - (var112 * IXHEAACE_SQRT2MINUS1);
1122*15dc779aSAndroid Build Coastguard Worker   arr3 = (var19 * IXHEAACE_SQRT2PLUS1) - (var113 * IXHEAACE_SQRT2MINUS1);
1123*15dc779aSAndroid Build Coastguard Worker   arr4 = (var110 * IXHEAACE_SQRT2MINUS1) - (var114 * IXHEAACE_SQRT2PLUS1);
1124*15dc779aSAndroid Build Coastguard Worker   arr5 = (var111 * IXHEAACE_SQRT2MINUS1) - (var115 * IXHEAACE_SQRT2PLUS1);
1125*15dc779aSAndroid Build Coastguard Worker 
1126*15dc779aSAndroid Build Coastguard Worker   var18 = var18 + var112;
1127*15dc779aSAndroid Build Coastguard Worker   var19 = var19 + var113;
1128*15dc779aSAndroid Build Coastguard Worker   var110 = var110 + var114;
1129*15dc779aSAndroid Build Coastguard Worker   var111 = var111 + var115;
1130*15dc779aSAndroid Build Coastguard Worker 
1131*15dc779aSAndroid Build Coastguard Worker   arr6 = arr0 + var14;
1132*15dc779aSAndroid Build Coastguard Worker   arr10 = arr0 - var14;
1133*15dc779aSAndroid Build Coastguard Worker   arr7 = arr1 + var15;
1134*15dc779aSAndroid Build Coastguard Worker   arr11 = arr1 - var15;
1135*15dc779aSAndroid Build Coastguard Worker 
1136*15dc779aSAndroid Build Coastguard Worker   arr12 = var16 - arr9;
1137*15dc779aSAndroid Build Coastguard Worker   arr14 = var16 + arr9;
1138*15dc779aSAndroid Build Coastguard Worker   arr13 = arr8 + var17;
1139*15dc779aSAndroid Build Coastguard Worker   arr15 = arr8 - var17;
1140*15dc779aSAndroid Build Coastguard Worker 
1141*15dc779aSAndroid Build Coastguard Worker   var10 = arr6 - arr14;
1142*15dc779aSAndroid Build Coastguard Worker   var12 = arr6 + arr14;
1143*15dc779aSAndroid Build Coastguard Worker   var11 = arr7 + arr15;
1144*15dc779aSAndroid Build Coastguard Worker   var13 = arr7 - arr15;
1145*15dc779aSAndroid Build Coastguard Worker   var14 = arr10 + arr12;
1146*15dc779aSAndroid Build Coastguard Worker   var16 = arr10 - arr12;
1147*15dc779aSAndroid Build Coastguard Worker   var15 = arr11 + arr13;
1148*15dc779aSAndroid Build Coastguard Worker   var17 = arr11 - arr13;
1149*15dc779aSAndroid Build Coastguard Worker 
1150*15dc779aSAndroid Build Coastguard Worker   arr10 = var18 + var110;
1151*15dc779aSAndroid Build Coastguard Worker   var110 = var18 - var110;
1152*15dc779aSAndroid Build Coastguard Worker   arr11 = var19 + var111;
1153*15dc779aSAndroid Build Coastguard Worker   var111 = var19 - var111;
1154*15dc779aSAndroid Build Coastguard Worker 
1155*15dc779aSAndroid Build Coastguard Worker   var112 = (arr2 + arr4);
1156*15dc779aSAndroid Build Coastguard Worker   var114 = (arr2 - arr4);
1157*15dc779aSAndroid Build Coastguard Worker   var113 = (arr3 + arr5);
1158*15dc779aSAndroid Build Coastguard Worker   var115 = (arr3 - arr5);
1159*15dc779aSAndroid Build Coastguard Worker 
1160*15dc779aSAndroid Build Coastguard Worker   vector[0] = var20 + var22;
1161*15dc779aSAndroid Build Coastguard Worker   vector[1] = var21 + var23;
1162*15dc779aSAndroid Build Coastguard Worker   vector[2] = var12 + arr10;
1163*15dc779aSAndroid Build Coastguard Worker   vector[3] = var13 + arr11;
1164*15dc779aSAndroid Build Coastguard Worker   vector[4] = var210 + var212;
1165*15dc779aSAndroid Build Coastguard Worker   vector[5] = var211 + var213;
1166*15dc779aSAndroid Build Coastguard Worker   vector[6] = var10 + var112;
1167*15dc779aSAndroid Build Coastguard Worker   vector[7] = var11 + var113;
1168*15dc779aSAndroid Build Coastguard Worker   vector[8] = var24 - var26;
1169*15dc779aSAndroid Build Coastguard Worker   vector[9] = var25 - var27;
1170*15dc779aSAndroid Build Coastguard Worker   vector[10] = var16 + var114;
1171*15dc779aSAndroid Build Coastguard Worker   vector[11] = var17 + var115;
1172*15dc779aSAndroid Build Coastguard Worker   vector[12] = var28 + var214;
1173*15dc779aSAndroid Build Coastguard Worker   vector[13] = var29 + var215;
1174*15dc779aSAndroid Build Coastguard Worker   vector[14] = var14 + var110;
1175*15dc779aSAndroid Build Coastguard Worker   vector[15] = var15 + var111;
1176*15dc779aSAndroid Build Coastguard Worker   vector[16] = var20 - var22;
1177*15dc779aSAndroid Build Coastguard Worker   vector[17] = var21 - var23;
1178*15dc779aSAndroid Build Coastguard Worker   vector[18] = var12 - arr10;
1179*15dc779aSAndroid Build Coastguard Worker   vector[19] = var13 - arr11;
1180*15dc779aSAndroid Build Coastguard Worker   vector[20] = var210 - var212;
1181*15dc779aSAndroid Build Coastguard Worker   vector[21] = var211 - var213;
1182*15dc779aSAndroid Build Coastguard Worker   vector[22] = var10 - var112;
1183*15dc779aSAndroid Build Coastguard Worker   vector[23] = var11 - var113;
1184*15dc779aSAndroid Build Coastguard Worker   vector[24] = var24 + var26;
1185*15dc779aSAndroid Build Coastguard Worker   vector[25] = var25 + var27;
1186*15dc779aSAndroid Build Coastguard Worker   vector[26] = var16 - var114;
1187*15dc779aSAndroid Build Coastguard Worker   vector[27] = var17 - var115;
1188*15dc779aSAndroid Build Coastguard Worker   vector[28] = var28 - var214;
1189*15dc779aSAndroid Build Coastguard Worker   vector[29] = var29 - var215;
1190*15dc779aSAndroid Build Coastguard Worker   vector[30] = var14 - var110;
1191*15dc779aSAndroid Build Coastguard Worker   vector[31] = var15 - var111;
1192*15dc779aSAndroid Build Coastguard Worker }
1193*15dc779aSAndroid Build Coastguard Worker 
ixheaace_cos_sim_mod(FLOAT32 * ptr_subband,ixheaace_pstr_sbr_qmf_filter_bank pstr_qmf_bank)1194*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_cos_sim_mod(FLOAT32 *ptr_subband,
1195*15dc779aSAndroid Build Coastguard Worker                                  ixheaace_pstr_sbr_qmf_filter_bank pstr_qmf_bank) {
1196*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
1197*15dc779aSAndroid Build Coastguard Worker   FLOAT32 re1, im1, re2, im2, re3, im3;
1198*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_cos_sin_tab = pstr_qmf_bank->ptr_flt_cos_twiddle;
1199*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_cos_sin_tab2 = &pstr_qmf_bank->ptr_flt_cos_twiddle[31];
1200*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_alt_sin_tab;
1201*15dc779aSAndroid Build Coastguard Worker   FLOAT32 wim, wre;
1202*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_subband2 = ptr_subband + 32;
1203*15dc779aSAndroid Build Coastguard Worker 
1204*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 8; i++) {
1205*15dc779aSAndroid Build Coastguard Worker     wre = *ptr_cos_sin_tab++;
1206*15dc779aSAndroid Build Coastguard Worker     wim = *ptr_cos_sin_tab++;
1207*15dc779aSAndroid Build Coastguard Worker     re1 = ptr_subband[2 * i];
1208*15dc779aSAndroid Build Coastguard Worker     im1 = ptr_subband[31 - 2 * i];
1209*15dc779aSAndroid Build Coastguard Worker     re3 = ptr_subband[30 - 2 * i];
1210*15dc779aSAndroid Build Coastguard Worker     im3 = ptr_subband[2 * i + 1];
1211*15dc779aSAndroid Build Coastguard Worker     ptr_subband[2 * i] = (im1 * wim) + (re1 * wre);
1212*15dc779aSAndroid Build Coastguard Worker     ptr_subband[2 * i + 1] = (im1 * wre) - (re1 * wim);
1213*15dc779aSAndroid Build Coastguard Worker     re1 = ptr_subband2[2 * i];
1214*15dc779aSAndroid Build Coastguard Worker     im1 = ptr_subband2[31 - 2 * i];
1215*15dc779aSAndroid Build Coastguard Worker     re2 = ptr_subband2[30 - 2 * i];
1216*15dc779aSAndroid Build Coastguard Worker     im2 = ptr_subband2[2 * i + 1];
1217*15dc779aSAndroid Build Coastguard Worker     ptr_subband2[2 * i + 1] = (im1 * wre) + (re1 * wim);
1218*15dc779aSAndroid Build Coastguard Worker     ptr_subband2[2 * i] = (im1 * wim) - (re1 * wre);
1219*15dc779aSAndroid Build Coastguard Worker     wim = *ptr_cos_sin_tab2--;
1220*15dc779aSAndroid Build Coastguard Worker     wre = *ptr_cos_sin_tab2--;
1221*15dc779aSAndroid Build Coastguard Worker     ptr_subband[30 - 2 * i] = (im3 * wim) + (re3 * wre);
1222*15dc779aSAndroid Build Coastguard Worker     ptr_subband[31 - 2 * i] = (im3 * wre) - (re3 * wim);
1223*15dc779aSAndroid Build Coastguard Worker     ptr_subband2[31 - 2 * i] = (im2 * wre) + (re2 * wim);
1224*15dc779aSAndroid Build Coastguard Worker     ptr_subband2[30 - 2 * i] = (im2 * wim) - (re2 * wre);
1225*15dc779aSAndroid Build Coastguard Worker   }
1226*15dc779aSAndroid Build Coastguard Worker 
1227*15dc779aSAndroid Build Coastguard Worker   ixheaace_fft16(ptr_subband);
1228*15dc779aSAndroid Build Coastguard Worker   ixheaace_fft16(ptr_subband2);
1229*15dc779aSAndroid Build Coastguard Worker 
1230*15dc779aSAndroid Build Coastguard Worker   ptr_alt_sin_tab = &pstr_qmf_bank->ptr_flt_alt_sin_twiddle[0];
1231*15dc779aSAndroid Build Coastguard Worker   wim = *ptr_alt_sin_tab++;
1232*15dc779aSAndroid Build Coastguard Worker   wre = *ptr_alt_sin_tab++;
1233*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 8; i++) {
1234*15dc779aSAndroid Build Coastguard Worker     re1 = ptr_subband[2 * i];
1235*15dc779aSAndroid Build Coastguard Worker     im1 = ptr_subband[2 * i + 1];
1236*15dc779aSAndroid Build Coastguard Worker     re3 = ptr_subband[30 - 2 * i];
1237*15dc779aSAndroid Build Coastguard Worker     im3 = ptr_subband[31 - 2 * i];
1238*15dc779aSAndroid Build Coastguard Worker     ptr_subband[2 * i] = (re1 * wre) + (im1 * wim);
1239*15dc779aSAndroid Build Coastguard Worker     ptr_subband[31 - 2 * i] = (re1 * wim) - (im1 * wre);
1240*15dc779aSAndroid Build Coastguard Worker     re1 = ptr_subband2[2 * i];
1241*15dc779aSAndroid Build Coastguard Worker     im1 = ptr_subband2[2 * i + 1];
1242*15dc779aSAndroid Build Coastguard Worker     re2 = ptr_subband2[30 - 2 * i];
1243*15dc779aSAndroid Build Coastguard Worker     im2 = ptr_subband2[31 - 2 * i];
1244*15dc779aSAndroid Build Coastguard Worker     ptr_subband2[31 - 2 * i] = -((re1 * wre) + (im1 * wim));
1245*15dc779aSAndroid Build Coastguard Worker     ptr_subband2[2 * i] = -((re1 * wim) - (im1 * wre));
1246*15dc779aSAndroid Build Coastguard Worker     wim = *ptr_alt_sin_tab++;
1247*15dc779aSAndroid Build Coastguard Worker     wre = *ptr_alt_sin_tab++;
1248*15dc779aSAndroid Build Coastguard Worker     ptr_subband[30 - 2 * i] = (re3 * wim) + (im3 * wre);
1249*15dc779aSAndroid Build Coastguard Worker     ptr_subband[2 * i + 1] = (re3 * wre) - (im3 * wim);
1250*15dc779aSAndroid Build Coastguard Worker     ptr_subband2[2 * i + 1] = -((re2 * wim) + (im2 * wre));
1251*15dc779aSAndroid Build Coastguard Worker     ptr_subband2[30 - 2 * i] = -(re2 * wre) + (im2 * wim);
1252*15dc779aSAndroid Build Coastguard Worker   }
1253*15dc779aSAndroid Build Coastguard Worker }
1254*15dc779aSAndroid Build Coastguard Worker 
ixheaace_inverse_modulation(const FLOAT32 * ptr_sbr_real,const FLOAT32 * ptr_sbr_imag,FLOAT32 * ptr_time_out,ixheaace_pstr_sbr_qmf_filter_bank pstr_qmf_bank)1255*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_inverse_modulation(const FLOAT32 *ptr_sbr_real, const FLOAT32 *ptr_sbr_imag,
1256*15dc779aSAndroid Build Coastguard Worker                                         FLOAT32 *ptr_time_out,
1257*15dc779aSAndroid Build Coastguard Worker                                         ixheaace_pstr_sbr_qmf_filter_bank pstr_qmf_bank) {
1258*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
1259*15dc779aSAndroid Build Coastguard Worker   FLOAT32 gain = 0.015625f;
1260*15dc779aSAndroid Build Coastguard Worker   FLOAT32 r1, i1, r2, i2;
1261*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_time1, *ptr_time2;
1262*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_time3, *ptr_time4;
1263*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_re;
1264*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_im;
1265*15dc779aSAndroid Build Coastguard Worker 
1266*15dc779aSAndroid Build Coastguard Worker   ptr_time1 = &ptr_time_out[0];
1267*15dc779aSAndroid Build Coastguard Worker   ptr_time2 = &ptr_time_out[32];
1268*15dc779aSAndroid Build Coastguard Worker   ptr_re = &ptr_sbr_real[0];
1269*15dc779aSAndroid Build Coastguard Worker   ptr_im = &ptr_sbr_imag[0];
1270*15dc779aSAndroid Build Coastguard Worker 
1271*15dc779aSAndroid Build Coastguard Worker   for (i = 31; i >= 0; i--) {
1272*15dc779aSAndroid Build Coastguard Worker     r1 = *ptr_re++;
1273*15dc779aSAndroid Build Coastguard Worker     i1 = *ptr_im++;
1274*15dc779aSAndroid Build Coastguard Worker 
1275*15dc779aSAndroid Build Coastguard Worker     *ptr_time1++ = r1 * gain;
1276*15dc779aSAndroid Build Coastguard Worker     *ptr_time2++ = i1 * gain;
1277*15dc779aSAndroid Build Coastguard Worker   }
1278*15dc779aSAndroid Build Coastguard Worker 
1279*15dc779aSAndroid Build Coastguard Worker   ixheaace_cos_sim_mod(ptr_time_out, pstr_qmf_bank);
1280*15dc779aSAndroid Build Coastguard Worker 
1281*15dc779aSAndroid Build Coastguard Worker   ptr_time1 = &ptr_time_out[63];
1282*15dc779aSAndroid Build Coastguard Worker   ptr_time2 = &ptr_time_out[31];
1283*15dc779aSAndroid Build Coastguard Worker   ptr_time3 = &ptr_time_out[0];
1284*15dc779aSAndroid Build Coastguard Worker   ptr_time4 = &ptr_time_out[32];
1285*15dc779aSAndroid Build Coastguard Worker   for (i = 15; i >= 0; i--) {
1286*15dc779aSAndroid Build Coastguard Worker     r1 = *ptr_time3;
1287*15dc779aSAndroid Build Coastguard Worker     i2 = *ptr_time1;
1288*15dc779aSAndroid Build Coastguard Worker     r2 = *ptr_time2;
1289*15dc779aSAndroid Build Coastguard Worker     i1 = *ptr_time4;
1290*15dc779aSAndroid Build Coastguard Worker 
1291*15dc779aSAndroid Build Coastguard Worker     *ptr_time3++ = r1 - i1;
1292*15dc779aSAndroid Build Coastguard Worker 
1293*15dc779aSAndroid Build Coastguard Worker     *ptr_time1-- = -(r1 + i1);
1294*15dc779aSAndroid Build Coastguard Worker 
1295*15dc779aSAndroid Build Coastguard Worker     *ptr_time2-- = r2 - i2;
1296*15dc779aSAndroid Build Coastguard Worker 
1297*15dc779aSAndroid Build Coastguard Worker     *ptr_time4++ = -(r2 + i2);
1298*15dc779aSAndroid Build Coastguard Worker   }
1299*15dc779aSAndroid Build Coastguard Worker }
1300*15dc779aSAndroid Build Coastguard Worker 
ixheaace_win_add(FLOAT32 * ptr_time_buf,FLOAT32 * ptr_work_buffer,const FLOAT32 * ptr_filter)1301*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_win_add(FLOAT32 *ptr_time_buf, FLOAT32 *ptr_work_buffer,
1302*15dc779aSAndroid Build Coastguard Worker                              const FLOAT32 *ptr_filter) {
1303*15dc779aSAndroid Build Coastguard Worker   WORD32 j, k;
1304*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_work_buf = &ptr_work_buffer[63];
1305*15dc779aSAndroid Build Coastguard Worker   for (j = 0, k = 0; j < 64; j += 2, k++) {
1306*15dc779aSAndroid Build Coastguard Worker     FLOAT32 tmp_var = *ptr_work_buf--;
1307*15dc779aSAndroid Build Coastguard Worker     FLOAT32 temp_a = ptr_filter[2 * k];
1308*15dc779aSAndroid Build Coastguard Worker     FLOAT32 temp_b = ptr_filter[2 * k + 1];
1309*15dc779aSAndroid Build Coastguard Worker     FLOAT32 temp1 = *ptr_work_buf--;
1310*15dc779aSAndroid Build Coastguard Worker     ptr_time_buf[j] += tmp_var * temp_a;
1311*15dc779aSAndroid Build Coastguard Worker     ptr_time_buf[j + 1] += temp1 * temp_b;
1312*15dc779aSAndroid Build Coastguard Worker 
1313*15dc779aSAndroid Build Coastguard Worker     temp_a = ptr_filter[64 + 2 * k];
1314*15dc779aSAndroid Build Coastguard Worker     temp_b = ptr_filter[64 + 2 * k + 1];
1315*15dc779aSAndroid Build Coastguard Worker     ptr_time_buf[64 + j] += tmp_var * temp_a;
1316*15dc779aSAndroid Build Coastguard Worker     ptr_time_buf[64 + j + 1] += temp1 * temp_b;
1317*15dc779aSAndroid Build Coastguard Worker 
1318*15dc779aSAndroid Build Coastguard Worker     temp_a = ptr_filter[128 + 2 * k];
1319*15dc779aSAndroid Build Coastguard Worker     temp_b = ptr_filter[128 + 2 * k + 1];
1320*15dc779aSAndroid Build Coastguard Worker     ptr_time_buf[128 + j] += tmp_var * temp_a;
1321*15dc779aSAndroid Build Coastguard Worker     ptr_time_buf[128 + j + 1] += temp1 * temp_b;
1322*15dc779aSAndroid Build Coastguard Worker 
1323*15dc779aSAndroid Build Coastguard Worker     temp_a = ptr_filter[192 + 2 * k];
1324*15dc779aSAndroid Build Coastguard Worker     temp_b = ptr_filter[192 + 2 * k + 1];
1325*15dc779aSAndroid Build Coastguard Worker     ptr_time_buf[192 + j] += tmp_var * temp_a;
1326*15dc779aSAndroid Build Coastguard Worker     ptr_time_buf[192 + j + 1] += temp1 * temp_b;
1327*15dc779aSAndroid Build Coastguard Worker 
1328*15dc779aSAndroid Build Coastguard Worker     temp_a = ptr_filter[256 + 2 * k];
1329*15dc779aSAndroid Build Coastguard Worker     temp_b = ptr_filter[256 + 2 * k + 1];
1330*15dc779aSAndroid Build Coastguard Worker     ptr_time_buf[256 + j] += tmp_var * temp_a;
1331*15dc779aSAndroid Build Coastguard Worker     ptr_time_buf[256 + j + 1] += temp1 * temp_b;
1332*15dc779aSAndroid Build Coastguard Worker   }
1333*15dc779aSAndroid Build Coastguard Worker }
1334*15dc779aSAndroid Build Coastguard Worker 
ixheaace_enc_synthesis_qmf_filtering(FLOAT32 ** ptr_sbr_re,FLOAT32 ** ptr_sbr_im,FLOAT32 * time_float,ixheaace_pstr_sbr_qmf_filter_bank pstr_qmf_bank)1335*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_enc_synthesis_qmf_filtering(FLOAT32 **ptr_sbr_re, FLOAT32 **ptr_sbr_im,
1336*15dc779aSAndroid Build Coastguard Worker                                           FLOAT32 *time_float,
1337*15dc779aSAndroid Build Coastguard Worker                                           ixheaace_pstr_sbr_qmf_filter_bank pstr_qmf_bank) {
1338*15dc779aSAndroid Build Coastguard Worker   WORD32 k, j;
1339*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *timeBuf_flt;
1340*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_filter = pstr_qmf_bank->ptr_flt_filter;
1341*15dc779aSAndroid Build Coastguard Worker   for (k = 0; k < 32; k++) {
1342*15dc779aSAndroid Build Coastguard Worker     ixheaace_inverse_modulation(*(ptr_sbr_re + k), *(ptr_sbr_im + k),
1343*15dc779aSAndroid Build Coastguard Worker                                 pstr_qmf_bank->ptr_flt_work_buf, pstr_qmf_bank);
1344*15dc779aSAndroid Build Coastguard Worker     ixheaace_win_add(pstr_qmf_bank->ptr_flt_time_buf, pstr_qmf_bank->ptr_flt_work_buf,
1345*15dc779aSAndroid Build Coastguard Worker                      ptr_filter);
1346*15dc779aSAndroid Build Coastguard Worker     timeBuf_flt = &pstr_qmf_bank->ptr_flt_time_buf[288];
1347*15dc779aSAndroid Build Coastguard Worker     {
1348*15dc779aSAndroid Build Coastguard Worker       FLOAT32 temp1_flt, temp2_flt;
1349*15dc779aSAndroid Build Coastguard Worker       FLOAT32 *ptr_time_out_flt = &time_float[31], temp_out_flt;
1350*15dc779aSAndroid Build Coastguard Worker       for (j = 15; j >= 0; j--) {
1351*15dc779aSAndroid Build Coastguard Worker         temp1_flt = *timeBuf_flt++;
1352*15dc779aSAndroid Build Coastguard Worker         temp2_flt = *timeBuf_flt++;
1353*15dc779aSAndroid Build Coastguard Worker         temp_out_flt = temp1_flt;
1354*15dc779aSAndroid Build Coastguard Worker         *ptr_time_out_flt-- = temp_out_flt * -1;
1355*15dc779aSAndroid Build Coastguard Worker         temp_out_flt = temp2_flt;
1356*15dc779aSAndroid Build Coastguard Worker         *ptr_time_out_flt-- = temp_out_flt * -1;
1357*15dc779aSAndroid Build Coastguard Worker       }
1358*15dc779aSAndroid Build Coastguard Worker     }
1359*15dc779aSAndroid Build Coastguard Worker     time_float += 32;
1360*15dc779aSAndroid Build Coastguard Worker     memmove(pstr_qmf_bank->ptr_flt_time_buf + 32, pstr_qmf_bank->ptr_flt_time_buf,
1361*15dc779aSAndroid Build Coastguard Worker             288 * sizeof(pstr_qmf_bank->ptr_flt_time_buf[0]));
1362*15dc779aSAndroid Build Coastguard Worker     memset(pstr_qmf_bank->ptr_flt_time_buf, 0, 32 * sizeof(pstr_qmf_bank->ptr_flt_time_buf[0]));
1363*15dc779aSAndroid Build Coastguard Worker   }
1364*15dc779aSAndroid Build Coastguard Worker }
1365