xref: /aosp_15_r20/external/libxaac/common/ixheaac_esbr_fft.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2018 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 <stdio.h>
22*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
26*15dc779aSAndroid Build Coastguard Worker 
27*15dc779aSAndroid Build Coastguard Worker #define PLATFORM_INLINE __inline
28*15dc779aSAndroid Build Coastguard Worker 
29*15dc779aSAndroid Build Coastguard Worker #define DIG_REV(i, m, j)                                    \
30*15dc779aSAndroid Build Coastguard Worker   do {                                                      \
31*15dc779aSAndroid Build Coastguard Worker     unsigned _ = (i);                                       \
32*15dc779aSAndroid Build Coastguard Worker     _ = ((_ & 0x33333333) << 2) | ((_ & ~0x33333333) >> 2); \
33*15dc779aSAndroid Build Coastguard Worker     _ = ((_ & 0x0F0F0F0F) << 4) | ((_ & ~0x0F0F0F0F) >> 4); \
34*15dc779aSAndroid Build Coastguard Worker     _ = ((_ & 0x00FF00FF) << 8) | ((_ & ~0x00FF00FF) >> 8); \
35*15dc779aSAndroid Build Coastguard Worker     (j) = _ >> (m);                                         \
36*15dc779aSAndroid Build Coastguard Worker   } while (0)
37*15dc779aSAndroid Build Coastguard Worker 
38*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaac_twiddle_table_fft_float[514];
39*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaac_twidle_tbl_48[64];
40*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaac_twidle_tbl_24[32];
41*15dc779aSAndroid Build Coastguard Worker 
ixheaac_real_synth_fft_p2(FLOAT32 * ptr_x,FLOAT32 * ptr_y,WORD32 npoints)42*15dc779aSAndroid Build Coastguard Worker void ixheaac_real_synth_fft_p2(FLOAT32 *ptr_x, FLOAT32 *ptr_y, WORD32 npoints) {
43*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j, k, n_stages, h2;
44*15dc779aSAndroid Build Coastguard Worker   FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
45*15dc779aSAndroid Build Coastguard Worker   WORD32 del, nodespacing, in_loop_cnt;
46*15dc779aSAndroid Build Coastguard Worker   WORD32 not_power_4;
47*15dc779aSAndroid Build Coastguard Worker   WORD32 dig_rev_shift;
48*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_w;
49*15dc779aSAndroid Build Coastguard Worker 
50*15dc779aSAndroid Build Coastguard Worker   dig_rev_shift = ixheaac_norm32(npoints) + 1 - 16;
51*15dc779aSAndroid Build Coastguard Worker   n_stages = 30 - ixheaac_norm32(npoints);
52*15dc779aSAndroid Build Coastguard Worker   not_power_4 = n_stages & 1;
53*15dc779aSAndroid Build Coastguard Worker 
54*15dc779aSAndroid Build Coastguard Worker   n_stages = n_stages >> 1;
55*15dc779aSAndroid Build Coastguard Worker 
56*15dc779aSAndroid Build Coastguard Worker   ptr_w = ixheaac_twiddle_table_fft_float;
57*15dc779aSAndroid Build Coastguard Worker 
58*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < npoints; i += 4) {
59*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *inp = ptr_x;
60*15dc779aSAndroid Build Coastguard Worker 
61*15dc779aSAndroid Build Coastguard Worker     DIG_REV(i, dig_rev_shift, h2);
62*15dc779aSAndroid Build Coastguard Worker     if (not_power_4) {
63*15dc779aSAndroid Build Coastguard Worker       h2 += 1;
64*15dc779aSAndroid Build Coastguard Worker       h2 &= ~1;
65*15dc779aSAndroid Build Coastguard Worker     }
66*15dc779aSAndroid Build Coastguard Worker     inp += (h2 >> 1);
67*15dc779aSAndroid Build Coastguard Worker 
68*15dc779aSAndroid Build Coastguard Worker     x0r = *inp;
69*15dc779aSAndroid Build Coastguard Worker     inp += (npoints >> 2);
70*15dc779aSAndroid Build Coastguard Worker 
71*15dc779aSAndroid Build Coastguard Worker     x1r = *inp;
72*15dc779aSAndroid Build Coastguard Worker     inp += (npoints >> 2);
73*15dc779aSAndroid Build Coastguard Worker 
74*15dc779aSAndroid Build Coastguard Worker     x2r = *inp;
75*15dc779aSAndroid Build Coastguard Worker     inp += (npoints >> 2);
76*15dc779aSAndroid Build Coastguard Worker 
77*15dc779aSAndroid Build Coastguard Worker     x3r = *inp;
78*15dc779aSAndroid Build Coastguard Worker 
79*15dc779aSAndroid Build Coastguard Worker     x0r = x0r + x2r;
80*15dc779aSAndroid Build Coastguard Worker     x2r = x0r - (x2r * 2);
81*15dc779aSAndroid Build Coastguard Worker     x1r = x1r + x3r;
82*15dc779aSAndroid Build Coastguard Worker     x3r = x1r - (x3r * 2);
83*15dc779aSAndroid Build Coastguard Worker     x0r = x0r + x1r;
84*15dc779aSAndroid Build Coastguard Worker     x1r = x0r - (x1r * 2);
85*15dc779aSAndroid Build Coastguard Worker 
86*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x0r;
87*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = 0;
88*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x2r;
89*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x3r;
90*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x1r;
91*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = 0;
92*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x2r;
93*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = -x3r;
94*15dc779aSAndroid Build Coastguard Worker   }
95*15dc779aSAndroid Build Coastguard Worker   ptr_y -= 2 * npoints;
96*15dc779aSAndroid Build Coastguard Worker   del = 4;
97*15dc779aSAndroid Build Coastguard Worker   nodespacing = 64;
98*15dc779aSAndroid Build Coastguard Worker   in_loop_cnt = npoints >> 4;
99*15dc779aSAndroid Build Coastguard Worker   for (i = n_stages - 1; i > 0; i--) {
100*15dc779aSAndroid Build Coastguard Worker     const FLOAT32 *twiddles = ptr_w;
101*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *data = ptr_y;
102*15dc779aSAndroid Build Coastguard Worker     FLOAT32 W1, W2, W3, W4, W5, W6;
103*15dc779aSAndroid Build Coastguard Worker     WORD32 sec_loop_cnt;
104*15dc779aSAndroid Build Coastguard Worker 
105*15dc779aSAndroid Build Coastguard Worker     for (k = in_loop_cnt; k != 0; k--) {
106*15dc779aSAndroid Build Coastguard Worker       x0r = (*data);
107*15dc779aSAndroid Build Coastguard Worker       x0i = (*(data + 1));
108*15dc779aSAndroid Build Coastguard Worker       data += ((SIZE_T)del << 1);
109*15dc779aSAndroid Build Coastguard Worker 
110*15dc779aSAndroid Build Coastguard Worker       x1r = (*data);
111*15dc779aSAndroid Build Coastguard Worker       x1i = (*(data + 1));
112*15dc779aSAndroid Build Coastguard Worker       data += ((SIZE_T)del << 1);
113*15dc779aSAndroid Build Coastguard Worker 
114*15dc779aSAndroid Build Coastguard Worker       x2r = (*data);
115*15dc779aSAndroid Build Coastguard Worker       x2i = (*(data + 1));
116*15dc779aSAndroid Build Coastguard Worker       data += ((SIZE_T)del << 1);
117*15dc779aSAndroid Build Coastguard Worker 
118*15dc779aSAndroid Build Coastguard Worker       x3r = (*data);
119*15dc779aSAndroid Build Coastguard Worker       x3i = (*(data + 1));
120*15dc779aSAndroid Build Coastguard Worker       data -= 3 * ((SIZE_T)del << 1);
121*15dc779aSAndroid Build Coastguard Worker 
122*15dc779aSAndroid Build Coastguard Worker       x0r = x0r + x2r;
123*15dc779aSAndroid Build Coastguard Worker       x0i = x0i + x2i;
124*15dc779aSAndroid Build Coastguard Worker       x2r = x0r - (x2r * 2);
125*15dc779aSAndroid Build Coastguard Worker       x2i = x0i - (x2i * 2);
126*15dc779aSAndroid Build Coastguard Worker       x1r = x1r + x3r;
127*15dc779aSAndroid Build Coastguard Worker       x1i = x1i + x3i;
128*15dc779aSAndroid Build Coastguard Worker       x3r = x1r - (x3r * 2);
129*15dc779aSAndroid Build Coastguard Worker       x3i = x1i - (x3i * 2);
130*15dc779aSAndroid Build Coastguard Worker 
131*15dc779aSAndroid Build Coastguard Worker       x0r = x0r + x1r;
132*15dc779aSAndroid Build Coastguard Worker       x0i = x0i + x1i;
133*15dc779aSAndroid Build Coastguard Worker       x1r = x0r - (x1r * 2);
134*15dc779aSAndroid Build Coastguard Worker       x1i = x0i - (x1i * 2);
135*15dc779aSAndroid Build Coastguard Worker       x2r = x2r - x3i;
136*15dc779aSAndroid Build Coastguard Worker       x2i = x2i + x3r;
137*15dc779aSAndroid Build Coastguard Worker       x3i = x2r + (x3i * 2);
138*15dc779aSAndroid Build Coastguard Worker       x3r = x2i - (x3r * 2);
139*15dc779aSAndroid Build Coastguard Worker 
140*15dc779aSAndroid Build Coastguard Worker       *data = x0r;
141*15dc779aSAndroid Build Coastguard Worker       *(data + 1) = x0i;
142*15dc779aSAndroid Build Coastguard Worker       data += ((SIZE_T)del << 1);
143*15dc779aSAndroid Build Coastguard Worker 
144*15dc779aSAndroid Build Coastguard Worker       *data = x2r;
145*15dc779aSAndroid Build Coastguard Worker       *(data + 1) = x2i;
146*15dc779aSAndroid Build Coastguard Worker       data += ((SIZE_T)del << 1);
147*15dc779aSAndroid Build Coastguard Worker 
148*15dc779aSAndroid Build Coastguard Worker       *data = x1r;
149*15dc779aSAndroid Build Coastguard Worker       *(data + 1) = x1i;
150*15dc779aSAndroid Build Coastguard Worker       data += ((SIZE_T)del << 1);
151*15dc779aSAndroid Build Coastguard Worker 
152*15dc779aSAndroid Build Coastguard Worker       *data = x3i;
153*15dc779aSAndroid Build Coastguard Worker       *(data + 1) = x3r;
154*15dc779aSAndroid Build Coastguard Worker       data += ((SIZE_T)del << 1);
155*15dc779aSAndroid Build Coastguard Worker     }
156*15dc779aSAndroid Build Coastguard Worker     data = ptr_y + 2;
157*15dc779aSAndroid Build Coastguard Worker 
158*15dc779aSAndroid Build Coastguard Worker     sec_loop_cnt = (nodespacing * del);
159*15dc779aSAndroid Build Coastguard Worker     sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) - (sec_loop_cnt / 16) +
160*15dc779aSAndroid Build Coastguard Worker                    (sec_loop_cnt / 32) - (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
161*15dc779aSAndroid Build Coastguard Worker                    (sec_loop_cnt / 256);
162*15dc779aSAndroid Build Coastguard Worker 
163*15dc779aSAndroid Build Coastguard Worker     for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
164*15dc779aSAndroid Build Coastguard Worker       W1 = *(twiddles + j);
165*15dc779aSAndroid Build Coastguard Worker       W4 = *(twiddles + j + 257);
166*15dc779aSAndroid Build Coastguard Worker       W2 = *(twiddles + ((SIZE_T)j << 1));
167*15dc779aSAndroid Build Coastguard Worker       W5 = *(twiddles + ((SIZE_T)j << 1) + 257);
168*15dc779aSAndroid Build Coastguard Worker       W3 = *(twiddles + j + ((SIZE_T)j << 1));
169*15dc779aSAndroid Build Coastguard Worker       W6 = *(twiddles + j + ((SIZE_T)j << 1) + 257);
170*15dc779aSAndroid Build Coastguard Worker 
171*15dc779aSAndroid Build Coastguard Worker       for (k = in_loop_cnt; k != 0; k--) {
172*15dc779aSAndroid Build Coastguard Worker         FLOAT32 tmp;
173*15dc779aSAndroid Build Coastguard Worker         FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
174*15dc779aSAndroid Build Coastguard Worker 
175*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
176*15dc779aSAndroid Build Coastguard Worker 
177*15dc779aSAndroid Build Coastguard Worker         x1r = *data;
178*15dc779aSAndroid Build Coastguard Worker         x1i = *(data + 1);
179*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
180*15dc779aSAndroid Build Coastguard Worker 
181*15dc779aSAndroid Build Coastguard Worker         x2r = *data;
182*15dc779aSAndroid Build Coastguard Worker         x2i = *(data + 1);
183*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
184*15dc779aSAndroid Build Coastguard Worker 
185*15dc779aSAndroid Build Coastguard Worker         x3r = *data;
186*15dc779aSAndroid Build Coastguard Worker         x3i = *(data + 1);
187*15dc779aSAndroid Build Coastguard Worker         data -= 3 * ((SIZE_T)del << 1);
188*15dc779aSAndroid Build Coastguard Worker 
189*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
190*15dc779aSAndroid Build Coastguard Worker         x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
191*15dc779aSAndroid Build Coastguard Worker         x1r = tmp;
192*15dc779aSAndroid Build Coastguard Worker 
193*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x2r * W2) + ((FLOAT32)x2i * W5));
194*15dc779aSAndroid Build Coastguard Worker         x2i = (FLOAT32)(-((FLOAT32)x2r * W5) + (FLOAT32)x2i * W2);
195*15dc779aSAndroid Build Coastguard Worker         x2r = tmp;
196*15dc779aSAndroid Build Coastguard Worker 
197*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x3r * W3) + ((FLOAT32)x3i * W6));
198*15dc779aSAndroid Build Coastguard Worker         x3i = (FLOAT32)(-((FLOAT32)x3r * W6) + (FLOAT32)x3i * W3);
199*15dc779aSAndroid Build Coastguard Worker         x3r = tmp;
200*15dc779aSAndroid Build Coastguard Worker 
201*15dc779aSAndroid Build Coastguard Worker         x0r = (*data);
202*15dc779aSAndroid Build Coastguard Worker         x0i = (*(data + 1));
203*15dc779aSAndroid Build Coastguard Worker 
204*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + (x2r);
205*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + (x2i);
206*15dc779aSAndroid Build Coastguard Worker         x2r = x0r - (x2r * 2);
207*15dc779aSAndroid Build Coastguard Worker         x2i = x0i - (x2i * 2);
208*15dc779aSAndroid Build Coastguard Worker         x1r = x1r + x3r;
209*15dc779aSAndroid Build Coastguard Worker         x1i = x1i + x3i;
210*15dc779aSAndroid Build Coastguard Worker         x3r = x1r - (x3r * 2);
211*15dc779aSAndroid Build Coastguard Worker         x3i = x1i - (x3i * 2);
212*15dc779aSAndroid Build Coastguard Worker 
213*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + (x1r);
214*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + (x1i);
215*15dc779aSAndroid Build Coastguard Worker         x1r = x0r - (x1r * 2);
216*15dc779aSAndroid Build Coastguard Worker         x1i = x0i - (x1i * 2);
217*15dc779aSAndroid Build Coastguard Worker         x2r = x2r - (x3i);
218*15dc779aSAndroid Build Coastguard Worker         x2i = x2i + (x3r);
219*15dc779aSAndroid Build Coastguard Worker         x3i = x2r + (x3i * 2);
220*15dc779aSAndroid Build Coastguard Worker         x3r = x2i - (x3r * 2);
221*15dc779aSAndroid Build Coastguard Worker 
222*15dc779aSAndroid Build Coastguard Worker         *data = x0r;
223*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x0i;
224*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
225*15dc779aSAndroid Build Coastguard Worker 
226*15dc779aSAndroid Build Coastguard Worker         *data = x2r;
227*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x2i;
228*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
229*15dc779aSAndroid Build Coastguard Worker 
230*15dc779aSAndroid Build Coastguard Worker         *data = x1r;
231*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x1i;
232*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
233*15dc779aSAndroid Build Coastguard Worker 
234*15dc779aSAndroid Build Coastguard Worker         *data = x3i;
235*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x3r;
236*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
237*15dc779aSAndroid Build Coastguard Worker       }
238*15dc779aSAndroid Build Coastguard Worker       data -= 2 * npoints;
239*15dc779aSAndroid Build Coastguard Worker       data += 2;
240*15dc779aSAndroid Build Coastguard Worker     }
241*15dc779aSAndroid Build Coastguard Worker     for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
242*15dc779aSAndroid Build Coastguard Worker       W1 = *(twiddles + j);
243*15dc779aSAndroid Build Coastguard Worker       W4 = *(twiddles + j + 257);
244*15dc779aSAndroid Build Coastguard Worker       W2 = *(twiddles + ((SIZE_T)j << 1));
245*15dc779aSAndroid Build Coastguard Worker       W5 = *(twiddles + ((SIZE_T)j << 1) + 257);
246*15dc779aSAndroid Build Coastguard Worker       W3 = *(twiddles + j + ((SIZE_T)j << 1) - 256);
247*15dc779aSAndroid Build Coastguard Worker       W6 = *(twiddles + j + ((SIZE_T)j << 1) + 1);
248*15dc779aSAndroid Build Coastguard Worker 
249*15dc779aSAndroid Build Coastguard Worker       for (k = in_loop_cnt; k != 0; k--) {
250*15dc779aSAndroid Build Coastguard Worker         FLOAT32 tmp;
251*15dc779aSAndroid Build Coastguard Worker         FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
252*15dc779aSAndroid Build Coastguard Worker 
253*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
254*15dc779aSAndroid Build Coastguard Worker 
255*15dc779aSAndroid Build Coastguard Worker         x1r = *data;
256*15dc779aSAndroid Build Coastguard Worker         x1i = *(data + 1);
257*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
258*15dc779aSAndroid Build Coastguard Worker 
259*15dc779aSAndroid Build Coastguard Worker         x2r = *data;
260*15dc779aSAndroid Build Coastguard Worker         x2i = *(data + 1);
261*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
262*15dc779aSAndroid Build Coastguard Worker 
263*15dc779aSAndroid Build Coastguard Worker         x3r = *data;
264*15dc779aSAndroid Build Coastguard Worker         x3i = *(data + 1);
265*15dc779aSAndroid Build Coastguard Worker         data -= 3 * ((SIZE_T)del << 1);
266*15dc779aSAndroid Build Coastguard Worker 
267*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
268*15dc779aSAndroid Build Coastguard Worker         x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
269*15dc779aSAndroid Build Coastguard Worker         x1r = tmp;
270*15dc779aSAndroid Build Coastguard Worker 
271*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x2r * W2) + ((FLOAT32)x2i * W5));
272*15dc779aSAndroid Build Coastguard Worker         x2i = (FLOAT32)(-((FLOAT32)x2r * W5) + (FLOAT32)x2i * W2);
273*15dc779aSAndroid Build Coastguard Worker         x2r = tmp;
274*15dc779aSAndroid Build Coastguard Worker 
275*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x3r * W6) - ((FLOAT32)x3i * W3));
276*15dc779aSAndroid Build Coastguard Worker         x3i = (FLOAT32)(((FLOAT32)x3r * W3) + ((FLOAT32)x3i * W6));
277*15dc779aSAndroid Build Coastguard Worker         x3r = tmp;
278*15dc779aSAndroid Build Coastguard Worker 
279*15dc779aSAndroid Build Coastguard Worker         x0r = (*data);
280*15dc779aSAndroid Build Coastguard Worker         x0i = (*(data + 1));
281*15dc779aSAndroid Build Coastguard Worker 
282*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + (x2r);
283*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + (x2i);
284*15dc779aSAndroid Build Coastguard Worker         x2r = x0r - (x2r * 2);
285*15dc779aSAndroid Build Coastguard Worker         x2i = x0i - (x2i * 2);
286*15dc779aSAndroid Build Coastguard Worker         x1r = x1r + x3r;
287*15dc779aSAndroid Build Coastguard Worker         x1i = x1i + x3i;
288*15dc779aSAndroid Build Coastguard Worker         x3r = x1r - (x3r * 2);
289*15dc779aSAndroid Build Coastguard Worker         x3i = x1i - (x3i * 2);
290*15dc779aSAndroid Build Coastguard Worker 
291*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + (x1r);
292*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + (x1i);
293*15dc779aSAndroid Build Coastguard Worker         x1r = x0r - (x1r * 2);
294*15dc779aSAndroid Build Coastguard Worker         x1i = x0i - (x1i * 2);
295*15dc779aSAndroid Build Coastguard Worker         x2r = x2r - (x3i);
296*15dc779aSAndroid Build Coastguard Worker         x2i = x2i + (x3r);
297*15dc779aSAndroid Build Coastguard Worker         x3i = x2r + (x3i * 2);
298*15dc779aSAndroid Build Coastguard Worker         x3r = x2i - (x3r * 2);
299*15dc779aSAndroid Build Coastguard Worker 
300*15dc779aSAndroid Build Coastguard Worker         *data = x0r;
301*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x0i;
302*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
303*15dc779aSAndroid Build Coastguard Worker 
304*15dc779aSAndroid Build Coastguard Worker         *data = x2r;
305*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x2i;
306*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
307*15dc779aSAndroid Build Coastguard Worker 
308*15dc779aSAndroid Build Coastguard Worker         *data = x1r;
309*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x1i;
310*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
311*15dc779aSAndroid Build Coastguard Worker 
312*15dc779aSAndroid Build Coastguard Worker         *data = x3i;
313*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x3r;
314*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
315*15dc779aSAndroid Build Coastguard Worker       }
316*15dc779aSAndroid Build Coastguard Worker       data -= 2 * npoints;
317*15dc779aSAndroid Build Coastguard Worker       data += 2;
318*15dc779aSAndroid Build Coastguard Worker     }
319*15dc779aSAndroid Build Coastguard Worker     for (; j <= sec_loop_cnt * 2; j += nodespacing) {
320*15dc779aSAndroid Build Coastguard Worker       W1 = *(twiddles + j);
321*15dc779aSAndroid Build Coastguard Worker       W4 = *(twiddles + j + 257);
322*15dc779aSAndroid Build Coastguard Worker       W2 = *(twiddles + ((SIZE_T)j << 1) - 256);
323*15dc779aSAndroid Build Coastguard Worker       W5 = *(twiddles + ((SIZE_T)j << 1) + 1);
324*15dc779aSAndroid Build Coastguard Worker       W3 = *(twiddles + j + ((SIZE_T)j << 1) - 256);
325*15dc779aSAndroid Build Coastguard Worker       W6 = *(twiddles + j + ((SIZE_T)j << 1) + 1);
326*15dc779aSAndroid Build Coastguard Worker 
327*15dc779aSAndroid Build Coastguard Worker       for (k = in_loop_cnt; k != 0; k--) {
328*15dc779aSAndroid Build Coastguard Worker         FLOAT32 tmp;
329*15dc779aSAndroid Build Coastguard Worker         FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
330*15dc779aSAndroid Build Coastguard Worker 
331*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
332*15dc779aSAndroid Build Coastguard Worker 
333*15dc779aSAndroid Build Coastguard Worker         x1r = *data;
334*15dc779aSAndroid Build Coastguard Worker         x1i = *(data + 1);
335*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
336*15dc779aSAndroid Build Coastguard Worker 
337*15dc779aSAndroid Build Coastguard Worker         x2r = *data;
338*15dc779aSAndroid Build Coastguard Worker         x2i = *(data + 1);
339*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
340*15dc779aSAndroid Build Coastguard Worker 
341*15dc779aSAndroid Build Coastguard Worker         x3r = *data;
342*15dc779aSAndroid Build Coastguard Worker         x3i = *(data + 1);
343*15dc779aSAndroid Build Coastguard Worker         data -= 3 * ((SIZE_T)del << 1);
344*15dc779aSAndroid Build Coastguard Worker 
345*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
346*15dc779aSAndroid Build Coastguard Worker         x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
347*15dc779aSAndroid Build Coastguard Worker         x1r = tmp;
348*15dc779aSAndroid Build Coastguard Worker 
349*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x2r * W5) - ((FLOAT32)x2i * W2));
350*15dc779aSAndroid Build Coastguard Worker         x2i = (FLOAT32)(((FLOAT32)x2r * W2) + ((FLOAT32)x2i * W5));
351*15dc779aSAndroid Build Coastguard Worker         x2r = tmp;
352*15dc779aSAndroid Build Coastguard Worker 
353*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x3r * W6) - ((FLOAT32)x3i * W3));
354*15dc779aSAndroid Build Coastguard Worker         x3i = (FLOAT32)(((FLOAT32)x3r * W3) + ((FLOAT32)x3i * W6));
355*15dc779aSAndroid Build Coastguard Worker         x3r = tmp;
356*15dc779aSAndroid Build Coastguard Worker 
357*15dc779aSAndroid Build Coastguard Worker         x0r = (*data);
358*15dc779aSAndroid Build Coastguard Worker         x0i = (*(data + 1));
359*15dc779aSAndroid Build Coastguard Worker 
360*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + (x2r);
361*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + (x2i);
362*15dc779aSAndroid Build Coastguard Worker         x2r = x0r - (x2r * 2);
363*15dc779aSAndroid Build Coastguard Worker         x2i = x0i - (x2i * 2);
364*15dc779aSAndroid Build Coastguard Worker         x1r = x1r + x3r;
365*15dc779aSAndroid Build Coastguard Worker         x1i = x1i + x3i;
366*15dc779aSAndroid Build Coastguard Worker         x3r = x1r - (x3r * 2);
367*15dc779aSAndroid Build Coastguard Worker         x3i = x1i - (x3i * 2);
368*15dc779aSAndroid Build Coastguard Worker 
369*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + (x1r);
370*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + (x1i);
371*15dc779aSAndroid Build Coastguard Worker         x1r = x0r - (x1r * 2);
372*15dc779aSAndroid Build Coastguard Worker         x1i = x0i - (x1i * 2);
373*15dc779aSAndroid Build Coastguard Worker         x2r = x2r - (x3i);
374*15dc779aSAndroid Build Coastguard Worker         x2i = x2i + (x3r);
375*15dc779aSAndroid Build Coastguard Worker         x3i = x2r + (x3i * 2);
376*15dc779aSAndroid Build Coastguard Worker         x3r = x2i - (x3r * 2);
377*15dc779aSAndroid Build Coastguard Worker 
378*15dc779aSAndroid Build Coastguard Worker         *data = x0r;
379*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x0i;
380*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
381*15dc779aSAndroid Build Coastguard Worker 
382*15dc779aSAndroid Build Coastguard Worker         *data = x2r;
383*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x2i;
384*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
385*15dc779aSAndroid Build Coastguard Worker 
386*15dc779aSAndroid Build Coastguard Worker         *data = x1r;
387*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x1i;
388*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
389*15dc779aSAndroid Build Coastguard Worker 
390*15dc779aSAndroid Build Coastguard Worker         *data = x3i;
391*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x3r;
392*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
393*15dc779aSAndroid Build Coastguard Worker       }
394*15dc779aSAndroid Build Coastguard Worker       data -= 2 * npoints;
395*15dc779aSAndroid Build Coastguard Worker       data += 2;
396*15dc779aSAndroid Build Coastguard Worker     }
397*15dc779aSAndroid Build Coastguard Worker     for (; j < nodespacing * del; j += nodespacing) {
398*15dc779aSAndroid Build Coastguard Worker       W1 = *(twiddles + j);
399*15dc779aSAndroid Build Coastguard Worker       W4 = *(twiddles + j + 257);
400*15dc779aSAndroid Build Coastguard Worker       W2 = *(twiddles + ((SIZE_T)j << 1) - 256);
401*15dc779aSAndroid Build Coastguard Worker       W5 = *(twiddles + ((SIZE_T)j << 1) + 1);
402*15dc779aSAndroid Build Coastguard Worker       W3 = *(twiddles + j + ((SIZE_T)j << 1) - 512);
403*15dc779aSAndroid Build Coastguard Worker       W6 = *(twiddles + j + ((SIZE_T)j << 1) - 512 + 257);
404*15dc779aSAndroid Build Coastguard Worker 
405*15dc779aSAndroid Build Coastguard Worker       for (k = in_loop_cnt; k != 0; k--) {
406*15dc779aSAndroid Build Coastguard Worker         FLOAT32 tmp;
407*15dc779aSAndroid Build Coastguard Worker         FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
408*15dc779aSAndroid Build Coastguard Worker 
409*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
410*15dc779aSAndroid Build Coastguard Worker 
411*15dc779aSAndroid Build Coastguard Worker         x1r = *data;
412*15dc779aSAndroid Build Coastguard Worker         x1i = *(data + 1);
413*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
414*15dc779aSAndroid Build Coastguard Worker 
415*15dc779aSAndroid Build Coastguard Worker         x2r = *data;
416*15dc779aSAndroid Build Coastguard Worker         x2i = *(data + 1);
417*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
418*15dc779aSAndroid Build Coastguard Worker 
419*15dc779aSAndroid Build Coastguard Worker         x3r = *data;
420*15dc779aSAndroid Build Coastguard Worker         x3i = *(data + 1);
421*15dc779aSAndroid Build Coastguard Worker         data -= 3 * ((SIZE_T)del << 1);
422*15dc779aSAndroid Build Coastguard Worker 
423*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
424*15dc779aSAndroid Build Coastguard Worker         x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
425*15dc779aSAndroid Build Coastguard Worker         x1r = tmp;
426*15dc779aSAndroid Build Coastguard Worker 
427*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x2r * W5) - ((FLOAT32)x2i * W2));
428*15dc779aSAndroid Build Coastguard Worker         x2i = (FLOAT32)(((FLOAT32)x2r * W2) + ((FLOAT32)x2i * W5));
429*15dc779aSAndroid Build Coastguard Worker         x2r = tmp;
430*15dc779aSAndroid Build Coastguard Worker 
431*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(-((FLOAT32)x3r * W3) - ((FLOAT32)x3i * W6));
432*15dc779aSAndroid Build Coastguard Worker         x3i = (FLOAT32)(-((FLOAT32)x3r * W6) + (FLOAT32)x3i * W3);
433*15dc779aSAndroid Build Coastguard Worker         x3r = tmp;
434*15dc779aSAndroid Build Coastguard Worker 
435*15dc779aSAndroid Build Coastguard Worker         x0r = (*data);
436*15dc779aSAndroid Build Coastguard Worker         x0i = (*(data + 1));
437*15dc779aSAndroid Build Coastguard Worker 
438*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + (x2r);
439*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + (x2i);
440*15dc779aSAndroid Build Coastguard Worker         x2r = x0r - (x2r * 2);
441*15dc779aSAndroid Build Coastguard Worker         x2i = x0i - (x2i * 2);
442*15dc779aSAndroid Build Coastguard Worker         x1r = x1r + x3r;
443*15dc779aSAndroid Build Coastguard Worker         x1i = x1i - x3i;
444*15dc779aSAndroid Build Coastguard Worker         x3r = x1r - (x3r * 2);
445*15dc779aSAndroid Build Coastguard Worker         x3i = x1i + (x3i * 2);
446*15dc779aSAndroid Build Coastguard Worker 
447*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + (x1r);
448*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + (x1i);
449*15dc779aSAndroid Build Coastguard Worker         x1r = x0r - (x1r * 2);
450*15dc779aSAndroid Build Coastguard Worker         x1i = x0i - (x1i * 2);
451*15dc779aSAndroid Build Coastguard Worker         x2r = x2r - (x3i);
452*15dc779aSAndroid Build Coastguard Worker         x2i = x2i + (x3r);
453*15dc779aSAndroid Build Coastguard Worker         x3i = x2r + (x3i * 2);
454*15dc779aSAndroid Build Coastguard Worker         x3r = x2i - (x3r * 2);
455*15dc779aSAndroid Build Coastguard Worker 
456*15dc779aSAndroid Build Coastguard Worker         *data = x0r;
457*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x0i;
458*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
459*15dc779aSAndroid Build Coastguard Worker 
460*15dc779aSAndroid Build Coastguard Worker         *data = x2r;
461*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x2i;
462*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
463*15dc779aSAndroid Build Coastguard Worker 
464*15dc779aSAndroid Build Coastguard Worker         *data = x1r;
465*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x1i;
466*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
467*15dc779aSAndroid Build Coastguard Worker 
468*15dc779aSAndroid Build Coastguard Worker         *data = x3i;
469*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x3r;
470*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
471*15dc779aSAndroid Build Coastguard Worker       }
472*15dc779aSAndroid Build Coastguard Worker       data -= 2 * npoints;
473*15dc779aSAndroid Build Coastguard Worker       data += 2;
474*15dc779aSAndroid Build Coastguard Worker     }
475*15dc779aSAndroid Build Coastguard Worker     nodespacing >>= 2;
476*15dc779aSAndroid Build Coastguard Worker     del <<= 2;
477*15dc779aSAndroid Build Coastguard Worker     in_loop_cnt >>= 2;
478*15dc779aSAndroid Build Coastguard Worker   }
479*15dc779aSAndroid Build Coastguard Worker 
480*15dc779aSAndroid Build Coastguard Worker   if (not_power_4) {
481*15dc779aSAndroid Build Coastguard Worker     const FLOAT32 *twiddles = ptr_w;
482*15dc779aSAndroid Build Coastguard Worker     nodespacing <<= 1;
483*15dc779aSAndroid Build Coastguard Worker 
484*15dc779aSAndroid Build Coastguard Worker     for (j = del / 2; j != 0; j--) {
485*15dc779aSAndroid Build Coastguard Worker       FLOAT32 W1 = *twiddles;
486*15dc779aSAndroid Build Coastguard Worker       FLOAT32 W4 = *(twiddles + 257);
487*15dc779aSAndroid Build Coastguard Worker       FLOAT32 tmp;
488*15dc779aSAndroid Build Coastguard Worker       twiddles += nodespacing;
489*15dc779aSAndroid Build Coastguard Worker 
490*15dc779aSAndroid Build Coastguard Worker       x0r = *ptr_y;
491*15dc779aSAndroid Build Coastguard Worker       x0i = *(ptr_y + 1);
492*15dc779aSAndroid Build Coastguard Worker       ptr_y += ((SIZE_T)del << 1);
493*15dc779aSAndroid Build Coastguard Worker 
494*15dc779aSAndroid Build Coastguard Worker       x1r = *ptr_y;
495*15dc779aSAndroid Build Coastguard Worker       x1i = *(ptr_y + 1);
496*15dc779aSAndroid Build Coastguard Worker 
497*15dc779aSAndroid Build Coastguard Worker       tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
498*15dc779aSAndroid Build Coastguard Worker       x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
499*15dc779aSAndroid Build Coastguard Worker       x1r = tmp;
500*15dc779aSAndroid Build Coastguard Worker 
501*15dc779aSAndroid Build Coastguard Worker       *ptr_y = (x0r) - (x1r);
502*15dc779aSAndroid Build Coastguard Worker       *(ptr_y + 1) = (x0i) - (x1i);
503*15dc779aSAndroid Build Coastguard Worker       ptr_y -= ((SIZE_T)del << 1);
504*15dc779aSAndroid Build Coastguard Worker 
505*15dc779aSAndroid Build Coastguard Worker       *ptr_y = (x0r) + (x1r);
506*15dc779aSAndroid Build Coastguard Worker       *(ptr_y + 1) = (x0i) + (x1i);
507*15dc779aSAndroid Build Coastguard Worker       ptr_y += 2;
508*15dc779aSAndroid Build Coastguard Worker     }
509*15dc779aSAndroid Build Coastguard Worker     twiddles = ptr_w;
510*15dc779aSAndroid Build Coastguard Worker     for (j = del / 2; j != 0; j--) {
511*15dc779aSAndroid Build Coastguard Worker       FLOAT32 W1 = *twiddles;
512*15dc779aSAndroid Build Coastguard Worker       FLOAT32 W4 = *(twiddles + 257);
513*15dc779aSAndroid Build Coastguard Worker       FLOAT32 tmp;
514*15dc779aSAndroid Build Coastguard Worker       twiddles += nodespacing;
515*15dc779aSAndroid Build Coastguard Worker 
516*15dc779aSAndroid Build Coastguard Worker       x0r = *ptr_y;
517*15dc779aSAndroid Build Coastguard Worker       x0i = *(ptr_y + 1);
518*15dc779aSAndroid Build Coastguard Worker       ptr_y += ((SIZE_T)del << 1);
519*15dc779aSAndroid Build Coastguard Worker 
520*15dc779aSAndroid Build Coastguard Worker       x1r = *ptr_y;
521*15dc779aSAndroid Build Coastguard Worker       x1i = *(ptr_y + 1);
522*15dc779aSAndroid Build Coastguard Worker       tmp = (FLOAT32)(((FLOAT32)x1r * W4) - ((FLOAT32)x1i * W1));
523*15dc779aSAndroid Build Coastguard Worker       x1i = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
524*15dc779aSAndroid Build Coastguard Worker       x1r = tmp;
525*15dc779aSAndroid Build Coastguard Worker 
526*15dc779aSAndroid Build Coastguard Worker       *ptr_y = (x0r) - (x1r);
527*15dc779aSAndroid Build Coastguard Worker       *(ptr_y + 1) = (x0i) - (x1i);
528*15dc779aSAndroid Build Coastguard Worker       ptr_y -= ((SIZE_T)del << 1);
529*15dc779aSAndroid Build Coastguard Worker 
530*15dc779aSAndroid Build Coastguard Worker       *ptr_y = (x0r) + (x1r);
531*15dc779aSAndroid Build Coastguard Worker       *(ptr_y + 1) = (x0i) + (x1i);
532*15dc779aSAndroid Build Coastguard Worker       ptr_y += 2;
533*15dc779aSAndroid Build Coastguard Worker     }
534*15dc779aSAndroid Build Coastguard Worker   }
535*15dc779aSAndroid Build Coastguard Worker }
536*15dc779aSAndroid Build Coastguard Worker 
ixheaac_cmplx_anal_fft_p2(FLOAT32 * ptr_x,FLOAT32 * ptr_y,WORD32 npoints)537*15dc779aSAndroid Build Coastguard Worker void ixheaac_cmplx_anal_fft_p2(FLOAT32 *ptr_x, FLOAT32 *ptr_y, WORD32 npoints) {
538*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j, k, n_stages, h2;
539*15dc779aSAndroid Build Coastguard Worker   FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
540*15dc779aSAndroid Build Coastguard Worker   WORD32 del, nodespacing, in_loop_cnt;
541*15dc779aSAndroid Build Coastguard Worker   WORD32 not_power_4;
542*15dc779aSAndroid Build Coastguard Worker   WORD32 dig_rev_shift;
543*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_w;
544*15dc779aSAndroid Build Coastguard Worker 
545*15dc779aSAndroid Build Coastguard Worker   dig_rev_shift = ixheaac_norm32(npoints) + 1 - 16;
546*15dc779aSAndroid Build Coastguard Worker   n_stages = 30 - ixheaac_norm32(npoints);
547*15dc779aSAndroid Build Coastguard Worker   not_power_4 = n_stages & 1;
548*15dc779aSAndroid Build Coastguard Worker 
549*15dc779aSAndroid Build Coastguard Worker   n_stages = n_stages >> 1;
550*15dc779aSAndroid Build Coastguard Worker 
551*15dc779aSAndroid Build Coastguard Worker   ptr_w = ixheaac_twiddle_table_fft_float;
552*15dc779aSAndroid Build Coastguard Worker 
553*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < npoints; i += 4) {
554*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *inp = ptr_x;
555*15dc779aSAndroid Build Coastguard Worker 
556*15dc779aSAndroid Build Coastguard Worker     DIG_REV(i, dig_rev_shift, h2);
557*15dc779aSAndroid Build Coastguard Worker     if (not_power_4) {
558*15dc779aSAndroid Build Coastguard Worker       h2 += 1;
559*15dc779aSAndroid Build Coastguard Worker       h2 &= ~1;
560*15dc779aSAndroid Build Coastguard Worker     }
561*15dc779aSAndroid Build Coastguard Worker     inp += (h2);
562*15dc779aSAndroid Build Coastguard Worker 
563*15dc779aSAndroid Build Coastguard Worker     x0r = *inp;
564*15dc779aSAndroid Build Coastguard Worker     x0i = *(inp + 1);
565*15dc779aSAndroid Build Coastguard Worker     inp += (npoints >> 1);
566*15dc779aSAndroid Build Coastguard Worker 
567*15dc779aSAndroid Build Coastguard Worker     x1r = *inp;
568*15dc779aSAndroid Build Coastguard Worker     x1i = *(inp + 1);
569*15dc779aSAndroid Build Coastguard Worker     inp += (npoints >> 1);
570*15dc779aSAndroid Build Coastguard Worker 
571*15dc779aSAndroid Build Coastguard Worker     x2r = *inp;
572*15dc779aSAndroid Build Coastguard Worker     x2i = *(inp + 1);
573*15dc779aSAndroid Build Coastguard Worker     inp += (npoints >> 1);
574*15dc779aSAndroid Build Coastguard Worker 
575*15dc779aSAndroid Build Coastguard Worker     x3r = *inp;
576*15dc779aSAndroid Build Coastguard Worker     x3i = *(inp + 1);
577*15dc779aSAndroid Build Coastguard Worker 
578*15dc779aSAndroid Build Coastguard Worker     x0r = x0r + x2r;
579*15dc779aSAndroid Build Coastguard Worker     x0i = x0i + x2i;
580*15dc779aSAndroid Build Coastguard Worker     x2r = x0r - (x2r * 2);
581*15dc779aSAndroid Build Coastguard Worker     x2i = x0i - (x2i * 2);
582*15dc779aSAndroid Build Coastguard Worker     x1r = x1r + x3r;
583*15dc779aSAndroid Build Coastguard Worker     x1i = x1i + x3i;
584*15dc779aSAndroid Build Coastguard Worker     x3r = x1r - (x3r * 2);
585*15dc779aSAndroid Build Coastguard Worker     x3i = x1i - (x3i * 2);
586*15dc779aSAndroid Build Coastguard Worker 
587*15dc779aSAndroid Build Coastguard Worker     x0r = x0r + x1r;
588*15dc779aSAndroid Build Coastguard Worker     x0i = x0i + x1i;
589*15dc779aSAndroid Build Coastguard Worker     x1r = x0r - (x1r * 2);
590*15dc779aSAndroid Build Coastguard Worker     x1i = x0i - (x1i * 2);
591*15dc779aSAndroid Build Coastguard Worker     x2r = x2r - x3i;
592*15dc779aSAndroid Build Coastguard Worker     x2i = x2i + x3r;
593*15dc779aSAndroid Build Coastguard Worker     x3i = x2r + (x3i * 2);
594*15dc779aSAndroid Build Coastguard Worker     x3r = x2i - (x3r * 2);
595*15dc779aSAndroid Build Coastguard Worker 
596*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x0r;
597*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x0i;
598*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x2r;
599*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x2i;
600*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x1r;
601*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x1i;
602*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x3i;
603*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x3r;
604*15dc779aSAndroid Build Coastguard Worker   }
605*15dc779aSAndroid Build Coastguard Worker   ptr_y -= 2 * npoints;
606*15dc779aSAndroid Build Coastguard Worker   del = 4;
607*15dc779aSAndroid Build Coastguard Worker   nodespacing = 64;
608*15dc779aSAndroid Build Coastguard Worker   in_loop_cnt = npoints >> 4;
609*15dc779aSAndroid Build Coastguard Worker   for (i = n_stages - 1; i > 0; i--) {
610*15dc779aSAndroid Build Coastguard Worker     const FLOAT32 *twiddles = ptr_w;
611*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *data = ptr_y;
612*15dc779aSAndroid Build Coastguard Worker     FLOAT32 W1, W2, W3, W4, W5, W6;
613*15dc779aSAndroid Build Coastguard Worker     WORD32 sec_loop_cnt;
614*15dc779aSAndroid Build Coastguard Worker 
615*15dc779aSAndroid Build Coastguard Worker     for (k = in_loop_cnt; k != 0; k--) {
616*15dc779aSAndroid Build Coastguard Worker       x0r = (*data);
617*15dc779aSAndroid Build Coastguard Worker       x0i = (*(data + 1));
618*15dc779aSAndroid Build Coastguard Worker       data += ((SIZE_T)del << 1);
619*15dc779aSAndroid Build Coastguard Worker 
620*15dc779aSAndroid Build Coastguard Worker       x1r = (*data);
621*15dc779aSAndroid Build Coastguard Worker       x1i = (*(data + 1));
622*15dc779aSAndroid Build Coastguard Worker       data += ((SIZE_T)del << 1);
623*15dc779aSAndroid Build Coastguard Worker 
624*15dc779aSAndroid Build Coastguard Worker       x2r = (*data);
625*15dc779aSAndroid Build Coastguard Worker       x2i = (*(data + 1));
626*15dc779aSAndroid Build Coastguard Worker       data += ((SIZE_T)del << 1);
627*15dc779aSAndroid Build Coastguard Worker 
628*15dc779aSAndroid Build Coastguard Worker       x3r = (*data);
629*15dc779aSAndroid Build Coastguard Worker       x3i = (*(data + 1));
630*15dc779aSAndroid Build Coastguard Worker       data -= 3 * ((SIZE_T)del << 1);
631*15dc779aSAndroid Build Coastguard Worker 
632*15dc779aSAndroid Build Coastguard Worker       x0r = x0r + x2r;
633*15dc779aSAndroid Build Coastguard Worker       x0i = x0i + x2i;
634*15dc779aSAndroid Build Coastguard Worker       x2r = x0r - (x2r * 2);
635*15dc779aSAndroid Build Coastguard Worker       x2i = x0i - (x2i * 2);
636*15dc779aSAndroid Build Coastguard Worker       x1r = x1r + x3r;
637*15dc779aSAndroid Build Coastguard Worker       x1i = x1i + x3i;
638*15dc779aSAndroid Build Coastguard Worker       x3r = x1r - (x3r * 2);
639*15dc779aSAndroid Build Coastguard Worker       x3i = x1i - (x3i * 2);
640*15dc779aSAndroid Build Coastguard Worker 
641*15dc779aSAndroid Build Coastguard Worker       x0r = x0r + x1r;
642*15dc779aSAndroid Build Coastguard Worker       x0i = x0i + x1i;
643*15dc779aSAndroid Build Coastguard Worker       x1r = x0r - (x1r * 2);
644*15dc779aSAndroid Build Coastguard Worker       x1i = x0i - (x1i * 2);
645*15dc779aSAndroid Build Coastguard Worker       x2r = x2r - x3i;
646*15dc779aSAndroid Build Coastguard Worker       x2i = x2i + x3r;
647*15dc779aSAndroid Build Coastguard Worker       x3i = x2r + (x3i * 2);
648*15dc779aSAndroid Build Coastguard Worker       x3r = x2i - (x3r * 2);
649*15dc779aSAndroid Build Coastguard Worker 
650*15dc779aSAndroid Build Coastguard Worker       *data = x0r;
651*15dc779aSAndroid Build Coastguard Worker       *(data + 1) = x0i;
652*15dc779aSAndroid Build Coastguard Worker       data += ((SIZE_T)del << 1);
653*15dc779aSAndroid Build Coastguard Worker 
654*15dc779aSAndroid Build Coastguard Worker       *data = x2r;
655*15dc779aSAndroid Build Coastguard Worker       *(data + 1) = x2i;
656*15dc779aSAndroid Build Coastguard Worker       data += ((SIZE_T)del << 1);
657*15dc779aSAndroid Build Coastguard Worker 
658*15dc779aSAndroid Build Coastguard Worker       *data = x1r;
659*15dc779aSAndroid Build Coastguard Worker       *(data + 1) = x1i;
660*15dc779aSAndroid Build Coastguard Worker       data += ((SIZE_T)del << 1);
661*15dc779aSAndroid Build Coastguard Worker 
662*15dc779aSAndroid Build Coastguard Worker       *data = x3i;
663*15dc779aSAndroid Build Coastguard Worker       *(data + 1) = x3r;
664*15dc779aSAndroid Build Coastguard Worker       data += ((SIZE_T)del << 1);
665*15dc779aSAndroid Build Coastguard Worker     }
666*15dc779aSAndroid Build Coastguard Worker     data = ptr_y + 2;
667*15dc779aSAndroid Build Coastguard Worker 
668*15dc779aSAndroid Build Coastguard Worker     sec_loop_cnt = (nodespacing * del);
669*15dc779aSAndroid Build Coastguard Worker     sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) - (sec_loop_cnt / 16) +
670*15dc779aSAndroid Build Coastguard Worker                    (sec_loop_cnt / 32) - (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
671*15dc779aSAndroid Build Coastguard Worker                    (sec_loop_cnt / 256);
672*15dc779aSAndroid Build Coastguard Worker 
673*15dc779aSAndroid Build Coastguard Worker     for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
674*15dc779aSAndroid Build Coastguard Worker       W1 = *(twiddles + j);
675*15dc779aSAndroid Build Coastguard Worker       W4 = *(twiddles + j + 257);
676*15dc779aSAndroid Build Coastguard Worker       W2 = *(twiddles + ((SIZE_T)j << 1));
677*15dc779aSAndroid Build Coastguard Worker       W5 = *(twiddles + ((SIZE_T)j << 1) + 257);
678*15dc779aSAndroid Build Coastguard Worker       W3 = *(twiddles + j + ((SIZE_T)j << 1));
679*15dc779aSAndroid Build Coastguard Worker       W6 = *(twiddles + j + ((SIZE_T)j << 1) + 257);
680*15dc779aSAndroid Build Coastguard Worker 
681*15dc779aSAndroid Build Coastguard Worker       for (k = in_loop_cnt; k != 0; k--) {
682*15dc779aSAndroid Build Coastguard Worker         FLOAT32 tmp;
683*15dc779aSAndroid Build Coastguard Worker         FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
684*15dc779aSAndroid Build Coastguard Worker 
685*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
686*15dc779aSAndroid Build Coastguard Worker 
687*15dc779aSAndroid Build Coastguard Worker         x1r = *data;
688*15dc779aSAndroid Build Coastguard Worker         x1i = *(data + 1);
689*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
690*15dc779aSAndroid Build Coastguard Worker 
691*15dc779aSAndroid Build Coastguard Worker         x2r = *data;
692*15dc779aSAndroid Build Coastguard Worker         x2i = *(data + 1);
693*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
694*15dc779aSAndroid Build Coastguard Worker 
695*15dc779aSAndroid Build Coastguard Worker         x3r = *data;
696*15dc779aSAndroid Build Coastguard Worker         x3i = *(data + 1);
697*15dc779aSAndroid Build Coastguard Worker         data -= 3 * ((SIZE_T)del << 1);
698*15dc779aSAndroid Build Coastguard Worker 
699*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
700*15dc779aSAndroid Build Coastguard Worker         x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
701*15dc779aSAndroid Build Coastguard Worker         x1r = tmp;
702*15dc779aSAndroid Build Coastguard Worker 
703*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x2r * W2) + ((FLOAT32)x2i * W5));
704*15dc779aSAndroid Build Coastguard Worker         x2i = (FLOAT32)(-((FLOAT32)x2r * W5) + (FLOAT32)x2i * W2);
705*15dc779aSAndroid Build Coastguard Worker         x2r = tmp;
706*15dc779aSAndroid Build Coastguard Worker 
707*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x3r * W3) + ((FLOAT32)x3i * W6));
708*15dc779aSAndroid Build Coastguard Worker         x3i = (FLOAT32)(-((FLOAT32)x3r * W6) + (FLOAT32)x3i * W3);
709*15dc779aSAndroid Build Coastguard Worker         x3r = tmp;
710*15dc779aSAndroid Build Coastguard Worker 
711*15dc779aSAndroid Build Coastguard Worker         x0r = (*data);
712*15dc779aSAndroid Build Coastguard Worker         x0i = (*(data + 1));
713*15dc779aSAndroid Build Coastguard Worker 
714*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + (x2r);
715*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + (x2i);
716*15dc779aSAndroid Build Coastguard Worker         x2r = x0r - (x2r * 2);
717*15dc779aSAndroid Build Coastguard Worker         x2i = x0i - (x2i * 2);
718*15dc779aSAndroid Build Coastguard Worker         x1r = x1r + x3r;
719*15dc779aSAndroid Build Coastguard Worker         x1i = x1i + x3i;
720*15dc779aSAndroid Build Coastguard Worker         x3r = x1r - (x3r * 2);
721*15dc779aSAndroid Build Coastguard Worker         x3i = x1i - (x3i * 2);
722*15dc779aSAndroid Build Coastguard Worker 
723*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + (x1r);
724*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + (x1i);
725*15dc779aSAndroid Build Coastguard Worker         x1r = x0r - (x1r * 2);
726*15dc779aSAndroid Build Coastguard Worker         x1i = x0i - (x1i * 2);
727*15dc779aSAndroid Build Coastguard Worker         x2r = x2r - (x3i);
728*15dc779aSAndroid Build Coastguard Worker         x2i = x2i + (x3r);
729*15dc779aSAndroid Build Coastguard Worker         x3i = x2r + (x3i * 2);
730*15dc779aSAndroid Build Coastguard Worker         x3r = x2i - (x3r * 2);
731*15dc779aSAndroid Build Coastguard Worker 
732*15dc779aSAndroid Build Coastguard Worker         *data = x0r;
733*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x0i;
734*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
735*15dc779aSAndroid Build Coastguard Worker 
736*15dc779aSAndroid Build Coastguard Worker         *data = x2r;
737*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x2i;
738*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
739*15dc779aSAndroid Build Coastguard Worker 
740*15dc779aSAndroid Build Coastguard Worker         *data = x1r;
741*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x1i;
742*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
743*15dc779aSAndroid Build Coastguard Worker 
744*15dc779aSAndroid Build Coastguard Worker         *data = x3i;
745*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x3r;
746*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
747*15dc779aSAndroid Build Coastguard Worker       }
748*15dc779aSAndroid Build Coastguard Worker       data -= 2 * npoints;
749*15dc779aSAndroid Build Coastguard Worker       data += 2;
750*15dc779aSAndroid Build Coastguard Worker     }
751*15dc779aSAndroid Build Coastguard Worker     for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
752*15dc779aSAndroid Build Coastguard Worker       W1 = *(twiddles + j);
753*15dc779aSAndroid Build Coastguard Worker       W4 = *(twiddles + j + 257);
754*15dc779aSAndroid Build Coastguard Worker       W2 = *(twiddles + ((SIZE_T)j << 1));
755*15dc779aSAndroid Build Coastguard Worker       W5 = *(twiddles + ((SIZE_T)j << 1) + 257);
756*15dc779aSAndroid Build Coastguard Worker       W3 = *(twiddles + j + ((SIZE_T)j << 1) - 256);
757*15dc779aSAndroid Build Coastguard Worker       W6 = *(twiddles + j + ((SIZE_T)j << 1) + 1);
758*15dc779aSAndroid Build Coastguard Worker 
759*15dc779aSAndroid Build Coastguard Worker       for (k = in_loop_cnt; k != 0; k--) {
760*15dc779aSAndroid Build Coastguard Worker         FLOAT32 tmp;
761*15dc779aSAndroid Build Coastguard Worker         FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
762*15dc779aSAndroid Build Coastguard Worker 
763*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
764*15dc779aSAndroid Build Coastguard Worker 
765*15dc779aSAndroid Build Coastguard Worker         x1r = *data;
766*15dc779aSAndroid Build Coastguard Worker         x1i = *(data + 1);
767*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
768*15dc779aSAndroid Build Coastguard Worker 
769*15dc779aSAndroid Build Coastguard Worker         x2r = *data;
770*15dc779aSAndroid Build Coastguard Worker         x2i = *(data + 1);
771*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
772*15dc779aSAndroid Build Coastguard Worker 
773*15dc779aSAndroid Build Coastguard Worker         x3r = *data;
774*15dc779aSAndroid Build Coastguard Worker         x3i = *(data + 1);
775*15dc779aSAndroid Build Coastguard Worker         data -= 3 * ((SIZE_T)del << 1);
776*15dc779aSAndroid Build Coastguard Worker 
777*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
778*15dc779aSAndroid Build Coastguard Worker         x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
779*15dc779aSAndroid Build Coastguard Worker         x1r = tmp;
780*15dc779aSAndroid Build Coastguard Worker 
781*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x2r * W2) + ((FLOAT32)x2i * W5));
782*15dc779aSAndroid Build Coastguard Worker         x2i = (FLOAT32)(-((FLOAT32)x2r * W5) + (FLOAT32)x2i * W2);
783*15dc779aSAndroid Build Coastguard Worker         x2r = tmp;
784*15dc779aSAndroid Build Coastguard Worker 
785*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x3r * W6) - ((FLOAT32)x3i * W3));
786*15dc779aSAndroid Build Coastguard Worker         x3i = (FLOAT32)(((FLOAT32)x3r * W3) + ((FLOAT32)x3i * W6));
787*15dc779aSAndroid Build Coastguard Worker         x3r = tmp;
788*15dc779aSAndroid Build Coastguard Worker 
789*15dc779aSAndroid Build Coastguard Worker         x0r = (*data);
790*15dc779aSAndroid Build Coastguard Worker         x0i = (*(data + 1));
791*15dc779aSAndroid Build Coastguard Worker 
792*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + (x2r);
793*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + (x2i);
794*15dc779aSAndroid Build Coastguard Worker         x2r = x0r - (x2r * 2);
795*15dc779aSAndroid Build Coastguard Worker         x2i = x0i - (x2i * 2);
796*15dc779aSAndroid Build Coastguard Worker         x1r = x1r + x3r;
797*15dc779aSAndroid Build Coastguard Worker         x1i = x1i + x3i;
798*15dc779aSAndroid Build Coastguard Worker         x3r = x1r - (x3r * 2);
799*15dc779aSAndroid Build Coastguard Worker         x3i = x1i - (x3i * 2);
800*15dc779aSAndroid Build Coastguard Worker 
801*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + (x1r);
802*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + (x1i);
803*15dc779aSAndroid Build Coastguard Worker         x1r = x0r - (x1r * 2);
804*15dc779aSAndroid Build Coastguard Worker         x1i = x0i - (x1i * 2);
805*15dc779aSAndroid Build Coastguard Worker         x2r = x2r - (x3i);
806*15dc779aSAndroid Build Coastguard Worker         x2i = x2i + (x3r);
807*15dc779aSAndroid Build Coastguard Worker         x3i = x2r + (x3i * 2);
808*15dc779aSAndroid Build Coastguard Worker         x3r = x2i - (x3r * 2);
809*15dc779aSAndroid Build Coastguard Worker 
810*15dc779aSAndroid Build Coastguard Worker         *data = x0r;
811*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x0i;
812*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
813*15dc779aSAndroid Build Coastguard Worker 
814*15dc779aSAndroid Build Coastguard Worker         *data = x2r;
815*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x2i;
816*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
817*15dc779aSAndroid Build Coastguard Worker 
818*15dc779aSAndroid Build Coastguard Worker         *data = x1r;
819*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x1i;
820*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
821*15dc779aSAndroid Build Coastguard Worker 
822*15dc779aSAndroid Build Coastguard Worker         *data = x3i;
823*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x3r;
824*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
825*15dc779aSAndroid Build Coastguard Worker       }
826*15dc779aSAndroid Build Coastguard Worker       data -= 2 * npoints;
827*15dc779aSAndroid Build Coastguard Worker       data += 2;
828*15dc779aSAndroid Build Coastguard Worker     }
829*15dc779aSAndroid Build Coastguard Worker     for (; j <= sec_loop_cnt * 2; j += nodespacing) {
830*15dc779aSAndroid Build Coastguard Worker       W1 = *(twiddles + j);
831*15dc779aSAndroid Build Coastguard Worker       W4 = *(twiddles + j + 257);
832*15dc779aSAndroid Build Coastguard Worker       W2 = *(twiddles + ((SIZE_T)j << 1) - 256);
833*15dc779aSAndroid Build Coastguard Worker       W5 = *(twiddles + ((SIZE_T)j << 1) + 1);
834*15dc779aSAndroid Build Coastguard Worker       W3 = *(twiddles + j + ((SIZE_T)j << 1) - 256);
835*15dc779aSAndroid Build Coastguard Worker       W6 = *(twiddles + j + ((SIZE_T)j << 1) + 1);
836*15dc779aSAndroid Build Coastguard Worker 
837*15dc779aSAndroid Build Coastguard Worker       for (k = in_loop_cnt; k != 0; k--) {
838*15dc779aSAndroid Build Coastguard Worker         FLOAT32 tmp;
839*15dc779aSAndroid Build Coastguard Worker         FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
840*15dc779aSAndroid Build Coastguard Worker 
841*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
842*15dc779aSAndroid Build Coastguard Worker 
843*15dc779aSAndroid Build Coastguard Worker         x1r = *data;
844*15dc779aSAndroid Build Coastguard Worker         x1i = *(data + 1);
845*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
846*15dc779aSAndroid Build Coastguard Worker 
847*15dc779aSAndroid Build Coastguard Worker         x2r = *data;
848*15dc779aSAndroid Build Coastguard Worker         x2i = *(data + 1);
849*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
850*15dc779aSAndroid Build Coastguard Worker 
851*15dc779aSAndroid Build Coastguard Worker         x3r = *data;
852*15dc779aSAndroid Build Coastguard Worker         x3i = *(data + 1);
853*15dc779aSAndroid Build Coastguard Worker         data -= 3 * ((SIZE_T)del << 1);
854*15dc779aSAndroid Build Coastguard Worker 
855*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
856*15dc779aSAndroid Build Coastguard Worker         x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
857*15dc779aSAndroid Build Coastguard Worker         x1r = tmp;
858*15dc779aSAndroid Build Coastguard Worker 
859*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x2r * W5) - ((FLOAT32)x2i * W2));
860*15dc779aSAndroid Build Coastguard Worker         x2i = (FLOAT32)(((FLOAT32)x2r * W2) + ((FLOAT32)x2i * W5));
861*15dc779aSAndroid Build Coastguard Worker         x2r = tmp;
862*15dc779aSAndroid Build Coastguard Worker 
863*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x3r * W6) - ((FLOAT32)x3i * W3));
864*15dc779aSAndroid Build Coastguard Worker         x3i = (FLOAT32)(((FLOAT32)x3r * W3) + ((FLOAT32)x3i * W6));
865*15dc779aSAndroid Build Coastguard Worker         x3r = tmp;
866*15dc779aSAndroid Build Coastguard Worker 
867*15dc779aSAndroid Build Coastguard Worker         x0r = (*data);
868*15dc779aSAndroid Build Coastguard Worker         x0i = (*(data + 1));
869*15dc779aSAndroid Build Coastguard Worker 
870*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + (x2r);
871*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + (x2i);
872*15dc779aSAndroid Build Coastguard Worker         x2r = x0r - (x2r * 2);
873*15dc779aSAndroid Build Coastguard Worker         x2i = x0i - (x2i * 2);
874*15dc779aSAndroid Build Coastguard Worker         x1r = x1r + x3r;
875*15dc779aSAndroid Build Coastguard Worker         x1i = x1i + x3i;
876*15dc779aSAndroid Build Coastguard Worker         x3r = x1r - (x3r * 2);
877*15dc779aSAndroid Build Coastguard Worker         x3i = x1i - (x3i * 2);
878*15dc779aSAndroid Build Coastguard Worker 
879*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + (x1r);
880*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + (x1i);
881*15dc779aSAndroid Build Coastguard Worker         x1r = x0r - (x1r * 2);
882*15dc779aSAndroid Build Coastguard Worker         x1i = x0i - (x1i * 2);
883*15dc779aSAndroid Build Coastguard Worker         x2r = x2r - (x3i);
884*15dc779aSAndroid Build Coastguard Worker         x2i = x2i + (x3r);
885*15dc779aSAndroid Build Coastguard Worker         x3i = x2r + (x3i * 2);
886*15dc779aSAndroid Build Coastguard Worker         x3r = x2i - (x3r * 2);
887*15dc779aSAndroid Build Coastguard Worker 
888*15dc779aSAndroid Build Coastguard Worker         *data = x0r;
889*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x0i;
890*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
891*15dc779aSAndroid Build Coastguard Worker 
892*15dc779aSAndroid Build Coastguard Worker         *data = x2r;
893*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x2i;
894*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
895*15dc779aSAndroid Build Coastguard Worker 
896*15dc779aSAndroid Build Coastguard Worker         *data = x1r;
897*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x1i;
898*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
899*15dc779aSAndroid Build Coastguard Worker 
900*15dc779aSAndroid Build Coastguard Worker         *data = x3i;
901*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x3r;
902*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
903*15dc779aSAndroid Build Coastguard Worker       }
904*15dc779aSAndroid Build Coastguard Worker       data -= 2 * npoints;
905*15dc779aSAndroid Build Coastguard Worker       data += 2;
906*15dc779aSAndroid Build Coastguard Worker     }
907*15dc779aSAndroid Build Coastguard Worker     for (; j < nodespacing * del; j += nodespacing) {
908*15dc779aSAndroid Build Coastguard Worker       W1 = *(twiddles + j);
909*15dc779aSAndroid Build Coastguard Worker       W4 = *(twiddles + j + 257);
910*15dc779aSAndroid Build Coastguard Worker       W2 = *(twiddles + ((SIZE_T)j << 1) - 256);
911*15dc779aSAndroid Build Coastguard Worker       W5 = *(twiddles + ((SIZE_T)j << 1) + 1);
912*15dc779aSAndroid Build Coastguard Worker       W3 = *(twiddles + j + ((SIZE_T)j << 1) - 512);
913*15dc779aSAndroid Build Coastguard Worker       W6 = *(twiddles + j + ((SIZE_T)j << 1) - 512 + 257);
914*15dc779aSAndroid Build Coastguard Worker 
915*15dc779aSAndroid Build Coastguard Worker       for (k = in_loop_cnt; k != 0; k--) {
916*15dc779aSAndroid Build Coastguard Worker         FLOAT32 tmp;
917*15dc779aSAndroid Build Coastguard Worker         FLOAT32 x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
918*15dc779aSAndroid Build Coastguard Worker 
919*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
920*15dc779aSAndroid Build Coastguard Worker 
921*15dc779aSAndroid Build Coastguard Worker         x1r = *data;
922*15dc779aSAndroid Build Coastguard Worker         x1i = *(data + 1);
923*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
924*15dc779aSAndroid Build Coastguard Worker 
925*15dc779aSAndroid Build Coastguard Worker         x2r = *data;
926*15dc779aSAndroid Build Coastguard Worker         x2i = *(data + 1);
927*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
928*15dc779aSAndroid Build Coastguard Worker 
929*15dc779aSAndroid Build Coastguard Worker         x3r = *data;
930*15dc779aSAndroid Build Coastguard Worker         x3i = *(data + 1);
931*15dc779aSAndroid Build Coastguard Worker         data -= 3 * ((SIZE_T)del << 1);
932*15dc779aSAndroid Build Coastguard Worker 
933*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
934*15dc779aSAndroid Build Coastguard Worker         x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
935*15dc779aSAndroid Build Coastguard Worker         x1r = tmp;
936*15dc779aSAndroid Build Coastguard Worker 
937*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(((FLOAT32)x2r * W5) - ((FLOAT32)x2i * W2));
938*15dc779aSAndroid Build Coastguard Worker         x2i = (FLOAT32)(((FLOAT32)x2r * W2) + ((FLOAT32)x2i * W5));
939*15dc779aSAndroid Build Coastguard Worker         x2r = tmp;
940*15dc779aSAndroid Build Coastguard Worker 
941*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(-((FLOAT32)x3r * W3) - ((FLOAT32)x3i * W6));
942*15dc779aSAndroid Build Coastguard Worker         x3i = (FLOAT32)(-((FLOAT32)x3r * W6) + (FLOAT32)x3i * W3);
943*15dc779aSAndroid Build Coastguard Worker         x3r = tmp;
944*15dc779aSAndroid Build Coastguard Worker 
945*15dc779aSAndroid Build Coastguard Worker         x0r = (*data);
946*15dc779aSAndroid Build Coastguard Worker         x0i = (*(data + 1));
947*15dc779aSAndroid Build Coastguard Worker 
948*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + (x2r);
949*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + (x2i);
950*15dc779aSAndroid Build Coastguard Worker         x2r = x0r - (x2r * 2);
951*15dc779aSAndroid Build Coastguard Worker         x2i = x0i - (x2i * 2);
952*15dc779aSAndroid Build Coastguard Worker         x1r = x1r + x3r;
953*15dc779aSAndroid Build Coastguard Worker         x1i = x1i - x3i;
954*15dc779aSAndroid Build Coastguard Worker         x3r = x1r - (x3r * 2);
955*15dc779aSAndroid Build Coastguard Worker         x3i = x1i + (x3i * 2);
956*15dc779aSAndroid Build Coastguard Worker 
957*15dc779aSAndroid Build Coastguard Worker         x0r = x0r + (x1r);
958*15dc779aSAndroid Build Coastguard Worker         x0i = x0i + (x1i);
959*15dc779aSAndroid Build Coastguard Worker         x1r = x0r - (x1r * 2);
960*15dc779aSAndroid Build Coastguard Worker         x1i = x0i - (x1i * 2);
961*15dc779aSAndroid Build Coastguard Worker         x2r = x2r - (x3i);
962*15dc779aSAndroid Build Coastguard Worker         x2i = x2i + (x3r);
963*15dc779aSAndroid Build Coastguard Worker         x3i = x2r + (x3i * 2);
964*15dc779aSAndroid Build Coastguard Worker         x3r = x2i - (x3r * 2);
965*15dc779aSAndroid Build Coastguard Worker 
966*15dc779aSAndroid Build Coastguard Worker         *data = x0r;
967*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x0i;
968*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
969*15dc779aSAndroid Build Coastguard Worker 
970*15dc779aSAndroid Build Coastguard Worker         *data = x2r;
971*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x2i;
972*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
973*15dc779aSAndroid Build Coastguard Worker 
974*15dc779aSAndroid Build Coastguard Worker         *data = x1r;
975*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x1i;
976*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
977*15dc779aSAndroid Build Coastguard Worker 
978*15dc779aSAndroid Build Coastguard Worker         *data = x3i;
979*15dc779aSAndroid Build Coastguard Worker         *(data + 1) = x3r;
980*15dc779aSAndroid Build Coastguard Worker         data += ((SIZE_T)del << 1);
981*15dc779aSAndroid Build Coastguard Worker       }
982*15dc779aSAndroid Build Coastguard Worker       data -= 2 * npoints;
983*15dc779aSAndroid Build Coastguard Worker       data += 2;
984*15dc779aSAndroid Build Coastguard Worker     }
985*15dc779aSAndroid Build Coastguard Worker     nodespacing >>= 2;
986*15dc779aSAndroid Build Coastguard Worker     del <<= 2;
987*15dc779aSAndroid Build Coastguard Worker     in_loop_cnt >>= 2;
988*15dc779aSAndroid Build Coastguard Worker   }
989*15dc779aSAndroid Build Coastguard Worker 
990*15dc779aSAndroid Build Coastguard Worker   if (not_power_4) {
991*15dc779aSAndroid Build Coastguard Worker     const FLOAT32 *twiddles = ptr_w;
992*15dc779aSAndroid Build Coastguard Worker     nodespacing <<= 1;
993*15dc779aSAndroid Build Coastguard Worker 
994*15dc779aSAndroid Build Coastguard Worker     for (j = del / 2; j != 0; j--) {
995*15dc779aSAndroid Build Coastguard Worker       FLOAT32 W1 = *twiddles;
996*15dc779aSAndroid Build Coastguard Worker       FLOAT32 W4 = *(twiddles + 257);
997*15dc779aSAndroid Build Coastguard Worker       FLOAT32 tmp;
998*15dc779aSAndroid Build Coastguard Worker       twiddles += nodespacing;
999*15dc779aSAndroid Build Coastguard Worker 
1000*15dc779aSAndroid Build Coastguard Worker       x0r = *ptr_y;
1001*15dc779aSAndroid Build Coastguard Worker       x0i = *(ptr_y + 1);
1002*15dc779aSAndroid Build Coastguard Worker       ptr_y += ((SIZE_T)del << 1);
1003*15dc779aSAndroid Build Coastguard Worker 
1004*15dc779aSAndroid Build Coastguard Worker       x1r = *ptr_y;
1005*15dc779aSAndroid Build Coastguard Worker       x1i = *(ptr_y + 1);
1006*15dc779aSAndroid Build Coastguard Worker 
1007*15dc779aSAndroid Build Coastguard Worker       tmp = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
1008*15dc779aSAndroid Build Coastguard Worker       x1i = (FLOAT32)(-((FLOAT32)x1r * W4) + (FLOAT32)x1i * W1);
1009*15dc779aSAndroid Build Coastguard Worker       x1r = tmp;
1010*15dc779aSAndroid Build Coastguard Worker 
1011*15dc779aSAndroid Build Coastguard Worker       *ptr_y = (x0r) - (x1r);
1012*15dc779aSAndroid Build Coastguard Worker       *(ptr_y + 1) = (x0i) - (x1i);
1013*15dc779aSAndroid Build Coastguard Worker       ptr_y -= ((SIZE_T)del << 1);
1014*15dc779aSAndroid Build Coastguard Worker 
1015*15dc779aSAndroid Build Coastguard Worker       *ptr_y = (x0r) + (x1r);
1016*15dc779aSAndroid Build Coastguard Worker       *(ptr_y + 1) = (x0i) + (x1i);
1017*15dc779aSAndroid Build Coastguard Worker       ptr_y += 2;
1018*15dc779aSAndroid Build Coastguard Worker     }
1019*15dc779aSAndroid Build Coastguard Worker     twiddles = ptr_w;
1020*15dc779aSAndroid Build Coastguard Worker     for (j = del / 2; j != 0; j--) {
1021*15dc779aSAndroid Build Coastguard Worker       FLOAT32 W1 = *twiddles;
1022*15dc779aSAndroid Build Coastguard Worker       FLOAT32 W4 = *(twiddles + 257);
1023*15dc779aSAndroid Build Coastguard Worker       FLOAT32 tmp;
1024*15dc779aSAndroid Build Coastguard Worker       twiddles += nodespacing;
1025*15dc779aSAndroid Build Coastguard Worker 
1026*15dc779aSAndroid Build Coastguard Worker       x0r = *ptr_y;
1027*15dc779aSAndroid Build Coastguard Worker       x0i = *(ptr_y + 1);
1028*15dc779aSAndroid Build Coastguard Worker       ptr_y += ((SIZE_T)del << 1);
1029*15dc779aSAndroid Build Coastguard Worker 
1030*15dc779aSAndroid Build Coastguard Worker       x1r = *ptr_y;
1031*15dc779aSAndroid Build Coastguard Worker       x1i = *(ptr_y + 1);
1032*15dc779aSAndroid Build Coastguard Worker 
1033*15dc779aSAndroid Build Coastguard Worker       tmp = (FLOAT32)(((FLOAT32)x1r * W4) - ((FLOAT32)x1i * W1));
1034*15dc779aSAndroid Build Coastguard Worker       x1i = (FLOAT32)(((FLOAT32)x1r * W1) + ((FLOAT32)x1i * W4));
1035*15dc779aSAndroid Build Coastguard Worker       x1r = tmp;
1036*15dc779aSAndroid Build Coastguard Worker 
1037*15dc779aSAndroid Build Coastguard Worker       *ptr_y = (x0r) - (x1r);
1038*15dc779aSAndroid Build Coastguard Worker       *(ptr_y + 1) = (x0i) - (x1i);
1039*15dc779aSAndroid Build Coastguard Worker       ptr_y -= ((SIZE_T)del << 1);
1040*15dc779aSAndroid Build Coastguard Worker 
1041*15dc779aSAndroid Build Coastguard Worker       *ptr_y = (x0r) + (x1r);
1042*15dc779aSAndroid Build Coastguard Worker       *(ptr_y + 1) = (x0i) + (x1i);
1043*15dc779aSAndroid Build Coastguard Worker       ptr_y += 2;
1044*15dc779aSAndroid Build Coastguard Worker     }
1045*15dc779aSAndroid Build Coastguard Worker   }
1046*15dc779aSAndroid Build Coastguard Worker }
1047*15dc779aSAndroid Build Coastguard Worker 
ixheaac_aac_ld_dec_fft_3_float(FLOAT32 * inp,FLOAT32 * op)1048*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE void ixheaac_aac_ld_dec_fft_3_float(FLOAT32 *inp, FLOAT32 *op) {
1049*15dc779aSAndroid Build Coastguard Worker   FLOAT32 add_r, sub_r;
1050*15dc779aSAndroid Build Coastguard Worker   FLOAT32 add_i, sub_i;
1051*15dc779aSAndroid Build Coastguard Worker   FLOAT32 temp_real, temp_imag, temp;
1052*15dc779aSAndroid Build Coastguard Worker 
1053*15dc779aSAndroid Build Coastguard Worker   FLOAT32 p1, p2, p3, p4;
1054*15dc779aSAndroid Build Coastguard Worker 
1055*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sinmu;
1056*15dc779aSAndroid Build Coastguard Worker   sinmu = -0.866025403784439f;
1057*15dc779aSAndroid Build Coastguard Worker 
1058*15dc779aSAndroid Build Coastguard Worker   temp_real = inp[0] + inp[2];
1059*15dc779aSAndroid Build Coastguard Worker   temp_imag = inp[1] + inp[3];
1060*15dc779aSAndroid Build Coastguard Worker 
1061*15dc779aSAndroid Build Coastguard Worker   add_r = inp[2] + inp[4];
1062*15dc779aSAndroid Build Coastguard Worker   add_i = inp[3] + inp[5];
1063*15dc779aSAndroid Build Coastguard Worker 
1064*15dc779aSAndroid Build Coastguard Worker   sub_r = inp[2] - inp[4];
1065*15dc779aSAndroid Build Coastguard Worker   sub_i = inp[3] - inp[5];
1066*15dc779aSAndroid Build Coastguard Worker 
1067*15dc779aSAndroid Build Coastguard Worker   p1 = add_r / 2.0f;
1068*15dc779aSAndroid Build Coastguard Worker   p4 = add_i / 2.0f;
1069*15dc779aSAndroid Build Coastguard Worker   p2 = sub_i * sinmu;
1070*15dc779aSAndroid Build Coastguard Worker   p3 = sub_r * sinmu;
1071*15dc779aSAndroid Build Coastguard Worker 
1072*15dc779aSAndroid Build Coastguard Worker   temp = inp[0] - p1;
1073*15dc779aSAndroid Build Coastguard Worker 
1074*15dc779aSAndroid Build Coastguard Worker   op[0] = temp_real + inp[4];
1075*15dc779aSAndroid Build Coastguard Worker   op[1] = temp_imag + inp[5];
1076*15dc779aSAndroid Build Coastguard Worker   op[2] = temp + p2;
1077*15dc779aSAndroid Build Coastguard Worker   op[3] = (inp[1] - p3) - p4;
1078*15dc779aSAndroid Build Coastguard Worker   op[4] = temp - p2;
1079*15dc779aSAndroid Build Coastguard Worker   op[5] = (inp[1] + p3) - p4;
1080*15dc779aSAndroid Build Coastguard Worker 
1081*15dc779aSAndroid Build Coastguard Worker   return;
1082*15dc779aSAndroid Build Coastguard Worker }
1083*15dc779aSAndroid Build Coastguard Worker 
ixheaac_real_synth_fft_p3(FLOAT32 * x_in,FLOAT32 * x_out,WORD32 npoints)1084*15dc779aSAndroid Build Coastguard Worker void ixheaac_real_synth_fft_p3(FLOAT32 *x_in, FLOAT32 *x_out, WORD32 npoints) {
1085*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j;
1086*15dc779aSAndroid Build Coastguard Worker   FLOAT32 x_3[8];
1087*15dc779aSAndroid Build Coastguard Worker   FLOAT32 y_3[16];
1088*15dc779aSAndroid Build Coastguard Worker   FLOAT32 y[48];
1089*15dc779aSAndroid Build Coastguard Worker   FLOAT32 x[48];
1090*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_y = y;
1091*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *y_p3 = y;
1092*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *x_p3 = x;
1093*15dc779aSAndroid Build Coastguard Worker 
1094*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 3; i += 1) {
1095*15dc779aSAndroid Build Coastguard Worker     for (j = 0; j < (npoints / 3); j++) {
1096*15dc779aSAndroid Build Coastguard Worker       x_3[j] = x_in[3 * j + i];
1097*15dc779aSAndroid Build Coastguard Worker     }
1098*15dc779aSAndroid Build Coastguard Worker 
1099*15dc779aSAndroid Build Coastguard Worker     ixheaac_real_synth_fft_p2(x_3, y_3, 8);
1100*15dc779aSAndroid Build Coastguard Worker 
1101*15dc779aSAndroid Build Coastguard Worker     for (j = 0; j < 16; j += 2) {
1102*15dc779aSAndroid Build Coastguard Worker       x[3 * j + 2 * i] = y_3[j];
1103*15dc779aSAndroid Build Coastguard Worker       x[3 * j + 2 * i + 1] = y_3[j + 1];
1104*15dc779aSAndroid Build Coastguard Worker     }
1105*15dc779aSAndroid Build Coastguard Worker   }
1106*15dc779aSAndroid Build Coastguard Worker 
1107*15dc779aSAndroid Build Coastguard Worker   {
1108*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *wr;
1109*15dc779aSAndroid Build Coastguard Worker     FLOAT32 tmp;
1110*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *x_tw = x;
1111*15dc779aSAndroid Build Coastguard Worker     wr = (FLOAT32 *)ixheaac_twidle_tbl_24;
1112*15dc779aSAndroid Build Coastguard Worker     x_tw += 2;
1113*15dc779aSAndroid Build Coastguard Worker 
1114*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < (npoints / 3); i++) {
1115*15dc779aSAndroid Build Coastguard Worker       tmp = ((*x_tw) * (*wr) + (*(x_tw + 1)) * (*(wr + 1)));
1116*15dc779aSAndroid Build Coastguard Worker       *(x_tw + 1) = (-(*x_tw) * (*(wr + 1)) + (*(x_tw + 1)) * (*wr));
1117*15dc779aSAndroid Build Coastguard Worker       *x_tw = tmp;
1118*15dc779aSAndroid Build Coastguard Worker 
1119*15dc779aSAndroid Build Coastguard Worker       wr += 2;
1120*15dc779aSAndroid Build Coastguard Worker       x_tw += 2;
1121*15dc779aSAndroid Build Coastguard Worker 
1122*15dc779aSAndroid Build Coastguard Worker       tmp = ((*x_tw) * (*wr) + (*(x_tw + 1)) * (*(wr + 1)));
1123*15dc779aSAndroid Build Coastguard Worker       *(x_tw + 1) = (-(*x_tw) * (*(wr + 1)) + (*(x_tw + 1)) * (*wr));
1124*15dc779aSAndroid Build Coastguard Worker       *x_tw = tmp;
1125*15dc779aSAndroid Build Coastguard Worker 
1126*15dc779aSAndroid Build Coastguard Worker       wr += 2;
1127*15dc779aSAndroid Build Coastguard Worker       x_tw += 4;
1128*15dc779aSAndroid Build Coastguard Worker     }
1129*15dc779aSAndroid Build Coastguard Worker   }
1130*15dc779aSAndroid Build Coastguard Worker 
1131*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < (npoints / 3); i++) {
1132*15dc779aSAndroid Build Coastguard Worker     ixheaac_aac_ld_dec_fft_3_float(x_p3, y_p3);
1133*15dc779aSAndroid Build Coastguard Worker 
1134*15dc779aSAndroid Build Coastguard Worker     x_p3 = x_p3 + 6;
1135*15dc779aSAndroid Build Coastguard Worker     y_p3 = y_p3 + 6;
1136*15dc779aSAndroid Build Coastguard Worker   }
1137*15dc779aSAndroid Build Coastguard Worker 
1138*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 16; i += 2) {
1139*15dc779aSAndroid Build Coastguard Worker     x_out[i] = *ptr_y++;
1140*15dc779aSAndroid Build Coastguard Worker     x_out[i + 1] = *ptr_y++;
1141*15dc779aSAndroid Build Coastguard Worker     x_out[16 + i] = *ptr_y++;
1142*15dc779aSAndroid Build Coastguard Worker     x_out[16 + i + 1] = *ptr_y++;
1143*15dc779aSAndroid Build Coastguard Worker     x_out[32 + i] = *ptr_y++;
1144*15dc779aSAndroid Build Coastguard Worker     x_out[32 + i + 1] = *ptr_y++;
1145*15dc779aSAndroid Build Coastguard Worker   }
1146*15dc779aSAndroid Build Coastguard Worker }
1147*15dc779aSAndroid Build Coastguard Worker 
ixheaac_cmplx_anal_fft_p3(FLOAT32 * x_in,FLOAT32 * x_out,WORD32 npoints)1148*15dc779aSAndroid Build Coastguard Worker void ixheaac_cmplx_anal_fft_p3(FLOAT32 *x_in, FLOAT32 *x_out, WORD32 npoints) {
1149*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j;
1150*15dc779aSAndroid Build Coastguard Worker   FLOAT32 x_3[32];
1151*15dc779aSAndroid Build Coastguard Worker   FLOAT32 y_3[32];
1152*15dc779aSAndroid Build Coastguard Worker   FLOAT32 y[96];
1153*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_x = x_in;
1154*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_y = y;
1155*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *y_p3 = y;
1156*15dc779aSAndroid Build Coastguard Worker 
1157*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 6; i += 2) {
1158*15dc779aSAndroid Build Coastguard Worker     for (j = 0; j < 32; j += 2) {
1159*15dc779aSAndroid Build Coastguard Worker       x_3[j] = x_in[3 * j + i];
1160*15dc779aSAndroid Build Coastguard Worker       x_3[j + 1] = x_in[3 * j + i + 1];
1161*15dc779aSAndroid Build Coastguard Worker     }
1162*15dc779aSAndroid Build Coastguard Worker 
1163*15dc779aSAndroid Build Coastguard Worker     ixheaac_cmplx_anal_fft_p2(x_3, y_3, 16);
1164*15dc779aSAndroid Build Coastguard Worker 
1165*15dc779aSAndroid Build Coastguard Worker     for (j = 0; j < 32; j += 2) {
1166*15dc779aSAndroid Build Coastguard Worker       x_in[3 * j + i] = y_3[j];
1167*15dc779aSAndroid Build Coastguard Worker       x_in[3 * j + i + 1] = y_3[j + 1];
1168*15dc779aSAndroid Build Coastguard Worker     }
1169*15dc779aSAndroid Build Coastguard Worker   }
1170*15dc779aSAndroid Build Coastguard Worker 
1171*15dc779aSAndroid Build Coastguard Worker   {
1172*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *wr;
1173*15dc779aSAndroid Build Coastguard Worker     FLOAT32 tmp;
1174*15dc779aSAndroid Build Coastguard Worker     wr = (FLOAT32 *)ixheaac_twidle_tbl_48;
1175*15dc779aSAndroid Build Coastguard Worker     x_in += 2;
1176*15dc779aSAndroid Build Coastguard Worker 
1177*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < (npoints / 3); i++) {
1178*15dc779aSAndroid Build Coastguard Worker       tmp = ((*x_in) * (*wr) + (*(x_in + 1)) * (*(wr + 1)));
1179*15dc779aSAndroid Build Coastguard Worker       *(x_in + 1) = (-(*x_in) * (*(wr + 1)) + (*(x_in + 1)) * (*wr));
1180*15dc779aSAndroid Build Coastguard Worker       *x_in = tmp;
1181*15dc779aSAndroid Build Coastguard Worker 
1182*15dc779aSAndroid Build Coastguard Worker       wr += 2;
1183*15dc779aSAndroid Build Coastguard Worker       x_in += 2;
1184*15dc779aSAndroid Build Coastguard Worker 
1185*15dc779aSAndroid Build Coastguard Worker       tmp = ((*x_in) * (*wr) + (*(x_in + 1)) * (*(wr + 1)));
1186*15dc779aSAndroid Build Coastguard Worker       *(x_in + 1) = (-(*x_in) * (*(wr + 1)) + (*(x_in + 1)) * (*wr));
1187*15dc779aSAndroid Build Coastguard Worker       *x_in = tmp;
1188*15dc779aSAndroid Build Coastguard Worker 
1189*15dc779aSAndroid Build Coastguard Worker       wr += 2;
1190*15dc779aSAndroid Build Coastguard Worker       x_in += 4;
1191*15dc779aSAndroid Build Coastguard Worker     }
1192*15dc779aSAndroid Build Coastguard Worker   }
1193*15dc779aSAndroid Build Coastguard Worker 
1194*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < (npoints / 3); i++) {
1195*15dc779aSAndroid Build Coastguard Worker     ixheaac_aac_ld_dec_fft_3_float(ptr_x, ptr_y);
1196*15dc779aSAndroid Build Coastguard Worker 
1197*15dc779aSAndroid Build Coastguard Worker     ptr_x = ptr_x + 6;
1198*15dc779aSAndroid Build Coastguard Worker     ptr_y = ptr_y + 6;
1199*15dc779aSAndroid Build Coastguard Worker   }
1200*15dc779aSAndroid Build Coastguard Worker 
1201*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 32; i += 2) {
1202*15dc779aSAndroid Build Coastguard Worker     x_out[i] = *y_p3++;
1203*15dc779aSAndroid Build Coastguard Worker     x_out[i + 1] = *y_p3++;
1204*15dc779aSAndroid Build Coastguard Worker     x_out[32 + i] = *y_p3++;
1205*15dc779aSAndroid Build Coastguard Worker     x_out[32 + i + 1] = *y_p3++;
1206*15dc779aSAndroid Build Coastguard Worker     x_out[64 + i] = *y_p3++;
1207*15dc779aSAndroid Build Coastguard Worker     x_out[64 + i + 1] = *y_p3++;
1208*15dc779aSAndroid Build Coastguard Worker   }
1209*15dc779aSAndroid Build Coastguard Worker }
1210