xref: /aosp_15_r20/external/libxaac/encoder/ixheaace_fft.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 
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 "ixheaace_psy_const.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns_params.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_rom.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_fft.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
36*15dc779aSAndroid Build Coastguard Worker #include "iusace_basic_ops_flt.h"
37*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_shift_mdct_delay_buffer(FLOAT32 * ptr_mdct_delay_buffer,const FLOAT32 * ptr_time_signal,WORD32 ch_increment,WORD32 long_frame_len)38*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_shift_mdct_delay_buffer(FLOAT32 *ptr_mdct_delay_buffer,
39*15dc779aSAndroid Build Coastguard Worker                                                       const FLOAT32 *ptr_time_signal,
40*15dc779aSAndroid Build Coastguard Worker                                                       WORD32 ch_increment,
41*15dc779aSAndroid Build Coastguard Worker                                                       WORD32 long_frame_len) {
42*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
43*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_mdct_buff = ptr_mdct_delay_buffer;
44*15dc779aSAndroid Build Coastguard Worker   if (ch_increment == 2) {
45*15dc779aSAndroid Build Coastguard Worker     const FLOAT32 *ptr_input = ptr_time_signal;
46*15dc779aSAndroid Build Coastguard Worker     FLOAT32 temp1, temp2, temp3, temp4;
47*15dc779aSAndroid Build Coastguard Worker     temp1 = *ptr_input++;
48*15dc779aSAndroid Build Coastguard Worker     ptr_input++;
49*15dc779aSAndroid Build Coastguard Worker     temp2 = *ptr_input++;
50*15dc779aSAndroid Build Coastguard Worker     ptr_input++;
51*15dc779aSAndroid Build Coastguard Worker     temp3 = *ptr_input++;
52*15dc779aSAndroid Build Coastguard Worker     ptr_input++;
53*15dc779aSAndroid Build Coastguard Worker     for (i = ((long_frame_len >> 2) - 2); i >= 0; i--) {
54*15dc779aSAndroid Build Coastguard Worker       *ptr_mdct_buff++ = temp1;
55*15dc779aSAndroid Build Coastguard Worker       temp4 = *ptr_input++;
56*15dc779aSAndroid Build Coastguard Worker       ptr_input++;
57*15dc779aSAndroid Build Coastguard Worker 
58*15dc779aSAndroid Build Coastguard Worker       *ptr_mdct_buff++ = temp2;
59*15dc779aSAndroid Build Coastguard Worker       *ptr_mdct_buff++ = temp3;
60*15dc779aSAndroid Build Coastguard Worker       *ptr_mdct_buff++ = temp4;
61*15dc779aSAndroid Build Coastguard Worker 
62*15dc779aSAndroid Build Coastguard Worker       temp1 = *ptr_input++;
63*15dc779aSAndroid Build Coastguard Worker       ptr_input++;
64*15dc779aSAndroid Build Coastguard Worker       temp2 = *ptr_input++;
65*15dc779aSAndroid Build Coastguard Worker       ptr_input++;
66*15dc779aSAndroid Build Coastguard Worker       temp3 = *ptr_input++;
67*15dc779aSAndroid Build Coastguard Worker       ptr_input++;
68*15dc779aSAndroid Build Coastguard Worker     }
69*15dc779aSAndroid Build Coastguard Worker     *ptr_mdct_buff++ = temp1;
70*15dc779aSAndroid Build Coastguard Worker     temp4 = *ptr_input;
71*15dc779aSAndroid Build Coastguard Worker     *ptr_mdct_buff++ = temp2;
72*15dc779aSAndroid Build Coastguard Worker     *ptr_mdct_buff++ = temp3;
73*15dc779aSAndroid Build Coastguard Worker     *ptr_mdct_buff++ = temp4;
74*15dc779aSAndroid Build Coastguard Worker   } else {
75*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < long_frame_len; i += 2) {
76*15dc779aSAndroid Build Coastguard Worker       *ptr_mdct_buff++ = ptr_time_signal[i * ch_increment];
77*15dc779aSAndroid Build Coastguard Worker       *ptr_mdct_buff++ = ptr_time_signal[(i + 1) * ch_increment];
78*15dc779aSAndroid Build Coastguard Worker     }
79*15dc779aSAndroid Build Coastguard Worker   }
80*15dc779aSAndroid Build Coastguard Worker }
81*15dc779aSAndroid Build Coastguard Worker 
ia_eaacp_enc_inverse_transform_512(FLOAT32 * ptr_data,FLOAT32 * ptr_win_buf,const FLOAT32 * ptr_cos_sin_tbl,WORD8 * ptr_scratch)82*15dc779aSAndroid Build Coastguard Worker static VOID ia_eaacp_enc_inverse_transform_512(FLOAT32 *ptr_data, FLOAT32 *ptr_win_buf,
83*15dc779aSAndroid Build Coastguard Worker                                                const FLOAT32 *ptr_cos_sin_tbl,
84*15dc779aSAndroid Build Coastguard Worker                                                WORD8 *ptr_scratch) {
85*15dc779aSAndroid Build Coastguard Worker   WORD32 n = FRAME_LEN_512;
86*15dc779aSAndroid Build Coastguard Worker   WORD32 n_by_2 = n >> 1;
87*15dc779aSAndroid Build Coastguard Worker 
88*15dc779aSAndroid Build Coastguard Worker   ixheaace_scratch_mem *pstr_scratch = (ixheaace_scratch_mem *)ptr_scratch;
89*15dc779aSAndroid Build Coastguard Worker 
90*15dc779aSAndroid Build Coastguard Worker   ia_eaacp_enc_pre_twiddle_aac(ptr_win_buf, ptr_data, n, ptr_cos_sin_tbl);
91*15dc779aSAndroid Build Coastguard Worker 
92*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_complex_fft(ptr_win_buf, n_by_2, pstr_scratch);
93*15dc779aSAndroid Build Coastguard Worker 
94*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_post_twiddle(ptr_data, ptr_win_buf, ptr_cos_sin_tbl, n);
95*15dc779aSAndroid Build Coastguard Worker }
96*15dc779aSAndroid Build Coastguard Worker 
ixheaace_pre_mdct(FLOAT32 * ptr_x,WORD32 m,const FLOAT32 * ptr_sine_window)97*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_pre_mdct(FLOAT32 *ptr_x, WORD32 m, const FLOAT32 *ptr_sine_window) {
98*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
99*15dc779aSAndroid Build Coastguard Worker   FLOAT32 wre, wim, re1, re2, im1, im2;
100*15dc779aSAndroid Build Coastguard Worker 
101*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < m / 4; i++) {
102*15dc779aSAndroid Build Coastguard Worker     re1 = ptr_x[2 * i];
103*15dc779aSAndroid Build Coastguard Worker     im2 = ptr_x[2 * i + 1];
104*15dc779aSAndroid Build Coastguard Worker     re2 = ptr_x[m - 2 - 2 * i];
105*15dc779aSAndroid Build Coastguard Worker     im1 = ptr_x[m - 1 - 2 * i];
106*15dc779aSAndroid Build Coastguard Worker 
107*15dc779aSAndroid Build Coastguard Worker     wim = ptr_sine_window[i * 2];
108*15dc779aSAndroid Build Coastguard Worker     wre = ptr_sine_window[m - 1 - 2 * i];
109*15dc779aSAndroid Build Coastguard Worker 
110*15dc779aSAndroid Build Coastguard Worker     ptr_x[2 * i] = im1 * wim + re1 * wre;
111*15dc779aSAndroid Build Coastguard Worker 
112*15dc779aSAndroid Build Coastguard Worker     ptr_x[2 * i + 1] = im1 * wre - re1 * wim;
113*15dc779aSAndroid Build Coastguard Worker 
114*15dc779aSAndroid Build Coastguard Worker     wim = ptr_sine_window[m - 2 - 2 * i];
115*15dc779aSAndroid Build Coastguard Worker     wre = ptr_sine_window[2 * i + 1];
116*15dc779aSAndroid Build Coastguard Worker 
117*15dc779aSAndroid Build Coastguard Worker     ptr_x[m - 2 - 2 * i] = im2 * wim + re2 * wre;
118*15dc779aSAndroid Build Coastguard Worker 
119*15dc779aSAndroid Build Coastguard Worker     ptr_x[m - 1 - 2 * i] = im2 * wre - re2 * wim;
120*15dc779aSAndroid Build Coastguard Worker   }
121*15dc779aSAndroid Build Coastguard Worker }
122*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_tranform_mac4(FLOAT32 * ptr_op,const FLOAT32 * ptr_win,FLOAT32 * ptr_buf1,FLOAT32 * ptr_buf2,FLOAT32 * ptr_buf3,FLOAT32 * ptr_buf4,UWORD32 len,WORD32 increment)123*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_tranform_mac4(FLOAT32 *ptr_op, const FLOAT32 *ptr_win,
124*15dc779aSAndroid Build Coastguard Worker                                             FLOAT32 *ptr_buf1, FLOAT32 *ptr_buf2,
125*15dc779aSAndroid Build Coastguard Worker                                             FLOAT32 *ptr_buf3, FLOAT32 *ptr_buf4, UWORD32 len,
126*15dc779aSAndroid Build Coastguard Worker                                             WORD32 increment) {
127*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
128*15dc779aSAndroid Build Coastguard Worker 
129*15dc779aSAndroid Build Coastguard Worker   if (increment > 0) {
130*15dc779aSAndroid Build Coastguard Worker     for (i = len >> 2; i > 0; i--) {
131*15dc779aSAndroid Build Coastguard Worker       *ptr_op = ((ptr_win[0] * (*ptr_buf1++)) + (ptr_win[1] * (*ptr_buf2++)));
132*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[2] * (*ptr_buf3--)));
133*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[3] * (*ptr_buf4--)));
134*15dc779aSAndroid Build Coastguard Worker       ptr_op++;
135*15dc779aSAndroid Build Coastguard Worker 
136*15dc779aSAndroid Build Coastguard Worker       *ptr_op = ((ptr_win[4] * (*ptr_buf1++)) + (ptr_win[5] * (*ptr_buf2++)));
137*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[6] * (*ptr_buf3--)));
138*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[7] * (*ptr_buf4--)));
139*15dc779aSAndroid Build Coastguard Worker       ptr_op++;
140*15dc779aSAndroid Build Coastguard Worker 
141*15dc779aSAndroid Build Coastguard Worker       *ptr_op = ((ptr_win[8] * (*ptr_buf1++)) + (ptr_win[9] * (*ptr_buf2++)));
142*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[10] * (*ptr_buf3--)));
143*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[11] * (*ptr_buf4--)));
144*15dc779aSAndroid Build Coastguard Worker       ptr_op++;
145*15dc779aSAndroid Build Coastguard Worker 
146*15dc779aSAndroid Build Coastguard Worker       *ptr_op = ((ptr_win[12] * (*ptr_buf1++)) + (ptr_win[13] * (*ptr_buf2++)));
147*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[14] * (*ptr_buf3--)));
148*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[15] * (*ptr_buf4--)));
149*15dc779aSAndroid Build Coastguard Worker       ptr_op++;
150*15dc779aSAndroid Build Coastguard Worker       ptr_win += 16;
151*15dc779aSAndroid Build Coastguard Worker     }
152*15dc779aSAndroid Build Coastguard Worker   } else {
153*15dc779aSAndroid Build Coastguard Worker     for (i = len >> 2; i > 0; i--) {
154*15dc779aSAndroid Build Coastguard Worker       *ptr_op = ((ptr_win[0] * (*ptr_buf1++)) + (ptr_win[1] * (*ptr_buf2++)));
155*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[2] * (*ptr_buf3--)));
156*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[3] * (*ptr_buf4--)));
157*15dc779aSAndroid Build Coastguard Worker       ptr_op--;
158*15dc779aSAndroid Build Coastguard Worker 
159*15dc779aSAndroid Build Coastguard Worker       *ptr_op = ((ptr_win[4] * (*ptr_buf1++)) + (ptr_win[5] * (*ptr_buf2++)));
160*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[6] * (*ptr_buf3--)));
161*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[7] * (*ptr_buf4--)));
162*15dc779aSAndroid Build Coastguard Worker       ptr_op--;
163*15dc779aSAndroid Build Coastguard Worker 
164*15dc779aSAndroid Build Coastguard Worker       *ptr_op = ((ptr_win[8] * (*ptr_buf1++)) + (ptr_win[9] * (*ptr_buf2++)));
165*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[10] * (*ptr_buf3--)));
166*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[11] * (*ptr_buf4--)));
167*15dc779aSAndroid Build Coastguard Worker       ptr_op--;
168*15dc779aSAndroid Build Coastguard Worker 
169*15dc779aSAndroid Build Coastguard Worker       *ptr_op = ((ptr_win[12] * (*ptr_buf1++)) + (ptr_win[13] * (*ptr_buf2++)));
170*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[14] * (*ptr_buf3--)));
171*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[15] * (*ptr_buf4--)));
172*15dc779aSAndroid Build Coastguard Worker       ptr_op--;
173*15dc779aSAndroid Build Coastguard Worker       ptr_win += 16;
174*15dc779aSAndroid Build Coastguard Worker     }
175*15dc779aSAndroid Build Coastguard Worker   }
176*15dc779aSAndroid Build Coastguard Worker }
177*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_tranform_mac3(FLOAT32 * ptr_op,const FLOAT32 * ptr_win,FLOAT32 * ptr_buf1,FLOAT32 * ptr_buf2,FLOAT32 * ptr_buf3,UWORD32 len,WORD32 increment)178*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_tranform_mac3(FLOAT32 *ptr_op, const FLOAT32 *ptr_win,
179*15dc779aSAndroid Build Coastguard Worker                                             FLOAT32 *ptr_buf1, FLOAT32 *ptr_buf2,
180*15dc779aSAndroid Build Coastguard Worker                                             FLOAT32 *ptr_buf3, UWORD32 len, WORD32 increment) {
181*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
182*15dc779aSAndroid Build Coastguard Worker 
183*15dc779aSAndroid Build Coastguard Worker   if (increment > 0) {
184*15dc779aSAndroid Build Coastguard Worker     for (i = len >> 2; i > 0; i--) {
185*15dc779aSAndroid Build Coastguard Worker       *ptr_op = ((ptr_win[0] * (*ptr_buf1++)) + (ptr_win[1] * (*ptr_buf2--)));
186*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[2] * (*ptr_buf3--)));
187*15dc779aSAndroid Build Coastguard Worker       ptr_op++;
188*15dc779aSAndroid Build Coastguard Worker 
189*15dc779aSAndroid Build Coastguard Worker       *ptr_op = ((ptr_win[3] * (*ptr_buf1++)) + (ptr_win[4] * (*ptr_buf2--)));
190*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[5] * (*ptr_buf3--)));
191*15dc779aSAndroid Build Coastguard Worker       ptr_op++;
192*15dc779aSAndroid Build Coastguard Worker 
193*15dc779aSAndroid Build Coastguard Worker       *ptr_op = ((ptr_win[6] * (*ptr_buf1++)) + (ptr_win[7] * (*ptr_buf2--)));
194*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[8] * (*ptr_buf3--)));
195*15dc779aSAndroid Build Coastguard Worker       ptr_op++;
196*15dc779aSAndroid Build Coastguard Worker 
197*15dc779aSAndroid Build Coastguard Worker       *ptr_op = ((ptr_win[9] * (*ptr_buf1++)) + (ptr_win[10] * (*ptr_buf2--)));
198*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[11] * (*ptr_buf3--)));
199*15dc779aSAndroid Build Coastguard Worker       ptr_op++;
200*15dc779aSAndroid Build Coastguard Worker       ptr_win += 12;
201*15dc779aSAndroid Build Coastguard Worker     }
202*15dc779aSAndroid Build Coastguard Worker   } else {
203*15dc779aSAndroid Build Coastguard Worker     for (i = len >> 2; i > 0; i--) {
204*15dc779aSAndroid Build Coastguard Worker       *ptr_op = ((ptr_win[0] * (*ptr_buf1++)) + (ptr_win[1] * (*ptr_buf2--)));
205*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[2] * (*ptr_buf3--)));
206*15dc779aSAndroid Build Coastguard Worker       ptr_op--;
207*15dc779aSAndroid Build Coastguard Worker 
208*15dc779aSAndroid Build Coastguard Worker       *ptr_op = ((ptr_win[3] * (*ptr_buf1++)) + (ptr_win[4] * (*ptr_buf2--)));
209*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[5] * (*ptr_buf3--)));
210*15dc779aSAndroid Build Coastguard Worker       ptr_op--;
211*15dc779aSAndroid Build Coastguard Worker 
212*15dc779aSAndroid Build Coastguard Worker       *ptr_op = ((ptr_win[6] * (*ptr_buf1++)) + (ptr_win[7] * (*ptr_buf2--)));
213*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[8] * (*ptr_buf3--)));
214*15dc779aSAndroid Build Coastguard Worker       ptr_op--;
215*15dc779aSAndroid Build Coastguard Worker 
216*15dc779aSAndroid Build Coastguard Worker       *ptr_op = ((ptr_win[9] * (*ptr_buf1++)) + (ptr_win[10] * (*ptr_buf2--)));
217*15dc779aSAndroid Build Coastguard Worker       *ptr_op = (*ptr_op + (ptr_win[11] * (*ptr_buf3--)));
218*15dc779aSAndroid Build Coastguard Worker       ptr_op--;
219*15dc779aSAndroid Build Coastguard Worker       ptr_win += 12;
220*15dc779aSAndroid Build Coastguard Worker     }
221*15dc779aSAndroid Build Coastguard Worker   }
222*15dc779aSAndroid Build Coastguard Worker }
223*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_transform_real(FLOAT32 * ptr_mdct_delay_buffer,const FLOAT32 * ptr_time_signal,WORD32 ch_increment,FLOAT32 * ptr_real_out,ixheaace_mdct_tables * pstr_mdct_tab,FLOAT32 * ptr_shared_buffer1,WORD8 * ptr_shared_buffer5,WORD32 long_frame_len)224*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_transform_real(FLOAT32 *ptr_mdct_delay_buffer,
225*15dc779aSAndroid Build Coastguard Worker                                       const FLOAT32 *ptr_time_signal, WORD32 ch_increment,
226*15dc779aSAndroid Build Coastguard Worker                                       FLOAT32 *ptr_real_out, ixheaace_mdct_tables *pstr_mdct_tab,
227*15dc779aSAndroid Build Coastguard Worker                                       FLOAT32 *ptr_shared_buffer1, WORD8 *ptr_shared_buffer5,
228*15dc779aSAndroid Build Coastguard Worker                                       WORD32 long_frame_len) {
229*15dc779aSAndroid Build Coastguard Worker   WORD32 n, n1;
230*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_windowed_buf = ptr_shared_buffer1;
231*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_ws1;
232*15dc779aSAndroid Build Coastguard Worker   WORD32 i, len = long_frame_len;
233*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_real_in;
234*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_data1, *ptr_data2, *ptr_data3, *ptr_data4;
235*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_op1;
236*15dc779aSAndroid Build Coastguard Worker 
237*15dc779aSAndroid Build Coastguard Worker   ptr_real_in = ptr_mdct_delay_buffer;
238*15dc779aSAndroid Build Coastguard Worker 
239*15dc779aSAndroid Build Coastguard Worker   n = long_frame_len << 1;
240*15dc779aSAndroid Build Coastguard Worker   n1 = long_frame_len >> 1;
241*15dc779aSAndroid Build Coastguard Worker 
242*15dc779aSAndroid Build Coastguard Worker   ptr_ws1 =
243*15dc779aSAndroid Build Coastguard Worker       (long_frame_len == FRAME_LEN_512) ? pstr_mdct_tab->win_512_ld : pstr_mdct_tab->win_480_ld;
244*15dc779aSAndroid Build Coastguard Worker 
245*15dc779aSAndroid Build Coastguard Worker   ptr_op1 = ptr_real_out;
246*15dc779aSAndroid Build Coastguard Worker   ptr_data1 = &ptr_real_in[n1];
247*15dc779aSAndroid Build Coastguard Worker   ptr_data2 = &ptr_real_in[n + n1];
248*15dc779aSAndroid Build Coastguard Worker   ptr_data3 = &ptr_real_in[n1 - 1];
249*15dc779aSAndroid Build Coastguard Worker   ptr_data4 = &ptr_real_in[n + n1 - 1];
250*15dc779aSAndroid Build Coastguard Worker 
251*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_tranform_mac4(ptr_op1, ptr_ws1, ptr_data1, ptr_data2, ptr_data3, ptr_data4,
252*15dc779aSAndroid Build Coastguard Worker                                   n1, 1);
253*15dc779aSAndroid Build Coastguard Worker   ptr_ws1 += ((SIZE_T)n1 << 2);
254*15dc779aSAndroid Build Coastguard Worker 
255*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < long_frame_len << 1; i++) {
256*15dc779aSAndroid Build Coastguard Worker     ptr_mdct_delay_buffer[i] = ptr_mdct_delay_buffer[long_frame_len + i];
257*15dc779aSAndroid Build Coastguard Worker   }
258*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_shift_mdct_delay_buffer(&ptr_mdct_delay_buffer[2 * long_frame_len],
259*15dc779aSAndroid Build Coastguard Worker                                             ptr_time_signal, ch_increment, long_frame_len);
260*15dc779aSAndroid Build Coastguard Worker 
261*15dc779aSAndroid Build Coastguard Worker   ptr_op1 = &ptr_real_out[long_frame_len - 1];
262*15dc779aSAndroid Build Coastguard Worker   ptr_data1 = &ptr_real_in[n + len - n1];
263*15dc779aSAndroid Build Coastguard Worker   ptr_data2 = &ptr_real_in[len - n1];
264*15dc779aSAndroid Build Coastguard Worker   ptr_data3 = &ptr_real_in[len - n1 - 1];
265*15dc779aSAndroid Build Coastguard Worker   ptr_data4 = &ptr_real_in[n + len - n1 - 1];
266*15dc779aSAndroid Build Coastguard Worker 
267*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_tranform_mac4(ptr_op1, ptr_ws1, ptr_data1, ptr_data2, ptr_data3, ptr_data4,
268*15dc779aSAndroid Build Coastguard Worker                                   (n1 >> 1), -1);
269*15dc779aSAndroid Build Coastguard Worker   ptr_op1 -= (n1 >> 1);
270*15dc779aSAndroid Build Coastguard Worker   ptr_ws1 += ((SIZE_T)n1 << 1);
271*15dc779aSAndroid Build Coastguard Worker   ptr_data2 += (n1 >> 1);
272*15dc779aSAndroid Build Coastguard Worker   ptr_data3 -= (n1 >> 1);
273*15dc779aSAndroid Build Coastguard Worker   ptr_data4 -= (n1 >> 1);
274*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_tranform_mac3(ptr_op1, ptr_ws1, ptr_data2, ptr_data3, ptr_data4, (n1 >> 1),
275*15dc779aSAndroid Build Coastguard Worker                                   -1);
276*15dc779aSAndroid Build Coastguard Worker 
277*15dc779aSAndroid Build Coastguard Worker   if (long_frame_len == FRAME_LEN_480) {
278*15dc779aSAndroid Build Coastguard Worker     ia_aac_ld_enc_mdct_480(ptr_real_out, ptr_windowed_buf, 1, pstr_mdct_tab);
279*15dc779aSAndroid Build Coastguard Worker   } else {
280*15dc779aSAndroid Build Coastguard Worker     ia_eaacp_enc_inverse_transform_512(ptr_real_out, ptr_windowed_buf,
281*15dc779aSAndroid Build Coastguard Worker                                        pstr_mdct_tab->cosine_array_1024, ptr_shared_buffer5);
282*15dc779aSAndroid Build Coastguard Worker   }
283*15dc779aSAndroid Build Coastguard Worker }
284*15dc779aSAndroid Build Coastguard Worker 
ia_eaacp_enc_pre_twiddle_compute(FLOAT32 * ptr_in1,FLOAT32 * ptr_in2,FLOAT32 * ptr_x,const FLOAT32 * ptr_cos_sin,WORD n_by_4)285*15dc779aSAndroid Build Coastguard Worker static VOID ia_eaacp_enc_pre_twiddle_compute(FLOAT32 *ptr_in1, FLOAT32 *ptr_in2, FLOAT32 *ptr_x,
286*15dc779aSAndroid Build Coastguard Worker                                              const FLOAT32 *ptr_cos_sin, WORD n_by_4) {
287*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
288*15dc779aSAndroid Build Coastguard Worker   FLOAT32 temp_r, temp_i;
289*15dc779aSAndroid Build Coastguard Worker   FLOAT32 temp_r1, temp_i1;
290*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_x1 = ptr_x + (SIZE_T)((n_by_4 << 2) - 1);
291*15dc779aSAndroid Build Coastguard Worker   FLOAT32 c, c1, s, s1;
292*15dc779aSAndroid Build Coastguard Worker 
293*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < n_by_4; i++) {
294*15dc779aSAndroid Build Coastguard Worker     c = *ptr_cos_sin++;
295*15dc779aSAndroid Build Coastguard Worker     s = *ptr_cos_sin++;
296*15dc779aSAndroid Build Coastguard Worker     s1 = *ptr_cos_sin++;
297*15dc779aSAndroid Build Coastguard Worker     c1 = *ptr_cos_sin++;
298*15dc779aSAndroid Build Coastguard Worker 
299*15dc779aSAndroid Build Coastguard Worker     temp_r = *ptr_in1++;
300*15dc779aSAndroid Build Coastguard Worker     temp_i1 = *ptr_in1++;
301*15dc779aSAndroid Build Coastguard Worker     temp_i = *ptr_in2--;
302*15dc779aSAndroid Build Coastguard Worker     temp_r1 = *ptr_in2--;
303*15dc779aSAndroid Build Coastguard Worker     *ptr_x = ((temp_r * c) + (temp_i * s));
304*15dc779aSAndroid Build Coastguard Worker     ptr_x++;
305*15dc779aSAndroid Build Coastguard Worker 
306*15dc779aSAndroid Build Coastguard Worker     *ptr_x = ((temp_i * c) - (temp_r * s));
307*15dc779aSAndroid Build Coastguard Worker     ptr_x++;
308*15dc779aSAndroid Build Coastguard Worker 
309*15dc779aSAndroid Build Coastguard Worker     *ptr_x1 = ((temp_i1 * c1) - (temp_r1 * s1));
310*15dc779aSAndroid Build Coastguard Worker     ptr_x1--;
311*15dc779aSAndroid Build Coastguard Worker 
312*15dc779aSAndroid Build Coastguard Worker     *ptr_x1 = ((temp_r1 * c1) + (temp_i1 * s1));
313*15dc779aSAndroid Build Coastguard Worker     ptr_x1--;
314*15dc779aSAndroid Build Coastguard Worker   }
315*15dc779aSAndroid Build Coastguard Worker }
316*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_post_twiddle(FLOAT32 * ptr_out,FLOAT32 * ptr_x,const FLOAT32 * ptr_cos_sin_tbl,WORD m)317*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_post_twiddle(FLOAT32 *ptr_out, FLOAT32 *ptr_x,
318*15dc779aSAndroid Build Coastguard Worker                                     const FLOAT32 *ptr_cos_sin_tbl, WORD m) {
319*15dc779aSAndroid Build Coastguard Worker   WORD i;
320*15dc779aSAndroid Build Coastguard Worker   FLOAT32 c, c1, s, s1;
321*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tmp_var;
322*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tempr, tempr1, tempi, tempi1;
323*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_out1 = ptr_out + m - 1;
324*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_x1 = ptr_x + m - 1;
325*15dc779aSAndroid Build Coastguard Worker 
326*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < (m >> 2); i++) {
327*15dc779aSAndroid Build Coastguard Worker     c = *ptr_cos_sin_tbl++;
328*15dc779aSAndroid Build Coastguard Worker     s = *ptr_cos_sin_tbl++;
329*15dc779aSAndroid Build Coastguard Worker     s1 = *ptr_cos_sin_tbl++;
330*15dc779aSAndroid Build Coastguard Worker     c1 = *ptr_cos_sin_tbl++;
331*15dc779aSAndroid Build Coastguard Worker     tempr = *ptr_x++;
332*15dc779aSAndroid Build Coastguard Worker     tempi = *ptr_x++;
333*15dc779aSAndroid Build Coastguard Worker     tempi1 = *ptr_x1--;
334*15dc779aSAndroid Build Coastguard Worker     tempr1 = *ptr_x1--;
335*15dc779aSAndroid Build Coastguard Worker 
336*15dc779aSAndroid Build Coastguard Worker     tmp_var = ((tempr * c) + (tempi * s));
337*15dc779aSAndroid Build Coastguard Worker     *ptr_out++ = tmp_var;
338*15dc779aSAndroid Build Coastguard Worker 
339*15dc779aSAndroid Build Coastguard Worker     tmp_var = ((tempr * s) - (tempi * c));
340*15dc779aSAndroid Build Coastguard Worker     *ptr_out1-- = tmp_var;
341*15dc779aSAndroid Build Coastguard Worker 
342*15dc779aSAndroid Build Coastguard Worker     tmp_var = ((tempr1 * c1) + (tempi1 * s1));
343*15dc779aSAndroid Build Coastguard Worker     *ptr_out1-- = tmp_var;
344*15dc779aSAndroid Build Coastguard Worker 
345*15dc779aSAndroid Build Coastguard Worker     tmp_var = ((tempr1 * s1) - (tempi1 * c1));
346*15dc779aSAndroid Build Coastguard Worker     *ptr_out++ = tmp_var;
347*15dc779aSAndroid Build Coastguard Worker   }
348*15dc779aSAndroid Build Coastguard Worker }
349*15dc779aSAndroid Build Coastguard Worker 
ia_eaacp_enc_pre_twiddle_aac(FLOAT32 * ptr_x,FLOAT32 * ptr_data,WORD32 n,const FLOAT32 * ptr_cos_array)350*15dc779aSAndroid Build Coastguard Worker VOID ia_eaacp_enc_pre_twiddle_aac(FLOAT32 *ptr_x, FLOAT32 *ptr_data, WORD32 n,
351*15dc779aSAndroid Build Coastguard Worker                                   const FLOAT32 *ptr_cos_array) {
352*15dc779aSAndroid Build Coastguard Worker   WORD n_by_4;
353*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_in1, *ptr_in2;
354*15dc779aSAndroid Build Coastguard Worker 
355*15dc779aSAndroid Build Coastguard Worker   n_by_4 = n >> 2;
356*15dc779aSAndroid Build Coastguard Worker 
357*15dc779aSAndroid Build Coastguard Worker   ptr_in1 = ptr_data;
358*15dc779aSAndroid Build Coastguard Worker   ptr_in2 = ptr_data + n - 1;
359*15dc779aSAndroid Build Coastguard Worker 
360*15dc779aSAndroid Build Coastguard Worker   ia_eaacp_enc_pre_twiddle_compute(ptr_in1, ptr_in2, ptr_x, ptr_cos_array, n_by_4);
361*15dc779aSAndroid Build Coastguard Worker }
362*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_calc_norm(WORD32 a)363*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD8 ia_enhaacplus_enc_calc_norm(WORD32 a) {
364*15dc779aSAndroid Build Coastguard Worker   WORD8 norm_val;
365*15dc779aSAndroid Build Coastguard Worker 
366*15dc779aSAndroid Build Coastguard Worker   if (a == 0) {
367*15dc779aSAndroid Build Coastguard Worker     norm_val = 31;
368*15dc779aSAndroid Build Coastguard Worker   } else {
369*15dc779aSAndroid Build Coastguard Worker     if (a == (WORD32)0xffffffffL) {
370*15dc779aSAndroid Build Coastguard Worker       norm_val = 31;
371*15dc779aSAndroid Build Coastguard Worker     } else {
372*15dc779aSAndroid Build Coastguard Worker       if (a < 0) {
373*15dc779aSAndroid Build Coastguard Worker         a = ~a;
374*15dc779aSAndroid Build Coastguard Worker       }
375*15dc779aSAndroid Build Coastguard Worker       for (norm_val = 0; a < (WORD32)0x40000000L; norm_val++) {
376*15dc779aSAndroid Build Coastguard Worker         a <<= 1;
377*15dc779aSAndroid Build Coastguard Worker       }
378*15dc779aSAndroid Build Coastguard Worker     }
379*15dc779aSAndroid Build Coastguard Worker   }
380*15dc779aSAndroid Build Coastguard Worker 
381*15dc779aSAndroid Build Coastguard Worker   return norm_val;
382*15dc779aSAndroid Build Coastguard Worker }
383*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_complex_3point_fft(FLOAT32 * ptr_in,FLOAT32 * ptr_out)384*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE VOID ia_enhaacplus_enc_complex_3point_fft(FLOAT32 *ptr_in,
385*15dc779aSAndroid Build Coastguard Worker                                                                  FLOAT32 *ptr_out) {
386*15dc779aSAndroid Build Coastguard Worker   FLOAT32 add_r, sub_r;
387*15dc779aSAndroid Build Coastguard Worker   FLOAT32 add_i, sub_i;
388*15dc779aSAndroid Build Coastguard Worker   FLOAT32 x_01_r, x_01_i, temp;
389*15dc779aSAndroid Build Coastguard Worker   FLOAT32 p1, p2, p3, p4;
390*15dc779aSAndroid Build Coastguard Worker   FLOAT64 sin_mu = 0.866025403784439f;
391*15dc779aSAndroid Build Coastguard Worker 
392*15dc779aSAndroid Build Coastguard Worker   x_01_r = ptr_in[0] + ptr_in[2];
393*15dc779aSAndroid Build Coastguard Worker   x_01_i = ptr_in[1] + ptr_in[3];
394*15dc779aSAndroid Build Coastguard Worker 
395*15dc779aSAndroid Build Coastguard Worker   add_r = ptr_in[2] + ptr_in[4];
396*15dc779aSAndroid Build Coastguard Worker   add_i = ptr_in[3] + ptr_in[5];
397*15dc779aSAndroid Build Coastguard Worker 
398*15dc779aSAndroid Build Coastguard Worker   sub_r = ptr_in[2] - ptr_in[4];
399*15dc779aSAndroid Build Coastguard Worker   sub_i = ptr_in[3] - ptr_in[5];
400*15dc779aSAndroid Build Coastguard Worker 
401*15dc779aSAndroid Build Coastguard Worker   p1 = add_r / (FLOAT32)2.0f;
402*15dc779aSAndroid Build Coastguard Worker   p4 = add_i / (FLOAT32)2.0f;
403*15dc779aSAndroid Build Coastguard Worker   p2 = (FLOAT32)((FLOAT64)sub_i * sin_mu);
404*15dc779aSAndroid Build Coastguard Worker   p3 = (FLOAT32)((FLOAT64)sub_r * sin_mu);
405*15dc779aSAndroid Build Coastguard Worker 
406*15dc779aSAndroid Build Coastguard Worker   temp = ptr_in[0] - p1;
407*15dc779aSAndroid Build Coastguard Worker 
408*15dc779aSAndroid Build Coastguard Worker   ptr_out[0] = x_01_r + ptr_in[4];
409*15dc779aSAndroid Build Coastguard Worker   ptr_out[1] = x_01_i + ptr_in[5];
410*15dc779aSAndroid Build Coastguard Worker   ptr_out[2] = temp + p2;
411*15dc779aSAndroid Build Coastguard Worker   ptr_out[3] = (ptr_in[1] - p3) - p4;
412*15dc779aSAndroid Build Coastguard Worker   ptr_out[4] = temp - p2;
413*15dc779aSAndroid Build Coastguard Worker   ptr_out[5] = (ptr_in[1] + p3) - p4;
414*15dc779aSAndroid Build Coastguard Worker }
415*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_complex_fft_p2(FLOAT32 * ptr_x,WORD32 nlength,FLOAT32 * ptr_scratch_fft_p2_y)416*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_complex_fft_p2(FLOAT32 *ptr_x, WORD32 nlength,
417*15dc779aSAndroid Build Coastguard Worker                                       FLOAT32 *ptr_scratch_fft_p2_y) {
418*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j, k, n_stages, h2;
419*15dc779aSAndroid Build Coastguard Worker   FLOAT32 x0_r, x0_i, x1_r, x1_i, x2_r, x2_i, x3_r, x3_i;
420*15dc779aSAndroid Build Coastguard Worker   WORD32 del, nodespacing, in_loop_cnt;
421*15dc779aSAndroid Build Coastguard Worker   WORD32 not_power_4;
422*15dc779aSAndroid Build Coastguard Worker   WORD32 dig_rev_shift;
423*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_p2_y = ptr_scratch_fft_p2_y;
424*15dc779aSAndroid Build Coastguard Worker   WORD32 mpass = nlength;
425*15dc779aSAndroid Build Coastguard Worker   WORD32 npoints = nlength;
426*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_y = ptr_p2_y;
427*15dc779aSAndroid Build Coastguard Worker   const FLOAT64 *ptr_w;
428*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_inp;
429*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tmk;
430*15dc779aSAndroid Build Coastguard Worker   const FLOAT64 *ptr_twiddles;
431*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_data;
432*15dc779aSAndroid Build Coastguard Worker   FLOAT64 w_1, w_2, w_3, w_4, w_5, w_6;
433*15dc779aSAndroid Build Coastguard Worker   WORD32 sec_loop_cnt;
434*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tmp;
435*15dc779aSAndroid Build Coastguard Worker 
436*15dc779aSAndroid Build Coastguard Worker   memset(ptr_y, 0, nlength * 2 * sizeof(*ptr_y));
437*15dc779aSAndroid Build Coastguard Worker 
438*15dc779aSAndroid Build Coastguard Worker   dig_rev_shift = ia_enhaacplus_enc_calc_norm(mpass) + 1 - 16;
439*15dc779aSAndroid Build Coastguard Worker   n_stages = 30 - ia_enhaacplus_enc_calc_norm(mpass);
440*15dc779aSAndroid Build Coastguard Worker   not_power_4 = n_stages & 1;
441*15dc779aSAndroid Build Coastguard Worker 
442*15dc779aSAndroid Build Coastguard Worker   n_stages = n_stages >> 1;
443*15dc779aSAndroid Build Coastguard Worker 
444*15dc779aSAndroid Build Coastguard Worker   ptr_w = ia_enhaacplus_enc_twiddle_table_fft_32x32;
445*15dc779aSAndroid Build Coastguard Worker 
446*15dc779aSAndroid Build Coastguard Worker   dig_rev_shift = MAX(dig_rev_shift, 0);
447*15dc779aSAndroid Build Coastguard Worker 
448*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < npoints; i += 4) {
449*15dc779aSAndroid Build Coastguard Worker     ptr_inp = ptr_x;
450*15dc779aSAndroid Build Coastguard Worker     DIG_REV_NEW(i, dig_rev_shift, h2);
451*15dc779aSAndroid Build Coastguard Worker     if (not_power_4) {
452*15dc779aSAndroid Build Coastguard Worker       h2 += 1;
453*15dc779aSAndroid Build Coastguard Worker       h2 &= ~1;
454*15dc779aSAndroid Build Coastguard Worker     }
455*15dc779aSAndroid Build Coastguard Worker     ptr_inp += (h2);
456*15dc779aSAndroid Build Coastguard Worker 
457*15dc779aSAndroid Build Coastguard Worker     x0_r = *ptr_inp;
458*15dc779aSAndroid Build Coastguard Worker     x0_i = *(ptr_inp + 1);
459*15dc779aSAndroid Build Coastguard Worker     ptr_inp += (npoints >> 1);
460*15dc779aSAndroid Build Coastguard Worker 
461*15dc779aSAndroid Build Coastguard Worker     x1_r = *ptr_inp;
462*15dc779aSAndroid Build Coastguard Worker     x1_i = *(ptr_inp + 1);
463*15dc779aSAndroid Build Coastguard Worker     ptr_inp += (npoints >> 1);
464*15dc779aSAndroid Build Coastguard Worker 
465*15dc779aSAndroid Build Coastguard Worker     x2_r = *ptr_inp;
466*15dc779aSAndroid Build Coastguard Worker     x2_i = *(ptr_inp + 1);
467*15dc779aSAndroid Build Coastguard Worker     ptr_inp += (npoints >> 1);
468*15dc779aSAndroid Build Coastguard Worker 
469*15dc779aSAndroid Build Coastguard Worker     x3_r = *ptr_inp;
470*15dc779aSAndroid Build Coastguard Worker     x3_i = *(ptr_inp + 1);
471*15dc779aSAndroid Build Coastguard Worker 
472*15dc779aSAndroid Build Coastguard Worker     x0_r = x0_r + x2_r;
473*15dc779aSAndroid Build Coastguard Worker     x0_i = x0_i + x2_i;
474*15dc779aSAndroid Build Coastguard Worker 
475*15dc779aSAndroid Build Coastguard Worker     tmk = x0_r - x2_r;
476*15dc779aSAndroid Build Coastguard Worker     x2_r = tmk - x2_r;
477*15dc779aSAndroid Build Coastguard Worker     tmk = x0_i - x2_i;
478*15dc779aSAndroid Build Coastguard Worker     x2_i = tmk - x2_i;
479*15dc779aSAndroid Build Coastguard Worker 
480*15dc779aSAndroid Build Coastguard Worker     x1_r = x1_r + x3_r;
481*15dc779aSAndroid Build Coastguard Worker     x1_i = x1_i + x3_i;
482*15dc779aSAndroid Build Coastguard Worker 
483*15dc779aSAndroid Build Coastguard Worker     tmk = x1_r - x3_r;
484*15dc779aSAndroid Build Coastguard Worker     x3_r = tmk - x3_r;
485*15dc779aSAndroid Build Coastguard Worker     tmk = x1_i - x3_i;
486*15dc779aSAndroid Build Coastguard Worker     x3_i = tmk - x3_i;
487*15dc779aSAndroid Build Coastguard Worker 
488*15dc779aSAndroid Build Coastguard Worker     x0_r = x0_r + x1_r;
489*15dc779aSAndroid Build Coastguard Worker     x0_i = x0_i + x1_i;
490*15dc779aSAndroid Build Coastguard Worker 
491*15dc779aSAndroid Build Coastguard Worker     tmk = x0_r - x1_r;
492*15dc779aSAndroid Build Coastguard Worker     x1_r = tmk - x1_r;
493*15dc779aSAndroid Build Coastguard Worker     tmk = x0_i - x1_i;
494*15dc779aSAndroid Build Coastguard Worker     x1_i = tmk - x1_i;
495*15dc779aSAndroid Build Coastguard Worker 
496*15dc779aSAndroid Build Coastguard Worker     x2_r = x2_r + x3_i;
497*15dc779aSAndroid Build Coastguard Worker     x2_i = x2_i - x3_r;
498*15dc779aSAndroid Build Coastguard Worker 
499*15dc779aSAndroid Build Coastguard Worker     tmk = x2_r - x3_i;
500*15dc779aSAndroid Build Coastguard Worker     x3_i = tmk - x3_i;
501*15dc779aSAndroid Build Coastguard Worker     tmk = x2_i + x3_r;
502*15dc779aSAndroid Build Coastguard Worker     x3_r = tmk + x3_r;
503*15dc779aSAndroid Build Coastguard Worker 
504*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x0_r;
505*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x0_i;
506*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x2_r;
507*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x2_i;
508*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x1_r;
509*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x1_i;
510*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x3_i;
511*15dc779aSAndroid Build Coastguard Worker     *ptr_y++ = x3_r;
512*15dc779aSAndroid Build Coastguard Worker   }
513*15dc779aSAndroid Build Coastguard Worker   ptr_y -= 2 * npoints;
514*15dc779aSAndroid Build Coastguard Worker   del = 4;
515*15dc779aSAndroid Build Coastguard Worker   nodespacing = 64;
516*15dc779aSAndroid Build Coastguard Worker   in_loop_cnt = npoints >> 4;
517*15dc779aSAndroid Build Coastguard Worker   for (i = n_stages - 1; i > 0; i--) {
518*15dc779aSAndroid Build Coastguard Worker     ptr_twiddles = ptr_w;
519*15dc779aSAndroid Build Coastguard Worker     ptr_data = ptr_y;
520*15dc779aSAndroid Build Coastguard Worker     for (k = in_loop_cnt; k != 0; k--) {
521*15dc779aSAndroid Build Coastguard Worker       x0_r = (*ptr_data);
522*15dc779aSAndroid Build Coastguard Worker       x0_i = (*(ptr_data + 1));
523*15dc779aSAndroid Build Coastguard Worker       ptr_data += ((SIZE_T)del << 1);
524*15dc779aSAndroid Build Coastguard Worker 
525*15dc779aSAndroid Build Coastguard Worker       x1_r = (*ptr_data);
526*15dc779aSAndroid Build Coastguard Worker       x1_i = (*(ptr_data + 1));
527*15dc779aSAndroid Build Coastguard Worker       ptr_data += ((SIZE_T)del << 1);
528*15dc779aSAndroid Build Coastguard Worker 
529*15dc779aSAndroid Build Coastguard Worker       x2_r = (*ptr_data);
530*15dc779aSAndroid Build Coastguard Worker       x2_i = (*(ptr_data + 1));
531*15dc779aSAndroid Build Coastguard Worker       ptr_data += ((SIZE_T)del << 1);
532*15dc779aSAndroid Build Coastguard Worker 
533*15dc779aSAndroid Build Coastguard Worker       x3_r = (*ptr_data);
534*15dc779aSAndroid Build Coastguard Worker       x3_i = (*(ptr_data + 1));
535*15dc779aSAndroid Build Coastguard Worker       ptr_data -= 3 * (del << 1);
536*15dc779aSAndroid Build Coastguard Worker 
537*15dc779aSAndroid Build Coastguard Worker       x0_r = x0_r + x2_r;
538*15dc779aSAndroid Build Coastguard Worker       x0_i = x0_i + x2_i;
539*15dc779aSAndroid Build Coastguard Worker       x2_r = x0_r - (x2_r * 2);
540*15dc779aSAndroid Build Coastguard Worker       x2_i = x0_i - (x2_i * 2);
541*15dc779aSAndroid Build Coastguard Worker       x1_r = x1_r + x3_r;
542*15dc779aSAndroid Build Coastguard Worker       x1_i = x1_i + x3_i;
543*15dc779aSAndroid Build Coastguard Worker       x3_r = x1_r - (x3_r * 2);
544*15dc779aSAndroid Build Coastguard Worker       x3_i = x1_i - (x3_i * 2);
545*15dc779aSAndroid Build Coastguard Worker 
546*15dc779aSAndroid Build Coastguard Worker       x0_r = x0_r + x1_r;
547*15dc779aSAndroid Build Coastguard Worker       x0_i = x0_i + x1_i;
548*15dc779aSAndroid Build Coastguard Worker       x1_r = x0_r - (x1_r * 2);
549*15dc779aSAndroid Build Coastguard Worker       x1_i = x0_i - (x1_i * 2);
550*15dc779aSAndroid Build Coastguard Worker       x2_r = x2_r + x3_i;
551*15dc779aSAndroid Build Coastguard Worker       x2_i = x2_i - x3_r;
552*15dc779aSAndroid Build Coastguard Worker       x3_i = x2_r - (x3_i * 2);
553*15dc779aSAndroid Build Coastguard Worker       x3_r = x2_i + (x3_r * 2);
554*15dc779aSAndroid Build Coastguard Worker 
555*15dc779aSAndroid Build Coastguard Worker       *ptr_data = x0_r;
556*15dc779aSAndroid Build Coastguard Worker       *(ptr_data + 1) = x0_i;
557*15dc779aSAndroid Build Coastguard Worker       ptr_data += ((SIZE_T)del << 1);
558*15dc779aSAndroid Build Coastguard Worker 
559*15dc779aSAndroid Build Coastguard Worker       *ptr_data = x2_r;
560*15dc779aSAndroid Build Coastguard Worker       *(ptr_data + 1) = x2_i;
561*15dc779aSAndroid Build Coastguard Worker       ptr_data += ((SIZE_T)del << 1);
562*15dc779aSAndroid Build Coastguard Worker 
563*15dc779aSAndroid Build Coastguard Worker       *ptr_data = x1_r;
564*15dc779aSAndroid Build Coastguard Worker       *(ptr_data + 1) = x1_i;
565*15dc779aSAndroid Build Coastguard Worker       ptr_data += ((SIZE_T)del << 1);
566*15dc779aSAndroid Build Coastguard Worker 
567*15dc779aSAndroid Build Coastguard Worker       *ptr_data = x3_i;
568*15dc779aSAndroid Build Coastguard Worker       *(ptr_data + 1) = x3_r;
569*15dc779aSAndroid Build Coastguard Worker       ptr_data += ((SIZE_T)del << 1);
570*15dc779aSAndroid Build Coastguard Worker     }
571*15dc779aSAndroid Build Coastguard Worker     ptr_data = ptr_y + 2;
572*15dc779aSAndroid Build Coastguard Worker 
573*15dc779aSAndroid Build Coastguard Worker     sec_loop_cnt = (nodespacing * del);
574*15dc779aSAndroid Build Coastguard Worker     sec_loop_cnt = (sec_loop_cnt / 4) + (sec_loop_cnt / 8) - (sec_loop_cnt / 16) +
575*15dc779aSAndroid Build Coastguard Worker                    (sec_loop_cnt / 32) - (sec_loop_cnt / 64) + (sec_loop_cnt / 128) -
576*15dc779aSAndroid Build Coastguard Worker                    (sec_loop_cnt / 256);
577*15dc779aSAndroid Build Coastguard Worker 
578*15dc779aSAndroid Build Coastguard Worker     for (j = nodespacing; j <= sec_loop_cnt; j += nodespacing) {
579*15dc779aSAndroid Build Coastguard Worker       w_1 = *(ptr_twiddles + j);
580*15dc779aSAndroid Build Coastguard Worker       w_4 = *(ptr_twiddles + j + 257);
581*15dc779aSAndroid Build Coastguard Worker       w_2 = *(ptr_twiddles + ((SIZE_T)j << 1));
582*15dc779aSAndroid Build Coastguard Worker       w_5 = *(ptr_twiddles + ((SIZE_T)j << 1) + 257);
583*15dc779aSAndroid Build Coastguard Worker       w_3 = *(ptr_twiddles + j + ((SIZE_T)j << 1));
584*15dc779aSAndroid Build Coastguard Worker       w_6 = *(ptr_twiddles + j + ((SIZE_T)j << 1) + 257);
585*15dc779aSAndroid Build Coastguard Worker 
586*15dc779aSAndroid Build Coastguard Worker       for (k = in_loop_cnt; k != 0; k--) {
587*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
588*15dc779aSAndroid Build Coastguard Worker 
589*15dc779aSAndroid Build Coastguard Worker         x1_r = *ptr_data;
590*15dc779aSAndroid Build Coastguard Worker         x1_i = *(ptr_data + 1);
591*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
592*15dc779aSAndroid Build Coastguard Worker 
593*15dc779aSAndroid Build Coastguard Worker         x2_r = *ptr_data;
594*15dc779aSAndroid Build Coastguard Worker         x2_i = *(ptr_data + 1);
595*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
596*15dc779aSAndroid Build Coastguard Worker 
597*15dc779aSAndroid Build Coastguard Worker         x3_r = *ptr_data;
598*15dc779aSAndroid Build Coastguard Worker         x3_i = *(ptr_data + 1);
599*15dc779aSAndroid Build Coastguard Worker         ptr_data -= 3 * (del << 1);
600*15dc779aSAndroid Build Coastguard Worker 
601*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(ixheaace_dmult((FLOAT64)x1_r, w_1) - ixheaace_dmult((FLOAT64)x1_i, w_4));
602*15dc779aSAndroid Build Coastguard Worker         x1_i = (FLOAT32)ixheaace_dmac(ixheaace_dmult((FLOAT64)x1_r, w_4), (FLOAT64)x1_i, w_1);
603*15dc779aSAndroid Build Coastguard Worker         x1_r = tmp;
604*15dc779aSAndroid Build Coastguard Worker 
605*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(ixheaace_dmult((FLOAT64)x2_r, w_2) - ixheaace_dmult((FLOAT64)x2_i, w_5));
606*15dc779aSAndroid Build Coastguard Worker         x2_i = (FLOAT32)ixheaace_dmac(ixheaace_dmult((FLOAT64)x2_r, w_5), (FLOAT64)x2_i, w_2);
607*15dc779aSAndroid Build Coastguard Worker         x2_r = tmp;
608*15dc779aSAndroid Build Coastguard Worker 
609*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(ixheaace_dmult((FLOAT64)x3_r, w_3) - ixheaace_dmult((FLOAT64)x3_i, w_6));
610*15dc779aSAndroid Build Coastguard Worker         x3_i = (FLOAT32)ixheaace_dmac(ixheaace_dmult((FLOAT64)x3_r, w_6), (FLOAT64)x3_i, w_3);
611*15dc779aSAndroid Build Coastguard Worker         x3_r = tmp;
612*15dc779aSAndroid Build Coastguard Worker 
613*15dc779aSAndroid Build Coastguard Worker         x0_r = (*ptr_data);
614*15dc779aSAndroid Build Coastguard Worker         x0_i = (*(ptr_data + 1));
615*15dc779aSAndroid Build Coastguard Worker 
616*15dc779aSAndroid Build Coastguard Worker         x0_r = x0_r + (x2_r);
617*15dc779aSAndroid Build Coastguard Worker         x0_i = x0_i + (x2_i);
618*15dc779aSAndroid Build Coastguard Worker         x2_r = x0_r - (x2_r * 2);
619*15dc779aSAndroid Build Coastguard Worker         x2_i = x0_i - (x2_i * 2);
620*15dc779aSAndroid Build Coastguard Worker         x1_r = x1_r + x3_r;
621*15dc779aSAndroid Build Coastguard Worker         x1_i = x1_i + x3_i;
622*15dc779aSAndroid Build Coastguard Worker         x3_r = x1_r - (x3_r * 2);
623*15dc779aSAndroid Build Coastguard Worker         x3_i = x1_i - (x3_i * 2);
624*15dc779aSAndroid Build Coastguard Worker 
625*15dc779aSAndroid Build Coastguard Worker         x0_r = x0_r + (x1_r);
626*15dc779aSAndroid Build Coastguard Worker         x0_i = x0_i + (x1_i);
627*15dc779aSAndroid Build Coastguard Worker         x1_r = x0_r - (x1_r * 2);
628*15dc779aSAndroid Build Coastguard Worker         x1_i = x0_i - (x1_i * 2);
629*15dc779aSAndroid Build Coastguard Worker         x2_r = x2_r + (x3_i);
630*15dc779aSAndroid Build Coastguard Worker         x2_i = x2_i - (x3_r);
631*15dc779aSAndroid Build Coastguard Worker         x3_i = x2_r - (x3_i * 2);
632*15dc779aSAndroid Build Coastguard Worker         x3_r = x2_i + (x3_r * 2);
633*15dc779aSAndroid Build Coastguard Worker 
634*15dc779aSAndroid Build Coastguard Worker         *ptr_data = x0_r;
635*15dc779aSAndroid Build Coastguard Worker         *(ptr_data + 1) = x0_i;
636*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
637*15dc779aSAndroid Build Coastguard Worker 
638*15dc779aSAndroid Build Coastguard Worker         *ptr_data = x2_r;
639*15dc779aSAndroid Build Coastguard Worker         *(ptr_data + 1) = x2_i;
640*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
641*15dc779aSAndroid Build Coastguard Worker 
642*15dc779aSAndroid Build Coastguard Worker         *ptr_data = x1_r;
643*15dc779aSAndroid Build Coastguard Worker         *(ptr_data + 1) = x1_i;
644*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
645*15dc779aSAndroid Build Coastguard Worker 
646*15dc779aSAndroid Build Coastguard Worker         *ptr_data = x3_i;
647*15dc779aSAndroid Build Coastguard Worker         *(ptr_data + 1) = x3_r;
648*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
649*15dc779aSAndroid Build Coastguard Worker       }
650*15dc779aSAndroid Build Coastguard Worker       ptr_data -= 2 * npoints;
651*15dc779aSAndroid Build Coastguard Worker       ptr_data += 2;
652*15dc779aSAndroid Build Coastguard Worker     }
653*15dc779aSAndroid Build Coastguard Worker     for (; j <= (nodespacing * del) >> 1; j += nodespacing) {
654*15dc779aSAndroid Build Coastguard Worker       w_1 = *(ptr_twiddles + j);
655*15dc779aSAndroid Build Coastguard Worker       w_4 = *(ptr_twiddles + j + 257);
656*15dc779aSAndroid Build Coastguard Worker       w_2 = *(ptr_twiddles + ((SIZE_T)j << 1));
657*15dc779aSAndroid Build Coastguard Worker       w_5 = *(ptr_twiddles + ((SIZE_T)j << 1) + 257);
658*15dc779aSAndroid Build Coastguard Worker       w_3 = *(ptr_twiddles + j + ((SIZE_T)j << 1) - 256);
659*15dc779aSAndroid Build Coastguard Worker       w_6 = *(ptr_twiddles + j + ((SIZE_T)j << 1) + 1);
660*15dc779aSAndroid Build Coastguard Worker 
661*15dc779aSAndroid Build Coastguard Worker       for (k = in_loop_cnt; k != 0; k--) {
662*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
663*15dc779aSAndroid Build Coastguard Worker 
664*15dc779aSAndroid Build Coastguard Worker         x1_r = *ptr_data;
665*15dc779aSAndroid Build Coastguard Worker         x1_i = *(ptr_data + 1);
666*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
667*15dc779aSAndroid Build Coastguard Worker 
668*15dc779aSAndroid Build Coastguard Worker         x2_r = *ptr_data;
669*15dc779aSAndroid Build Coastguard Worker         x2_i = *(ptr_data + 1);
670*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
671*15dc779aSAndroid Build Coastguard Worker 
672*15dc779aSAndroid Build Coastguard Worker         x3_r = *ptr_data;
673*15dc779aSAndroid Build Coastguard Worker         x3_i = *(ptr_data + 1);
674*15dc779aSAndroid Build Coastguard Worker         ptr_data -= 3 * (del << 1);
675*15dc779aSAndroid Build Coastguard Worker 
676*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(ixheaace_dmult((FLOAT64)x1_r, w_1) - ixheaace_dmult((FLOAT64)x1_i, w_4));
677*15dc779aSAndroid Build Coastguard Worker         x1_i = (FLOAT32)ixheaace_dmac(ixheaace_dmult((FLOAT64)x1_r, w_4), (FLOAT64)x1_i, w_1);
678*15dc779aSAndroid Build Coastguard Worker         x1_r = tmp;
679*15dc779aSAndroid Build Coastguard Worker 
680*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(ixheaace_dmult((FLOAT64)x2_r, w_2) - ixheaace_dmult((FLOAT64)x2_i, w_5));
681*15dc779aSAndroid Build Coastguard Worker         x2_i = (FLOAT32)ixheaace_dmac(ixheaace_dmult((FLOAT64)x2_r, w_5), (FLOAT64)x2_i, w_2);
682*15dc779aSAndroid Build Coastguard Worker         x2_r = tmp;
683*15dc779aSAndroid Build Coastguard Worker 
684*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(ixheaace_dmult((FLOAT64)x3_r, w_6) + ixheaace_dmult((FLOAT64)x3_i, w_3));
685*15dc779aSAndroid Build Coastguard Worker         x3_i =
686*15dc779aSAndroid Build Coastguard Worker             (FLOAT32)(-ixheaace_dmult((FLOAT64)x3_r, w_3) + ixheaace_dmult((FLOAT64)x3_i, w_6));
687*15dc779aSAndroid Build Coastguard Worker         x3_r = tmp;
688*15dc779aSAndroid Build Coastguard Worker 
689*15dc779aSAndroid Build Coastguard Worker         x0_r = (*ptr_data);
690*15dc779aSAndroid Build Coastguard Worker         x0_i = (*(ptr_data + 1));
691*15dc779aSAndroid Build Coastguard Worker 
692*15dc779aSAndroid Build Coastguard Worker         x0_r = x0_r + (x2_r);
693*15dc779aSAndroid Build Coastguard Worker         x0_i = x0_i + (x2_i);
694*15dc779aSAndroid Build Coastguard Worker         x2_r = x0_r - (x2_r * 2);
695*15dc779aSAndroid Build Coastguard Worker         x2_i = x0_i - (x2_i * 2);
696*15dc779aSAndroid Build Coastguard Worker         x1_r = x1_r + x3_r;
697*15dc779aSAndroid Build Coastguard Worker         x1_i = x1_i + x3_i;
698*15dc779aSAndroid Build Coastguard Worker         x3_r = x1_r - (x3_r * 2);
699*15dc779aSAndroid Build Coastguard Worker         x3_i = x1_i - (x3_i * 2);
700*15dc779aSAndroid Build Coastguard Worker 
701*15dc779aSAndroid Build Coastguard Worker         x0_r = x0_r + (x1_r);
702*15dc779aSAndroid Build Coastguard Worker         x0_i = x0_i + (x1_i);
703*15dc779aSAndroid Build Coastguard Worker         x1_r = x0_r - (x1_r * 2);
704*15dc779aSAndroid Build Coastguard Worker         x1_i = x0_i - (x1_i * 2);
705*15dc779aSAndroid Build Coastguard Worker         x2_r = x2_r + (x3_i);
706*15dc779aSAndroid Build Coastguard Worker         x2_i = x2_i - (x3_r);
707*15dc779aSAndroid Build Coastguard Worker         x3_i = x2_r - (x3_i * 2);
708*15dc779aSAndroid Build Coastguard Worker         x3_r = x2_i + (x3_r * 2);
709*15dc779aSAndroid Build Coastguard Worker 
710*15dc779aSAndroid Build Coastguard Worker         *ptr_data = x0_r;
711*15dc779aSAndroid Build Coastguard Worker         *(ptr_data + 1) = x0_i;
712*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
713*15dc779aSAndroid Build Coastguard Worker 
714*15dc779aSAndroid Build Coastguard Worker         *ptr_data = x2_r;
715*15dc779aSAndroid Build Coastguard Worker         *(ptr_data + 1) = x2_i;
716*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
717*15dc779aSAndroid Build Coastguard Worker 
718*15dc779aSAndroid Build Coastguard Worker         *ptr_data = x1_r;
719*15dc779aSAndroid Build Coastguard Worker         *(ptr_data + 1) = x1_i;
720*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
721*15dc779aSAndroid Build Coastguard Worker 
722*15dc779aSAndroid Build Coastguard Worker         *ptr_data = x3_i;
723*15dc779aSAndroid Build Coastguard Worker         *(ptr_data + 1) = x3_r;
724*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
725*15dc779aSAndroid Build Coastguard Worker       }
726*15dc779aSAndroid Build Coastguard Worker       ptr_data -= 2 * npoints;
727*15dc779aSAndroid Build Coastguard Worker       ptr_data += 2;
728*15dc779aSAndroid Build Coastguard Worker     }
729*15dc779aSAndroid Build Coastguard Worker     for (; j <= sec_loop_cnt * 2; j += nodespacing) {
730*15dc779aSAndroid Build Coastguard Worker       w_1 = *(ptr_twiddles + j);
731*15dc779aSAndroid Build Coastguard Worker       w_4 = *(ptr_twiddles + j + 257);
732*15dc779aSAndroid Build Coastguard Worker       w_2 = *(ptr_twiddles + (SIZE_T)((j << 1) - 256));
733*15dc779aSAndroid Build Coastguard Worker       w_5 = *(ptr_twiddles + (SIZE_T)((j << 1) + 1));
734*15dc779aSAndroid Build Coastguard Worker       w_3 = *(ptr_twiddles + (SIZE_T)(j + (j << 1) - 256));
735*15dc779aSAndroid Build Coastguard Worker       w_6 = *(ptr_twiddles + (SIZE_T)(j + (j << 1) + 1));
736*15dc779aSAndroid Build Coastguard Worker 
737*15dc779aSAndroid Build Coastguard Worker       for (k = in_loop_cnt; k != 0; k--) {
738*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
739*15dc779aSAndroid Build Coastguard Worker 
740*15dc779aSAndroid Build Coastguard Worker         x1_r = *ptr_data;
741*15dc779aSAndroid Build Coastguard Worker         x1_i = *(ptr_data + 1);
742*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
743*15dc779aSAndroid Build Coastguard Worker 
744*15dc779aSAndroid Build Coastguard Worker         x2_r = *ptr_data;
745*15dc779aSAndroid Build Coastguard Worker         x2_i = *(ptr_data + 1);
746*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
747*15dc779aSAndroid Build Coastguard Worker 
748*15dc779aSAndroid Build Coastguard Worker         x3_r = *ptr_data;
749*15dc779aSAndroid Build Coastguard Worker         x3_i = *(ptr_data + 1);
750*15dc779aSAndroid Build Coastguard Worker         ptr_data -= 3 * (del << 1);
751*15dc779aSAndroid Build Coastguard Worker 
752*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(ixheaace_dmult((FLOAT64)x1_r, w_1) - ixheaace_dmult((FLOAT64)x1_i, w_4));
753*15dc779aSAndroid Build Coastguard Worker         x1_i = (FLOAT32)ixheaace_dmac(ixheaace_dmult(x1_r, w_4), x1_i, w_1);
754*15dc779aSAndroid Build Coastguard Worker         x1_r = tmp;
755*15dc779aSAndroid Build Coastguard Worker 
756*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(ixheaace_dmult((FLOAT64)x2_r, w_5) + ixheaace_dmult((FLOAT64)x2_i, w_2));
757*15dc779aSAndroid Build Coastguard Worker         x2_i = (FLOAT32)(-ixheaace_dmult(x2_r, w_2) + ixheaace_dmult(x2_i, w_5));
758*15dc779aSAndroid Build Coastguard Worker         x2_r = tmp;
759*15dc779aSAndroid Build Coastguard Worker 
760*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(ixheaace_dmult((FLOAT64)x3_r, w_6) + ixheaace_dmult((FLOAT64)x3_i, w_3));
761*15dc779aSAndroid Build Coastguard Worker         x3_i =
762*15dc779aSAndroid Build Coastguard Worker             (FLOAT32)(-ixheaace_dmult((FLOAT64)x3_r, w_3) + ixheaace_dmult((FLOAT64)x3_i, w_6));
763*15dc779aSAndroid Build Coastguard Worker         x3_r = tmp;
764*15dc779aSAndroid Build Coastguard Worker 
765*15dc779aSAndroid Build Coastguard Worker         x0_r = (*ptr_data);
766*15dc779aSAndroid Build Coastguard Worker         x0_i = (*(ptr_data + 1));
767*15dc779aSAndroid Build Coastguard Worker 
768*15dc779aSAndroid Build Coastguard Worker         x0_r = x0_r + (x2_r);
769*15dc779aSAndroid Build Coastguard Worker         x0_i = x0_i + (x2_i);
770*15dc779aSAndroid Build Coastguard Worker         x2_r = x0_r - (x2_r * 2);
771*15dc779aSAndroid Build Coastguard Worker         x2_i = x0_i - (x2_i * 2);
772*15dc779aSAndroid Build Coastguard Worker         x1_r = x1_r + x3_r;
773*15dc779aSAndroid Build Coastguard Worker         x1_i = x1_i + x3_i;
774*15dc779aSAndroid Build Coastguard Worker         x3_r = x1_r - (x3_r * 2);
775*15dc779aSAndroid Build Coastguard Worker         x3_i = x1_i - (x3_i * 2);
776*15dc779aSAndroid Build Coastguard Worker 
777*15dc779aSAndroid Build Coastguard Worker         x0_r = x0_r + (x1_r);
778*15dc779aSAndroid Build Coastguard Worker         x0_i = x0_i + (x1_i);
779*15dc779aSAndroid Build Coastguard Worker         x1_r = x0_r - (x1_r * 2);
780*15dc779aSAndroid Build Coastguard Worker         x1_i = x0_i - (x1_i * 2);
781*15dc779aSAndroid Build Coastguard Worker         x2_r = x2_r + (x3_i);
782*15dc779aSAndroid Build Coastguard Worker         x2_i = x2_i - (x3_r);
783*15dc779aSAndroid Build Coastguard Worker         x3_i = x2_r - (x3_i * 2);
784*15dc779aSAndroid Build Coastguard Worker         x3_r = x2_i + (x3_r * 2);
785*15dc779aSAndroid Build Coastguard Worker 
786*15dc779aSAndroid Build Coastguard Worker         *ptr_data = x0_r;
787*15dc779aSAndroid Build Coastguard Worker         *(ptr_data + 1) = x0_i;
788*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
789*15dc779aSAndroid Build Coastguard Worker 
790*15dc779aSAndroid Build Coastguard Worker         *ptr_data = x2_r;
791*15dc779aSAndroid Build Coastguard Worker         *(ptr_data + 1) = x2_i;
792*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
793*15dc779aSAndroid Build Coastguard Worker 
794*15dc779aSAndroid Build Coastguard Worker         *ptr_data = x1_r;
795*15dc779aSAndroid Build Coastguard Worker         *(ptr_data + 1) = x1_i;
796*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
797*15dc779aSAndroid Build Coastguard Worker 
798*15dc779aSAndroid Build Coastguard Worker         *ptr_data = x3_i;
799*15dc779aSAndroid Build Coastguard Worker         *(ptr_data + 1) = x3_r;
800*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
801*15dc779aSAndroid Build Coastguard Worker       }
802*15dc779aSAndroid Build Coastguard Worker       ptr_data -= 2 * npoints;
803*15dc779aSAndroid Build Coastguard Worker       ptr_data += 2;
804*15dc779aSAndroid Build Coastguard Worker     }
805*15dc779aSAndroid Build Coastguard Worker     for (; j < nodespacing * del; j += nodespacing) {
806*15dc779aSAndroid Build Coastguard Worker       w_1 = *(ptr_twiddles + j);
807*15dc779aSAndroid Build Coastguard Worker       w_4 = *(ptr_twiddles + j + 257);
808*15dc779aSAndroid Build Coastguard Worker       w_2 = *(ptr_twiddles + (SIZE_T)((j << 1) - 256));
809*15dc779aSAndroid Build Coastguard Worker       w_5 = *(ptr_twiddles + (SIZE_T)((j << 1) + 1));
810*15dc779aSAndroid Build Coastguard Worker       w_3 = *(ptr_twiddles + (SIZE_T)(j + (j << 1) - 512));
811*15dc779aSAndroid Build Coastguard Worker       w_6 = *(ptr_twiddles + (SIZE_T)(j + (j << 1) - 512 + 257));
812*15dc779aSAndroid Build Coastguard Worker 
813*15dc779aSAndroid Build Coastguard Worker       for (k = in_loop_cnt; k != 0; k--) {
814*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
815*15dc779aSAndroid Build Coastguard Worker 
816*15dc779aSAndroid Build Coastguard Worker         x1_r = *ptr_data;
817*15dc779aSAndroid Build Coastguard Worker         x1_i = *(ptr_data + 1);
818*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
819*15dc779aSAndroid Build Coastguard Worker 
820*15dc779aSAndroid Build Coastguard Worker         x2_r = *ptr_data;
821*15dc779aSAndroid Build Coastguard Worker         x2_i = *(ptr_data + 1);
822*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
823*15dc779aSAndroid Build Coastguard Worker 
824*15dc779aSAndroid Build Coastguard Worker         x3_r = *ptr_data;
825*15dc779aSAndroid Build Coastguard Worker         x3_i = *(ptr_data + 1);
826*15dc779aSAndroid Build Coastguard Worker         ptr_data -= 3 * (del << 1);
827*15dc779aSAndroid Build Coastguard Worker 
828*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(ixheaace_dmult((FLOAT64)x1_r, w_1) - ixheaace_dmult((FLOAT64)x1_i, w_4));
829*15dc779aSAndroid Build Coastguard Worker         x1_i = (FLOAT32)ixheaace_dmac(ixheaace_dmult((FLOAT64)x1_r, w_4), (FLOAT64)x1_i, w_1);
830*15dc779aSAndroid Build Coastguard Worker         x1_r = tmp;
831*15dc779aSAndroid Build Coastguard Worker 
832*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(ixheaace_dmult((FLOAT64)x2_r, w_5) + ixheaace_dmult((FLOAT64)x2_i, w_2));
833*15dc779aSAndroid Build Coastguard Worker         x2_i =
834*15dc779aSAndroid Build Coastguard Worker             (FLOAT32)(-ixheaace_dmult((FLOAT64)x2_r, w_2) + ixheaace_dmult((FLOAT64)x2_i, w_5));
835*15dc779aSAndroid Build Coastguard Worker         x2_r = tmp;
836*15dc779aSAndroid Build Coastguard Worker 
837*15dc779aSAndroid Build Coastguard Worker         tmp = (FLOAT32)(-ixheaace_dmult((FLOAT64)x3_r, w_3) + ixheaace_dmult((FLOAT64)x3_i, w_6));
838*15dc779aSAndroid Build Coastguard Worker         x3_i = (FLOAT32)ixheaace_dmac(ixheaace_dmult((FLOAT64)x3_r, w_6), (FLOAT64)x3_i, w_3);
839*15dc779aSAndroid Build Coastguard Worker         x3_r = tmp;
840*15dc779aSAndroid Build Coastguard Worker 
841*15dc779aSAndroid Build Coastguard Worker         x0_r = (*ptr_data);
842*15dc779aSAndroid Build Coastguard Worker         x0_i = (*(ptr_data + 1));
843*15dc779aSAndroid Build Coastguard Worker 
844*15dc779aSAndroid Build Coastguard Worker         x0_r = x0_r + (x2_r);
845*15dc779aSAndroid Build Coastguard Worker         x0_i = x0_i + (x2_i);
846*15dc779aSAndroid Build Coastguard Worker         x2_r = x0_r - (x2_r * 2);
847*15dc779aSAndroid Build Coastguard Worker         x2_i = x0_i - (x2_i * 2);
848*15dc779aSAndroid Build Coastguard Worker         x1_r = x1_r + x3_r;
849*15dc779aSAndroid Build Coastguard Worker         x1_i = x1_i - x3_i;
850*15dc779aSAndroid Build Coastguard Worker         x3_r = x1_r - (x3_r * 2);
851*15dc779aSAndroid Build Coastguard Worker         x3_i = x1_i + (x3_i * 2);
852*15dc779aSAndroid Build Coastguard Worker 
853*15dc779aSAndroid Build Coastguard Worker         x0_r = x0_r + (x1_r);
854*15dc779aSAndroid Build Coastguard Worker         x0_i = x0_i + (x1_i);
855*15dc779aSAndroid Build Coastguard Worker         x1_r = x0_r - (x1_r * 2);
856*15dc779aSAndroid Build Coastguard Worker         x1_i = x0_i - (x1_i * 2);
857*15dc779aSAndroid Build Coastguard Worker         x2_r = x2_r + (x3_i);
858*15dc779aSAndroid Build Coastguard Worker         x2_i = x2_i - (x3_r);
859*15dc779aSAndroid Build Coastguard Worker         x3_i = x2_r - (x3_i * 2);
860*15dc779aSAndroid Build Coastguard Worker         x3_r = x2_i + (x3_r * 2);
861*15dc779aSAndroid Build Coastguard Worker 
862*15dc779aSAndroid Build Coastguard Worker         *ptr_data = x0_r;
863*15dc779aSAndroid Build Coastguard Worker         *(ptr_data + 1) = x0_i;
864*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
865*15dc779aSAndroid Build Coastguard Worker 
866*15dc779aSAndroid Build Coastguard Worker         *ptr_data = x2_r;
867*15dc779aSAndroid Build Coastguard Worker         *(ptr_data + 1) = x2_i;
868*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
869*15dc779aSAndroid Build Coastguard Worker 
870*15dc779aSAndroid Build Coastguard Worker         *ptr_data = x1_r;
871*15dc779aSAndroid Build Coastguard Worker         *(ptr_data + 1) = x1_i;
872*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
873*15dc779aSAndroid Build Coastguard Worker 
874*15dc779aSAndroid Build Coastguard Worker         *ptr_data = x3_i;
875*15dc779aSAndroid Build Coastguard Worker         *(ptr_data + 1) = x3_r;
876*15dc779aSAndroid Build Coastguard Worker         ptr_data += ((SIZE_T)del << 1);
877*15dc779aSAndroid Build Coastguard Worker       }
878*15dc779aSAndroid Build Coastguard Worker       ptr_data -= 2 * npoints;
879*15dc779aSAndroid Build Coastguard Worker       ptr_data += 2;
880*15dc779aSAndroid Build Coastguard Worker     }
881*15dc779aSAndroid Build Coastguard Worker     nodespacing >>= 2;
882*15dc779aSAndroid Build Coastguard Worker     del <<= 2;
883*15dc779aSAndroid Build Coastguard Worker     in_loop_cnt >>= 2;
884*15dc779aSAndroid Build Coastguard Worker   }
885*15dc779aSAndroid Build Coastguard Worker   if (not_power_4) {
886*15dc779aSAndroid Build Coastguard Worker     ptr_twiddles = ptr_w;
887*15dc779aSAndroid Build Coastguard Worker     nodespacing <<= 1;
888*15dc779aSAndroid Build Coastguard Worker 
889*15dc779aSAndroid Build Coastguard Worker     for (j = del / 2; j != 0; j--) {
890*15dc779aSAndroid Build Coastguard Worker       w_1 = *ptr_twiddles;
891*15dc779aSAndroid Build Coastguard Worker       w_4 = *(ptr_twiddles + 257);
892*15dc779aSAndroid Build Coastguard Worker       ptr_twiddles += nodespacing;
893*15dc779aSAndroid Build Coastguard Worker 
894*15dc779aSAndroid Build Coastguard Worker       x0_r = *ptr_y;
895*15dc779aSAndroid Build Coastguard Worker       x0_i = *(ptr_y + 1);
896*15dc779aSAndroid Build Coastguard Worker       ptr_y += ((SIZE_T)del << 1);
897*15dc779aSAndroid Build Coastguard Worker 
898*15dc779aSAndroid Build Coastguard Worker       x1_r = *ptr_y;
899*15dc779aSAndroid Build Coastguard Worker       x1_i = *(ptr_y + 1);
900*15dc779aSAndroid Build Coastguard Worker 
901*15dc779aSAndroid Build Coastguard Worker       tmp = (FLOAT32)(ixheaace_dmult((FLOAT64)x1_r, w_1) - ixheaace_dmult((FLOAT64)x1_i, w_4));
902*15dc779aSAndroid Build Coastguard Worker       x1_i = (FLOAT32)ixheaace_dmac(ixheaace_dmult((FLOAT64)x1_r, w_4), (FLOAT64)x1_i, w_1);
903*15dc779aSAndroid Build Coastguard Worker       x1_r = tmp;
904*15dc779aSAndroid Build Coastguard Worker 
905*15dc779aSAndroid Build Coastguard Worker       *ptr_y = (x0_r) - (x1_r);
906*15dc779aSAndroid Build Coastguard Worker       *(ptr_y + 1) = (x0_i) - (x1_i);
907*15dc779aSAndroid Build Coastguard Worker       ptr_y -= ((SIZE_T)del << 1);
908*15dc779aSAndroid Build Coastguard Worker 
909*15dc779aSAndroid Build Coastguard Worker       *ptr_y = (x0_r) + (x1_r);
910*15dc779aSAndroid Build Coastguard Worker       *(ptr_y + 1) = (x0_i) + (x1_i);
911*15dc779aSAndroid Build Coastguard Worker       ptr_y += 2;
912*15dc779aSAndroid Build Coastguard Worker     }
913*15dc779aSAndroid Build Coastguard Worker     ptr_twiddles = ptr_w;
914*15dc779aSAndroid Build Coastguard Worker     for (j = del / 2; j != 0; j--) {
915*15dc779aSAndroid Build Coastguard Worker       w_1 = *ptr_twiddles;
916*15dc779aSAndroid Build Coastguard Worker       w_4 = *(ptr_twiddles + 257);
917*15dc779aSAndroid Build Coastguard Worker       ptr_twiddles += nodespacing;
918*15dc779aSAndroid Build Coastguard Worker 
919*15dc779aSAndroid Build Coastguard Worker       x0_r = *ptr_y;
920*15dc779aSAndroid Build Coastguard Worker       x0_i = *(ptr_y + 1);
921*15dc779aSAndroid Build Coastguard Worker       ptr_y += ((SIZE_T)del << 1);
922*15dc779aSAndroid Build Coastguard Worker 
923*15dc779aSAndroid Build Coastguard Worker       x1_r = *ptr_y;
924*15dc779aSAndroid Build Coastguard Worker       x1_i = *(ptr_y + 1);
925*15dc779aSAndroid Build Coastguard Worker 
926*15dc779aSAndroid Build Coastguard Worker       tmp = (FLOAT32)(ixheaace_dmult((FLOAT64)x1_r, w_4) +
927*15dc779aSAndroid Build Coastguard Worker                       ixheaace_dmult((FLOAT64)x1_i, w_1)) /*/2*/;
928*15dc779aSAndroid Build Coastguard Worker       x1_i = (FLOAT32)(-ixheaace_dmult((FLOAT64)x1_r, w_1) +
929*15dc779aSAndroid Build Coastguard Worker                        ixheaace_dmult((FLOAT64)x1_i, w_4)) /*/2*/;
930*15dc779aSAndroid Build Coastguard Worker       x1_r = tmp;
931*15dc779aSAndroid Build Coastguard Worker 
932*15dc779aSAndroid Build Coastguard Worker       *ptr_y = (x0_r) - (x1_r);
933*15dc779aSAndroid Build Coastguard Worker       *(ptr_y + 1) = (x0_i) - (x1_i);
934*15dc779aSAndroid Build Coastguard Worker       ptr_y -= ((SIZE_T)del << 1);
935*15dc779aSAndroid Build Coastguard Worker 
936*15dc779aSAndroid Build Coastguard Worker       *ptr_y = (x0_r) + (x1_r);
937*15dc779aSAndroid Build Coastguard Worker       *(ptr_y + 1) = (x0_i) + (x1_i);
938*15dc779aSAndroid Build Coastguard Worker       ptr_y += 2;
939*15dc779aSAndroid Build Coastguard Worker     }
940*15dc779aSAndroid Build Coastguard Worker   }
941*15dc779aSAndroid Build Coastguard Worker 
942*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < nlength; i++) {
943*15dc779aSAndroid Build Coastguard Worker     *(ptr_x + 2 * i) = ptr_p2_y[2 * i];
944*15dc779aSAndroid Build Coastguard Worker     *(ptr_x + 2 * i + 1) = ptr_p2_y[2 * i + 1];
945*15dc779aSAndroid Build Coastguard Worker   }
946*15dc779aSAndroid Build Coastguard Worker }
947*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_complex_fft_p3(FLOAT32 * ptr_data,WORD32 nlength,ixheaace_scratch_mem * pstr_scratch)948*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_complex_fft_p3(FLOAT32 *ptr_data, WORD32 nlength,
949*15dc779aSAndroid Build Coastguard Worker                                              ixheaace_scratch_mem *pstr_scratch) {
950*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j;
951*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_data_3 = pstr_scratch->p_fft_p3_data_3;
952*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_p3_y = pstr_scratch->p_fft_p3_y;
953*15dc779aSAndroid Build Coastguard Worker   WORD32 cnfac;
954*15dc779aSAndroid Build Coastguard Worker   WORD32 mpass = nlength;
955*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_x = ptr_data;
956*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_y = ptr_p3_y;
957*15dc779aSAndroid Build Coastguard Worker   cnfac = 0;
958*15dc779aSAndroid Build Coastguard Worker   const FLOAT64 *ptr_w1_r, *ptr_w1_i;
959*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tmp;
960*15dc779aSAndroid Build Coastguard Worker   ptr_w1_r = ia_enhaacplus_enc_twiddle_table_3pr;
961*15dc779aSAndroid Build Coastguard Worker   ptr_w1_i = ia_enhaacplus_enc_twiddle_table_3pi;
962*15dc779aSAndroid Build Coastguard Worker 
963*15dc779aSAndroid Build Coastguard Worker   while (mpass % 3 == 0) {
964*15dc779aSAndroid Build Coastguard Worker     mpass /= 3;
965*15dc779aSAndroid Build Coastguard Worker     cnfac++;
966*15dc779aSAndroid Build Coastguard Worker   }
967*15dc779aSAndroid Build Coastguard Worker 
968*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 3 * cnfac; i++) {
969*15dc779aSAndroid Build Coastguard Worker     for (j = 0; j < mpass; j++) {
970*15dc779aSAndroid Build Coastguard Worker       ptr_data_3[2 * j] = ptr_data[3 * (2 * j) + (2 * i)];
971*15dc779aSAndroid Build Coastguard Worker       ptr_data_3[2 * j + 1] = ptr_data[3 * (2 * j) + 1 + (2 * i)];
972*15dc779aSAndroid Build Coastguard Worker     }
973*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_complex_fft_p2(ptr_data_3, mpass, pstr_scratch->p_fft_p2_y);
974*15dc779aSAndroid Build Coastguard Worker 
975*15dc779aSAndroid Build Coastguard Worker     for (j = 0; j < mpass; j++) {
976*15dc779aSAndroid Build Coastguard Worker       ptr_data[3 * (2 * j) + (2 * i)] = ptr_data_3[2 * j];
977*15dc779aSAndroid Build Coastguard Worker       ptr_data[3 * (2 * j) + 1 + (2 * i)] = ptr_data_3[2 * j + 1];
978*15dc779aSAndroid Build Coastguard Worker     }
979*15dc779aSAndroid Build Coastguard Worker   }
980*15dc779aSAndroid Build Coastguard Worker 
981*15dc779aSAndroid Build Coastguard Worker   {
982*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < nlength; i += 3) {
983*15dc779aSAndroid Build Coastguard Worker       tmp = (FLOAT32)((FLOAT64)ptr_data[2 * i] * (*ptr_w1_r) -
984*15dc779aSAndroid Build Coastguard Worker                       (FLOAT64)ptr_data[2 * i + 1] * (*ptr_w1_i));
985*15dc779aSAndroid Build Coastguard Worker       ptr_data[2 * i + 1] = (FLOAT32)((FLOAT64)ptr_data[2 * i] * (*ptr_w1_i) +
986*15dc779aSAndroid Build Coastguard Worker                                       (FLOAT64)ptr_data[2 * i + 1] * (*ptr_w1_r));
987*15dc779aSAndroid Build Coastguard Worker       ptr_data[2 * i] = tmp;
988*15dc779aSAndroid Build Coastguard Worker 
989*15dc779aSAndroid Build Coastguard Worker       ptr_w1_r++;
990*15dc779aSAndroid Build Coastguard Worker       ptr_w1_i++;
991*15dc779aSAndroid Build Coastguard Worker 
992*15dc779aSAndroid Build Coastguard Worker       tmp = (FLOAT32)((FLOAT64)ptr_data[2 * (i + 1)] * (*ptr_w1_r) -
993*15dc779aSAndroid Build Coastguard Worker                       (FLOAT64)ptr_data[2 * (i + 1) + 1] * (*ptr_w1_i));
994*15dc779aSAndroid Build Coastguard Worker       ptr_data[2 * (i + 1) + 1] = (FLOAT32)((FLOAT64)ptr_data[2 * (i + 1)] * (*ptr_w1_i) +
995*15dc779aSAndroid Build Coastguard Worker                                             (FLOAT64)ptr_data[2 * (i + 1) + 1] * (*ptr_w1_r));
996*15dc779aSAndroid Build Coastguard Worker       ptr_data[2 * (i + 1)] = tmp;
997*15dc779aSAndroid Build Coastguard Worker 
998*15dc779aSAndroid Build Coastguard Worker       ptr_w1_r++;
999*15dc779aSAndroid Build Coastguard Worker       ptr_w1_i++;
1000*15dc779aSAndroid Build Coastguard Worker 
1001*15dc779aSAndroid Build Coastguard Worker       tmp = (FLOAT32)((FLOAT64)ptr_data[2 * (i + 2)] * (*ptr_w1_r) -
1002*15dc779aSAndroid Build Coastguard Worker                       (FLOAT64)ptr_data[2 * (i + 2) + 1] * (*ptr_w1_i));
1003*15dc779aSAndroid Build Coastguard Worker       ptr_data[2 * (i + 2) + 1] = (FLOAT32)((FLOAT64)ptr_data[2 * (i + 2)] * (*ptr_w1_i) +
1004*15dc779aSAndroid Build Coastguard Worker                                             (FLOAT64)ptr_data[2 * (i + 2) + 1] * (*ptr_w1_r));
1005*15dc779aSAndroid Build Coastguard Worker       ptr_data[2 * (i + 2)] = tmp;
1006*15dc779aSAndroid Build Coastguard Worker 
1007*15dc779aSAndroid Build Coastguard Worker       ptr_w1_r += 3 * (128 / mpass - 1) + 1;
1008*15dc779aSAndroid Build Coastguard Worker       ptr_w1_i += 3 * (128 / mpass - 1) + 1;
1009*15dc779aSAndroid Build Coastguard Worker     }
1010*15dc779aSAndroid Build Coastguard Worker   }
1011*15dc779aSAndroid Build Coastguard Worker 
1012*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < mpass; i++) {
1013*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_complex_3point_fft(ptr_x, ptr_y);
1014*15dc779aSAndroid Build Coastguard Worker 
1015*15dc779aSAndroid Build Coastguard Worker     ptr_x = ptr_x + 6;
1016*15dc779aSAndroid Build Coastguard Worker     ptr_y = ptr_y + 6;
1017*15dc779aSAndroid Build Coastguard Worker   }
1018*15dc779aSAndroid Build Coastguard Worker 
1019*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < mpass; i++) {
1020*15dc779aSAndroid Build Coastguard Worker     ptr_data[2 * i] = ptr_p3_y[6 * i];
1021*15dc779aSAndroid Build Coastguard Worker     ptr_data[2 * i + 1] = ptr_p3_y[6 * i + 1];
1022*15dc779aSAndroid Build Coastguard Worker   }
1023*15dc779aSAndroid Build Coastguard Worker 
1024*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < mpass; i++) {
1025*15dc779aSAndroid Build Coastguard Worker     ptr_data[2 * (i + mpass)] = ptr_p3_y[6 * i + 2];
1026*15dc779aSAndroid Build Coastguard Worker     ptr_data[2 * (i + mpass) + 1] = ptr_p3_y[6 * i + 3];
1027*15dc779aSAndroid Build Coastguard Worker   }
1028*15dc779aSAndroid Build Coastguard Worker 
1029*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < mpass; i++) {
1030*15dc779aSAndroid Build Coastguard Worker     ptr_data[2 * (i + 2 * mpass)] = ptr_p3_y[6 * i + 4];
1031*15dc779aSAndroid Build Coastguard Worker     ptr_data[2 * (i + 2 * mpass) + 1] = ptr_p3_y[6 * i + 5];
1032*15dc779aSAndroid Build Coastguard Worker   }
1033*15dc779aSAndroid Build Coastguard Worker }
1034*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_complex_fft(FLOAT32 * ptr_data,WORD32 len,ixheaace_scratch_mem * pstr_scratch)1035*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_complex_fft(FLOAT32 *ptr_data, WORD32 len,
1036*15dc779aSAndroid Build Coastguard Worker                                    ixheaace_scratch_mem *pstr_scratch) {
1037*15dc779aSAndroid Build Coastguard Worker   if (len & (len - 1)) {
1038*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_complex_fft_p3(ptr_data, len, pstr_scratch);
1039*15dc779aSAndroid Build Coastguard Worker   } else {
1040*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_enc_complex_fft_p2(ptr_data, len, pstr_scratch->p_fft_p2_y);
1041*15dc779aSAndroid Build Coastguard Worker   }
1042*15dc779aSAndroid Build Coastguard Worker }
1043*15dc779aSAndroid Build Coastguard Worker 
ixheaace_post_mdct(FLOAT32 * ptr_x,WORD32 m,const FLOAT32 * ptr_trig_data,WORD32 step,WORD32 trig_data_size)1044*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_post_mdct(FLOAT32 *ptr_x, WORD32 m, const FLOAT32 *ptr_trig_data,
1045*15dc779aSAndroid Build Coastguard Worker                                WORD32 step, WORD32 trig_data_size) {
1046*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
1047*15dc779aSAndroid Build Coastguard Worker   FLOAT32 w_re, w_im, re1, re2, im1, im2;
1048*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_sin = ptr_trig_data;
1049*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_cos = ptr_trig_data + trig_data_size;
1050*15dc779aSAndroid Build Coastguard Worker 
1051*15dc779aSAndroid Build Coastguard Worker   w_im = *ptr_sin;
1052*15dc779aSAndroid Build Coastguard Worker   w_re = *ptr_cos;
1053*15dc779aSAndroid Build Coastguard Worker 
1054*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < m / 4; i++) {
1055*15dc779aSAndroid Build Coastguard Worker     re1 = ptr_x[2 * i];
1056*15dc779aSAndroid Build Coastguard Worker     im1 = ptr_x[2 * i + 1];
1057*15dc779aSAndroid Build Coastguard Worker     re2 = ptr_x[m - 2 - 2 * i];
1058*15dc779aSAndroid Build Coastguard Worker     im2 = ptr_x[m - 1 - 2 * i];
1059*15dc779aSAndroid Build Coastguard Worker 
1060*15dc779aSAndroid Build Coastguard Worker     ptr_x[2 * i] = (re1 * w_re + im1 * w_im);
1061*15dc779aSAndroid Build Coastguard Worker 
1062*15dc779aSAndroid Build Coastguard Worker     ptr_x[m - 1 - 2 * i] = (re1 * w_im - im1 * w_re);
1063*15dc779aSAndroid Build Coastguard Worker 
1064*15dc779aSAndroid Build Coastguard Worker     ptr_sin += step;
1065*15dc779aSAndroid Build Coastguard Worker     ptr_cos -= step;
1066*15dc779aSAndroid Build Coastguard Worker 
1067*15dc779aSAndroid Build Coastguard Worker     w_im = *ptr_sin;
1068*15dc779aSAndroid Build Coastguard Worker     w_re = *ptr_cos;
1069*15dc779aSAndroid Build Coastguard Worker 
1070*15dc779aSAndroid Build Coastguard Worker     ptr_x[m - 2 - 2 * i] = (re2 * w_im + im2 * w_re);
1071*15dc779aSAndroid Build Coastguard Worker 
1072*15dc779aSAndroid Build Coastguard Worker     ptr_x[2 * i + 1] = (re2 * w_re - im2 * w_im);
1073*15dc779aSAndroid Build Coastguard Worker   }
1074*15dc779aSAndroid Build Coastguard Worker }
1075*15dc779aSAndroid Build Coastguard Worker 
ixheaace_cplx_mult_twid(FLOAT32 * ptr_re,FLOAT32 * ptr_im,FLOAT32 a,FLOAT32 b,FLOAT32 twid_table,FLOAT32 twid_table_h)1076*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_cplx_mult_twid(FLOAT32 *ptr_re, FLOAT32 *ptr_im, FLOAT32 a, FLOAT32 b,
1077*15dc779aSAndroid Build Coastguard Worker                                     FLOAT32 twid_table, FLOAT32 twid_table_h) {
1078*15dc779aSAndroid Build Coastguard Worker   *ptr_re = (a * twid_table) - (b * twid_table_h);
1079*15dc779aSAndroid Build Coastguard Worker   *ptr_im = (a * twid_table_h) + (b * twid_table);
1080*15dc779aSAndroid Build Coastguard Worker }
1081*15dc779aSAndroid Build Coastguard Worker 
ixheaace_cfft_15_twiddle(FLOAT32 * ptr_inp)1082*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_cfft_15_twiddle(FLOAT32 *ptr_inp) {
1083*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_tw_flt = &ixheaace_mix_rad_twid_tbl[0];
1084*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_tw_flt_h = &ixheaace_mix_rad_twid_tbl_h[0];
1085*15dc779aSAndroid Build Coastguard Worker   FLOAT32 accu1, accu2;
1086*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j;
1087*15dc779aSAndroid Build Coastguard Worker   ptr_inp += 12;
1088*15dc779aSAndroid Build Coastguard Worker 
1089*15dc779aSAndroid Build Coastguard Worker   for (j = 0; j < 2; j++) {
1090*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 4; i++) {
1091*15dc779aSAndroid Build Coastguard Worker       ixheaace_cplx_mult_twid(&accu1, &accu2, ptr_inp[2 * i + 0], ptr_inp[2 * i + 1],
1092*15dc779aSAndroid Build Coastguard Worker                               ptr_tw_flt[i], ptr_tw_flt_h[i]);
1093*15dc779aSAndroid Build Coastguard Worker       ptr_inp[2 * i + 0] = accu1;
1094*15dc779aSAndroid Build Coastguard Worker       ptr_inp[2 * i + 1] = accu2;
1095*15dc779aSAndroid Build Coastguard Worker     }
1096*15dc779aSAndroid Build Coastguard Worker     ptr_inp += 10;
1097*15dc779aSAndroid Build Coastguard Worker     ptr_tw_flt += 4;
1098*15dc779aSAndroid Build Coastguard Worker     ptr_tw_flt_h += 4;
1099*15dc779aSAndroid Build Coastguard Worker   }
1100*15dc779aSAndroid Build Coastguard Worker }
1101*15dc779aSAndroid Build Coastguard Worker 
ixheaace_cfft_15_480(FLOAT32 * ptr_inp,FLOAT32 * ptr_op,FLOAT32 * ptr_fft3_out)1102*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_cfft_15_480(FLOAT32 *ptr_inp, FLOAT32 *ptr_op, FLOAT32 *ptr_fft3_out) {
1103*15dc779aSAndroid Build Coastguard Worker   WORD32 i, idx;
1104*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_buf1, *ptr_buf2, *ptr_buf3;
1105*15dc779aSAndroid Build Coastguard Worker   FLOAT32 add_r, sub_r;
1106*15dc779aSAndroid Build Coastguard Worker   FLOAT32 add_i, sub_i;
1107*15dc779aSAndroid Build Coastguard Worker   FLOAT32 x_01_r, x_01_i, temp;
1108*15dc779aSAndroid Build Coastguard Worker   FLOAT32 p1, p2, p3, p4;
1109*15dc779aSAndroid Build Coastguard Worker 
1110*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sin_mu_flt = 0.866027832f;
1111*15dc779aSAndroid Build Coastguard Worker   FLOAT32 c51_flt = 0.951049805f;
1112*15dc779aSAndroid Build Coastguard Worker   FLOAT32 c52_flt = -0.76940918f;
1113*15dc779aSAndroid Build Coastguard Worker   FLOAT32 c53_flt = -0.36328125f;
1114*15dc779aSAndroid Build Coastguard Worker   FLOAT32 c54_flt = 0.559020996f;
1115*15dc779aSAndroid Build Coastguard Worker   FLOAT32 c55_flt = -0.625f;
1116*15dc779aSAndroid Build Coastguard Worker 
1117*15dc779aSAndroid Build Coastguard Worker   FLOAT32 r1, r2, r3, r4;
1118*15dc779aSAndroid Build Coastguard Worker   FLOAT32 s1, s2, s3, s4, t, temp1, temp2;
1119*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_out_fft3 = ptr_fft3_out;
1120*15dc779aSAndroid Build Coastguard Worker 
1121*15dc779aSAndroid Build Coastguard Worker   FLOAT32 xr_0, xr_1, xr_2;
1122*15dc779aSAndroid Build Coastguard Worker   FLOAT32 xi_0, xi_1, xi_2;
1123*15dc779aSAndroid Build Coastguard Worker 
1124*15dc779aSAndroid Build Coastguard Worker   ptr_buf2 = ptr_fft3_out;
1125*15dc779aSAndroid Build Coastguard Worker   ptr_buf1 = ptr_buf3 = ptr_fft3_out;
1126*15dc779aSAndroid Build Coastguard Worker 
1127*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < FFT3; i++) {
1128*15dc779aSAndroid Build Coastguard Worker     *ptr_buf1++ = ptr_inp[0 + 64 * i];
1129*15dc779aSAndroid Build Coastguard Worker     *ptr_buf1++ = ptr_inp[1 + 64 * i];
1130*15dc779aSAndroid Build Coastguard Worker 
1131*15dc779aSAndroid Build Coastguard Worker     *ptr_buf1++ = ptr_inp[192 + 64 * i];
1132*15dc779aSAndroid Build Coastguard Worker     *ptr_buf1++ = ptr_inp[193 + 64 * i];
1133*15dc779aSAndroid Build Coastguard Worker 
1134*15dc779aSAndroid Build Coastguard Worker     *ptr_buf1++ = ptr_inp[384 + 64 * i];
1135*15dc779aSAndroid Build Coastguard Worker     *ptr_buf1++ = ptr_inp[385 + 64 * i];
1136*15dc779aSAndroid Build Coastguard Worker 
1137*15dc779aSAndroid Build Coastguard Worker     *ptr_buf1++ = ptr_inp[576 + 64 * i];
1138*15dc779aSAndroid Build Coastguard Worker     *ptr_buf1++ = ptr_inp[577 + 64 * i];
1139*15dc779aSAndroid Build Coastguard Worker 
1140*15dc779aSAndroid Build Coastguard Worker     *ptr_buf1++ = ptr_inp[768 + 64 * i];
1141*15dc779aSAndroid Build Coastguard Worker     *ptr_buf1++ = ptr_inp[769 + 64 * i];
1142*15dc779aSAndroid Build Coastguard Worker 
1143*15dc779aSAndroid Build Coastguard Worker     r1 = ptr_buf3[2] + ptr_buf3[8];
1144*15dc779aSAndroid Build Coastguard Worker     r4 = ptr_buf3[2] - ptr_buf3[8];
1145*15dc779aSAndroid Build Coastguard Worker     r3 = ptr_buf3[4] + ptr_buf3[6];
1146*15dc779aSAndroid Build Coastguard Worker     r2 = ptr_buf3[4] - ptr_buf3[6];
1147*15dc779aSAndroid Build Coastguard Worker     t = ((r1 - r3) * c54_flt);
1148*15dc779aSAndroid Build Coastguard Worker 
1149*15dc779aSAndroid Build Coastguard Worker     r1 = r1 + r3;
1150*15dc779aSAndroid Build Coastguard Worker 
1151*15dc779aSAndroid Build Coastguard Worker     temp1 = ptr_buf3[0] + r1;
1152*15dc779aSAndroid Build Coastguard Worker 
1153*15dc779aSAndroid Build Coastguard Worker     r1 = temp1 + ((r1 * c55_flt) * 2);
1154*15dc779aSAndroid Build Coastguard Worker 
1155*15dc779aSAndroid Build Coastguard Worker     r3 = r1 - t;
1156*15dc779aSAndroid Build Coastguard Worker     r1 = r1 + t;
1157*15dc779aSAndroid Build Coastguard Worker 
1158*15dc779aSAndroid Build Coastguard Worker     t = ((r4 + r2) * c51_flt);
1159*15dc779aSAndroid Build Coastguard Worker     r4 = t + ((r4 * c52_flt) * 2);
1160*15dc779aSAndroid Build Coastguard Worker     r2 = t + (r2 * c53_flt);
1161*15dc779aSAndroid Build Coastguard Worker 
1162*15dc779aSAndroid Build Coastguard Worker     s1 = ptr_buf3[3] + ptr_buf3[9];
1163*15dc779aSAndroid Build Coastguard Worker     s4 = ptr_buf3[3] - ptr_buf3[9];
1164*15dc779aSAndroid Build Coastguard Worker     s3 = ptr_buf3[5] + ptr_buf3[7];
1165*15dc779aSAndroid Build Coastguard Worker     s2 = ptr_buf3[5] - ptr_buf3[7];
1166*15dc779aSAndroid Build Coastguard Worker 
1167*15dc779aSAndroid Build Coastguard Worker     t = ((s1 - s3) * c54_flt);
1168*15dc779aSAndroid Build Coastguard Worker 
1169*15dc779aSAndroid Build Coastguard Worker     s1 = s1 + s3;
1170*15dc779aSAndroid Build Coastguard Worker 
1171*15dc779aSAndroid Build Coastguard Worker     temp2 = ptr_buf3[1] + s1;
1172*15dc779aSAndroid Build Coastguard Worker 
1173*15dc779aSAndroid Build Coastguard Worker     s1 = temp2 + (((s1 * c55_flt)) * 2);
1174*15dc779aSAndroid Build Coastguard Worker 
1175*15dc779aSAndroid Build Coastguard Worker     s3 = s1 - t;
1176*15dc779aSAndroid Build Coastguard Worker     s1 = s1 + t;
1177*15dc779aSAndroid Build Coastguard Worker 
1178*15dc779aSAndroid Build Coastguard Worker     t = ((s4 + s2) * c51_flt);
1179*15dc779aSAndroid Build Coastguard Worker     s4 = t + (((s4 * c52_flt)) * 2);
1180*15dc779aSAndroid Build Coastguard Worker     s2 = t + ((s2 * c53_flt));
1181*15dc779aSAndroid Build Coastguard Worker 
1182*15dc779aSAndroid Build Coastguard Worker     *ptr_buf2++ = temp1;
1183*15dc779aSAndroid Build Coastguard Worker     *ptr_buf2++ = temp2;
1184*15dc779aSAndroid Build Coastguard Worker     *ptr_buf2++ = r1 + s2;
1185*15dc779aSAndroid Build Coastguard Worker     *ptr_buf2++ = s1 - r2;
1186*15dc779aSAndroid Build Coastguard Worker     *ptr_buf2++ = r3 - s4;
1187*15dc779aSAndroid Build Coastguard Worker     *ptr_buf2++ = s3 + r4;
1188*15dc779aSAndroid Build Coastguard Worker     *ptr_buf2++ = r3 + s4;
1189*15dc779aSAndroid Build Coastguard Worker     *ptr_buf2++ = s3 - r4;
1190*15dc779aSAndroid Build Coastguard Worker     *ptr_buf2++ = r1 - s2;
1191*15dc779aSAndroid Build Coastguard Worker     *ptr_buf2++ = s1 + r2;
1192*15dc779aSAndroid Build Coastguard Worker     ptr_buf3 = ptr_buf1;
1193*15dc779aSAndroid Build Coastguard Worker   }
1194*15dc779aSAndroid Build Coastguard Worker 
1195*15dc779aSAndroid Build Coastguard Worker   idx = 0;
1196*15dc779aSAndroid Build Coastguard Worker   ixheaace_cfft_15_twiddle(ptr_out_fft3);
1197*15dc779aSAndroid Build Coastguard Worker 
1198*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < FFT5; i++) {
1199*15dc779aSAndroid Build Coastguard Worker     xr_0 = ptr_out_fft3[0];
1200*15dc779aSAndroid Build Coastguard Worker     xi_0 = ptr_out_fft3[1];
1201*15dc779aSAndroid Build Coastguard Worker 
1202*15dc779aSAndroid Build Coastguard Worker     xr_1 = ptr_out_fft3[10];
1203*15dc779aSAndroid Build Coastguard Worker     xi_1 = ptr_out_fft3[11];
1204*15dc779aSAndroid Build Coastguard Worker 
1205*15dc779aSAndroid Build Coastguard Worker     xr_2 = ptr_out_fft3[20];
1206*15dc779aSAndroid Build Coastguard Worker     xi_2 = ptr_out_fft3[21];
1207*15dc779aSAndroid Build Coastguard Worker 
1208*15dc779aSAndroid Build Coastguard Worker     x_01_r = (xr_0 + xr_1);
1209*15dc779aSAndroid Build Coastguard Worker     x_01_i = (xi_0 + xi_1);
1210*15dc779aSAndroid Build Coastguard Worker 
1211*15dc779aSAndroid Build Coastguard Worker     add_r = (xr_1 + xr_2);
1212*15dc779aSAndroid Build Coastguard Worker     add_i = (xi_1 + xi_2);
1213*15dc779aSAndroid Build Coastguard Worker 
1214*15dc779aSAndroid Build Coastguard Worker     sub_r = (xr_1 - xr_2);
1215*15dc779aSAndroid Build Coastguard Worker     sub_i = (xi_1 - xi_2);
1216*15dc779aSAndroid Build Coastguard Worker 
1217*15dc779aSAndroid Build Coastguard Worker     p1 = add_r / 2;
1218*15dc779aSAndroid Build Coastguard Worker 
1219*15dc779aSAndroid Build Coastguard Worker     p2 = (sub_i * sin_mu_flt);
1220*15dc779aSAndroid Build Coastguard Worker     p3 = (sub_r * sin_mu_flt);
1221*15dc779aSAndroid Build Coastguard Worker 
1222*15dc779aSAndroid Build Coastguard Worker     p4 = add_i / 2;
1223*15dc779aSAndroid Build Coastguard Worker 
1224*15dc779aSAndroid Build Coastguard Worker     temp = (xr_0 - p1);
1225*15dc779aSAndroid Build Coastguard Worker     temp1 = (xi_0 + p3);
1226*15dc779aSAndroid Build Coastguard Worker     temp2 = (xi_0 - p3);
1227*15dc779aSAndroid Build Coastguard Worker 
1228*15dc779aSAndroid Build Coastguard Worker     ptr_op[idx] = (x_01_r + xr_2);
1229*15dc779aSAndroid Build Coastguard Worker     ptr_op[idx + 1] = (x_01_i + xi_2);
1230*15dc779aSAndroid Build Coastguard Worker 
1231*15dc779aSAndroid Build Coastguard Worker     idx = idx + 320;
1232*15dc779aSAndroid Build Coastguard Worker     ptr_op[idx] = (temp + p2);
1233*15dc779aSAndroid Build Coastguard Worker     ptr_op[idx + 1] = (temp2 - p4);
1234*15dc779aSAndroid Build Coastguard Worker 
1235*15dc779aSAndroid Build Coastguard Worker     idx = idx + 320;
1236*15dc779aSAndroid Build Coastguard Worker     ptr_op[idx] = (temp - p2);
1237*15dc779aSAndroid Build Coastguard Worker     ptr_op[idx + 1] = (temp1 - p4);
1238*15dc779aSAndroid Build Coastguard Worker     ptr_out_fft3 += 2;
1239*15dc779aSAndroid Build Coastguard Worker     idx = idx - 576;
1240*15dc779aSAndroid Build Coastguard Worker   }
1241*15dc779aSAndroid Build Coastguard Worker }
1242*15dc779aSAndroid Build Coastguard Worker 
ixheaace_cfft_twiddle_mult(FLOAT32 * ptr_inp,FLOAT32 * ptr_op,WORD32 dim1,WORD32 dim2,const FLOAT32 * ptr_tw_flt,const FLOAT32 * ptr_tw_h_flt)1243*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_cfft_twiddle_mult(FLOAT32 *ptr_inp, FLOAT32 *ptr_op, WORD32 dim1,
1244*15dc779aSAndroid Build Coastguard Worker                                        WORD32 dim2, const FLOAT32 *ptr_tw_flt,
1245*15dc779aSAndroid Build Coastguard Worker                                        const FLOAT32 *ptr_tw_h_flt) {
1246*15dc779aSAndroid Build Coastguard Worker   FLOAT32 accu1, accu2;
1247*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j;
1248*15dc779aSAndroid Build Coastguard Worker   WORD32 step_val = (dim2 - 1) << 1;
1249*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < dim2; i++) {
1250*15dc779aSAndroid Build Coastguard Worker     ptr_op[0] = ptr_inp[0];
1251*15dc779aSAndroid Build Coastguard Worker     ptr_op[1] = ptr_inp[1];
1252*15dc779aSAndroid Build Coastguard Worker     ptr_op += 2;
1253*15dc779aSAndroid Build Coastguard Worker     ptr_inp += 2;
1254*15dc779aSAndroid Build Coastguard Worker   }
1255*15dc779aSAndroid Build Coastguard Worker 
1256*15dc779aSAndroid Build Coastguard Worker   for (j = 0; j < (dim1 - 1); j++) {
1257*15dc779aSAndroid Build Coastguard Worker     ptr_op[0] = ptr_inp[0];
1258*15dc779aSAndroid Build Coastguard Worker     ptr_op[1] = ptr_inp[1];
1259*15dc779aSAndroid Build Coastguard Worker     ptr_inp += 2;
1260*15dc779aSAndroid Build Coastguard Worker     ptr_op += 2;
1261*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < (dim2 - 1); i++) {
1262*15dc779aSAndroid Build Coastguard Worker       ixheaace_cplx_mult_twid(&accu1, &accu2, ptr_inp[2 * i + 0], ptr_inp[2 * i + 1],
1263*15dc779aSAndroid Build Coastguard Worker                               ptr_tw_flt[i], ptr_tw_h_flt[i]);
1264*15dc779aSAndroid Build Coastguard Worker       ptr_op[2 * i + 0] = accu1;
1265*15dc779aSAndroid Build Coastguard Worker       ptr_op[2 * i + 1] = accu2;
1266*15dc779aSAndroid Build Coastguard Worker     }
1267*15dc779aSAndroid Build Coastguard Worker     ptr_inp += step_val;
1268*15dc779aSAndroid Build Coastguard Worker     ptr_op += step_val;
1269*15dc779aSAndroid Build Coastguard Worker     ptr_tw_flt += (dim2 - 1);
1270*15dc779aSAndroid Build Coastguard Worker     ptr_tw_h_flt += (dim2 - 1);
1271*15dc779aSAndroid Build Coastguard Worker   }
1272*15dc779aSAndroid Build Coastguard Worker }
1273*15dc779aSAndroid Build Coastguard Worker 
ixheaace_cfft_32_480(FLOAT32 * ptr_in,FLOAT32 * ptr_out)1274*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_cfft_32_480(FLOAT32 *ptr_in, FLOAT32 *ptr_out) {
1275*15dc779aSAndroid Build Coastguard Worker   WORD32 i, l1, l2, h2;
1276*15dc779aSAndroid Build Coastguard Worker   FLOAT32 xh0_0, xh1_0, xl0_0, xl1_0;
1277*15dc779aSAndroid Build Coastguard Worker   FLOAT32 xh0_1, xh1_1, xl0_1, xl1_1;
1278*15dc779aSAndroid Build Coastguard Worker   FLOAT32 x_0, x_1, x_2, x_3;
1279*15dc779aSAndroid Build Coastguard Worker   FLOAT32 x_4, x_5, x_6, x_7;
1280*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_x;
1281*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_y;
1282*15dc779aSAndroid Build Coastguard Worker   FLOAT32 interm_y[FFT32X2];
1283*15dc779aSAndroid Build Coastguard Worker   FLOAT32 n00, n10, n20, n30, n01, n11, n21, n31;
1284*15dc779aSAndroid Build Coastguard Worker 
1285*15dc779aSAndroid Build Coastguard Worker   FLOAT32 inp_0qi, inp_0qr;
1286*15dc779aSAndroid Build Coastguard Worker   FLOAT32 inp_1qi, inp_1qr;
1287*15dc779aSAndroid Build Coastguard Worker   FLOAT32 inp_2qi, inp_2qr;
1288*15dc779aSAndroid Build Coastguard Worker   FLOAT32 inp_3qi, inp_3qr;
1289*15dc779aSAndroid Build Coastguard Worker   FLOAT32 mul_0qi, mul_0qr;
1290*15dc779aSAndroid Build Coastguard Worker   FLOAT32 mul_1qi, mul_1qr;
1291*15dc779aSAndroid Build Coastguard Worker   FLOAT32 mul_2qi, mul_2qr;
1292*15dc779aSAndroid Build Coastguard Worker   FLOAT32 mul_3qi, mul_3qr;
1293*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sum_0qi, sum_0qr;
1294*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sum_1qi, sum_1qr;
1295*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sum_2qi, sum_2qr;
1296*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sum_3qi, sum_3qr;
1297*15dc779aSAndroid Build Coastguard Worker   WORD32 idx1 = 0, idx2 = FFT15 * FFT32;
1298*15dc779aSAndroid Build Coastguard Worker   FLOAT32 mul_i, mul_r;
1299*15dc779aSAndroid Build Coastguard Worker 
1300*15dc779aSAndroid Build Coastguard Worker   ptr_x = ptr_in;
1301*15dc779aSAndroid Build Coastguard Worker 
1302*15dc779aSAndroid Build Coastguard Worker   // This computes first and second stage butterflies. So, 4-point FFT is done.
1303*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 8; i++) {
1304*15dc779aSAndroid Build Coastguard Worker     x_0 = ptr_x[0];
1305*15dc779aSAndroid Build Coastguard Worker     x_1 = ptr_x[1];
1306*15dc779aSAndroid Build Coastguard Worker     x_2 = ptr_x[16];
1307*15dc779aSAndroid Build Coastguard Worker     x_3 = ptr_x[16 + 1];
1308*15dc779aSAndroid Build Coastguard Worker     x_4 = ptr_x[32];
1309*15dc779aSAndroid Build Coastguard Worker     x_5 = ptr_x[32 + 1];
1310*15dc779aSAndroid Build Coastguard Worker     x_6 = ptr_x[48];
1311*15dc779aSAndroid Build Coastguard Worker     x_7 = ptr_x[48 + 1];
1312*15dc779aSAndroid Build Coastguard Worker 
1313*15dc779aSAndroid Build Coastguard Worker     xh0_0 = x_0 + x_4;
1314*15dc779aSAndroid Build Coastguard Worker     xh1_0 = x_1 + x_5;
1315*15dc779aSAndroid Build Coastguard Worker     xl0_0 = x_0 - x_4;
1316*15dc779aSAndroid Build Coastguard Worker     xl1_0 = x_1 - x_5;
1317*15dc779aSAndroid Build Coastguard Worker     xh0_1 = x_2 + x_6;
1318*15dc779aSAndroid Build Coastguard Worker     xh1_1 = x_3 + x_7;
1319*15dc779aSAndroid Build Coastguard Worker     xl0_1 = x_2 - x_6;
1320*15dc779aSAndroid Build Coastguard Worker     xl1_1 = x_3 - x_7;
1321*15dc779aSAndroid Build Coastguard Worker 
1322*15dc779aSAndroid Build Coastguard Worker     n00 = xh0_0 + xh0_1;
1323*15dc779aSAndroid Build Coastguard Worker     n01 = xh1_0 + xh1_1;
1324*15dc779aSAndroid Build Coastguard Worker     n10 = xl0_0 + xl1_1;
1325*15dc779aSAndroid Build Coastguard Worker     n11 = xl1_0 - xl0_1;
1326*15dc779aSAndroid Build Coastguard Worker     n20 = xh0_0 - xh0_1;
1327*15dc779aSAndroid Build Coastguard Worker     n21 = xh1_0 - xh1_1;
1328*15dc779aSAndroid Build Coastguard Worker     n30 = xl0_0 - xl1_1;
1329*15dc779aSAndroid Build Coastguard Worker     n31 = xl1_0 + xl0_1;
1330*15dc779aSAndroid Build Coastguard Worker 
1331*15dc779aSAndroid Build Coastguard Worker     ptr_x[0] = n00;
1332*15dc779aSAndroid Build Coastguard Worker     ptr_x[1] = n01;
1333*15dc779aSAndroid Build Coastguard Worker     ptr_x[16] = n10;
1334*15dc779aSAndroid Build Coastguard Worker     ptr_x[16 + 1] = n11;
1335*15dc779aSAndroid Build Coastguard Worker     ptr_x[32] = n20;
1336*15dc779aSAndroid Build Coastguard Worker     ptr_x[32 + 1] = n21;
1337*15dc779aSAndroid Build Coastguard Worker     ptr_x[48] = n30;
1338*15dc779aSAndroid Build Coastguard Worker     ptr_x[48 + 1] = n31;
1339*15dc779aSAndroid Build Coastguard Worker 
1340*15dc779aSAndroid Build Coastguard Worker     ptr_x += 2;
1341*15dc779aSAndroid Build Coastguard Worker   }
1342*15dc779aSAndroid Build Coastguard Worker 
1343*15dc779aSAndroid Build Coastguard Worker   // This computes third and fourth stage butterflies. So, next 4-point FFT is done.
1344*15dc779aSAndroid Build Coastguard Worker   {
1345*15dc779aSAndroid Build Coastguard Worker     h2 = 16 >> 1;
1346*15dc779aSAndroid Build Coastguard Worker     l1 = 16;
1347*15dc779aSAndroid Build Coastguard Worker     l2 = 16 + (16 >> 1);
1348*15dc779aSAndroid Build Coastguard Worker 
1349*15dc779aSAndroid Build Coastguard Worker     ptr_x = ptr_in;
1350*15dc779aSAndroid Build Coastguard Worker     ptr_y = &interm_y[0];
1351*15dc779aSAndroid Build Coastguard Worker 
1352*15dc779aSAndroid Build Coastguard Worker     /* Butter fly summation in 2 steps */
1353*15dc779aSAndroid Build Coastguard Worker     inp_0qr = ptr_x[0];
1354*15dc779aSAndroid Build Coastguard Worker     inp_0qi = ptr_x[1];
1355*15dc779aSAndroid Build Coastguard Worker     inp_1qr = ptr_x[4];
1356*15dc779aSAndroid Build Coastguard Worker     inp_1qi = ptr_x[5];
1357*15dc779aSAndroid Build Coastguard Worker     inp_2qr = ptr_x[8];
1358*15dc779aSAndroid Build Coastguard Worker     inp_2qi = ptr_x[9];
1359*15dc779aSAndroid Build Coastguard Worker     inp_3qr = ptr_x[12];
1360*15dc779aSAndroid Build Coastguard Worker     inp_3qi = ptr_x[13];
1361*15dc779aSAndroid Build Coastguard Worker 
1362*15dc779aSAndroid Build Coastguard Worker     mul_0qr = inp_0qr;
1363*15dc779aSAndroid Build Coastguard Worker     mul_0qi = inp_0qi;
1364*15dc779aSAndroid Build Coastguard Worker     mul_1qr = inp_1qr;
1365*15dc779aSAndroid Build Coastguard Worker     mul_1qi = inp_1qi;
1366*15dc779aSAndroid Build Coastguard Worker     mul_2qr = inp_2qr;
1367*15dc779aSAndroid Build Coastguard Worker     mul_2qi = inp_2qi;
1368*15dc779aSAndroid Build Coastguard Worker     mul_3qr = inp_3qr;
1369*15dc779aSAndroid Build Coastguard Worker     mul_3qi = inp_3qi;
1370*15dc779aSAndroid Build Coastguard Worker 
1371*15dc779aSAndroid Build Coastguard Worker     sum_0qr = mul_0qr + mul_2qr;
1372*15dc779aSAndroid Build Coastguard Worker     sum_0qi = mul_0qi + mul_2qi;
1373*15dc779aSAndroid Build Coastguard Worker     sum_1qr = mul_0qr - mul_2qr;
1374*15dc779aSAndroid Build Coastguard Worker     sum_1qi = mul_0qi - mul_2qi;
1375*15dc779aSAndroid Build Coastguard Worker     sum_2qr = mul_1qr + mul_3qr;
1376*15dc779aSAndroid Build Coastguard Worker     sum_2qi = mul_1qi + mul_3qi;
1377*15dc779aSAndroid Build Coastguard Worker     sum_3qr = mul_1qr - mul_3qr;
1378*15dc779aSAndroid Build Coastguard Worker     sum_3qi = mul_1qi - mul_3qi;
1379*15dc779aSAndroid Build Coastguard Worker 
1380*15dc779aSAndroid Build Coastguard Worker     ptr_y[0] = sum_0qr + sum_2qr;
1381*15dc779aSAndroid Build Coastguard Worker     ptr_y[1] = sum_0qi + sum_2qi;
1382*15dc779aSAndroid Build Coastguard Worker     ptr_y[h2] = sum_1qr + sum_3qi;
1383*15dc779aSAndroid Build Coastguard Worker     ptr_y[h2 + 1] = sum_1qi - sum_3qr;
1384*15dc779aSAndroid Build Coastguard Worker     ptr_y[l1] = sum_0qr - sum_2qr;
1385*15dc779aSAndroid Build Coastguard Worker     ptr_y[l1 + 1] = sum_0qi - sum_2qi;
1386*15dc779aSAndroid Build Coastguard Worker     ptr_y[l2] = sum_1qr - sum_3qi;
1387*15dc779aSAndroid Build Coastguard Worker     ptr_y[l2 + 1] = sum_1qi + sum_3qr;
1388*15dc779aSAndroid Build Coastguard Worker 
1389*15dc779aSAndroid Build Coastguard Worker     ptr_y += 2;
1390*15dc779aSAndroid Build Coastguard Worker     ptr_x += 16;
1391*15dc779aSAndroid Build Coastguard Worker 
1392*15dc779aSAndroid Build Coastguard Worker     /* 2nd butter fly */
1393*15dc779aSAndroid Build Coastguard Worker 
1394*15dc779aSAndroid Build Coastguard Worker     inp_0qr = ptr_x[0];
1395*15dc779aSAndroid Build Coastguard Worker     inp_0qi = ptr_x[1];
1396*15dc779aSAndroid Build Coastguard Worker     inp_1qr = ptr_x[4];
1397*15dc779aSAndroid Build Coastguard Worker     inp_1qi = ptr_x[5];
1398*15dc779aSAndroid Build Coastguard Worker     inp_2qr = ptr_x[8];
1399*15dc779aSAndroid Build Coastguard Worker     inp_2qi = ptr_x[9];
1400*15dc779aSAndroid Build Coastguard Worker     inp_3qr = ptr_x[12];
1401*15dc779aSAndroid Build Coastguard Worker     inp_3qi = ptr_x[13];
1402*15dc779aSAndroid Build Coastguard Worker 
1403*15dc779aSAndroid Build Coastguard Worker     mul_0qr = inp_0qr;
1404*15dc779aSAndroid Build Coastguard Worker     mul_0qi = inp_0qi;
1405*15dc779aSAndroid Build Coastguard Worker 
1406*15dc779aSAndroid Build Coastguard Worker     mul_1qr = (inp_1qr * 0.461929321f) + (inp_1qi * 0.191329956f);
1407*15dc779aSAndroid Build Coastguard Worker     mul_1qi = (inp_1qr * -0.191329956f) + (inp_1qi * 0.461929321f);
1408*15dc779aSAndroid Build Coastguard Worker 
1409*15dc779aSAndroid Build Coastguard Worker     mul_2qr = ((inp_2qr + inp_2qi) * 0.353546143f);
1410*15dc779aSAndroid Build Coastguard Worker     mul_2qi = ((-inp_2qr + inp_2qi) * 0.353546143f);
1411*15dc779aSAndroid Build Coastguard Worker 
1412*15dc779aSAndroid Build Coastguard Worker     mul_3qr = (inp_3qr * 0.191329956f) + (inp_3qi * 0.461929321f);
1413*15dc779aSAndroid Build Coastguard Worker     mul_3qi = (inp_3qr * -0.461929321f) + (inp_3qi * 0.191329956f);
1414*15dc779aSAndroid Build Coastguard Worker 
1415*15dc779aSAndroid Build Coastguard Worker     sum_0qr = mul_0qr + (mul_2qr * 2);
1416*15dc779aSAndroid Build Coastguard Worker     sum_0qi = mul_0qi + (mul_2qi * 2);
1417*15dc779aSAndroid Build Coastguard Worker     sum_1qr = mul_0qr - (mul_2qr * 2);
1418*15dc779aSAndroid Build Coastguard Worker     sum_1qi = mul_0qi - (mul_2qi * 2);
1419*15dc779aSAndroid Build Coastguard Worker 
1420*15dc779aSAndroid Build Coastguard Worker     sum_2qr = mul_1qr + mul_3qr;
1421*15dc779aSAndroid Build Coastguard Worker     sum_2qi = mul_1qi + mul_3qi;
1422*15dc779aSAndroid Build Coastguard Worker     sum_3qr = mul_1qr - mul_3qr;
1423*15dc779aSAndroid Build Coastguard Worker     sum_3qi = mul_1qi - mul_3qi;
1424*15dc779aSAndroid Build Coastguard Worker 
1425*15dc779aSAndroid Build Coastguard Worker     ptr_y[0] = sum_0qr + (sum_2qr * 2);
1426*15dc779aSAndroid Build Coastguard Worker     ptr_y[1] = sum_0qi + (sum_2qi * 2);
1427*15dc779aSAndroid Build Coastguard Worker     ptr_y[h2] = sum_1qr + (sum_3qi * 2);
1428*15dc779aSAndroid Build Coastguard Worker     ptr_y[h2 + 1] = sum_1qi - (sum_3qr * 2);
1429*15dc779aSAndroid Build Coastguard Worker     ptr_y[l1] = sum_0qr - (sum_2qr * 2);
1430*15dc779aSAndroid Build Coastguard Worker     ptr_y[l1 + 1] = sum_0qi - (sum_2qi * 2);
1431*15dc779aSAndroid Build Coastguard Worker     ptr_y[l2] = sum_1qr - (sum_3qi * 2);
1432*15dc779aSAndroid Build Coastguard Worker     ptr_y[l2 + 1] = sum_1qi + (sum_3qr * 2);
1433*15dc779aSAndroid Build Coastguard Worker 
1434*15dc779aSAndroid Build Coastguard Worker     ptr_y += 2;
1435*15dc779aSAndroid Build Coastguard Worker     ptr_x += 16;
1436*15dc779aSAndroid Build Coastguard Worker 
1437*15dc779aSAndroid Build Coastguard Worker     /* 3rd butter fly */
1438*15dc779aSAndroid Build Coastguard Worker 
1439*15dc779aSAndroid Build Coastguard Worker     inp_0qr = ptr_x[0];
1440*15dc779aSAndroid Build Coastguard Worker     inp_0qi = ptr_x[1];
1441*15dc779aSAndroid Build Coastguard Worker     inp_1qr = ptr_x[4];
1442*15dc779aSAndroid Build Coastguard Worker     inp_1qi = ptr_x[5];
1443*15dc779aSAndroid Build Coastguard Worker     inp_2qr = ptr_x[8];
1444*15dc779aSAndroid Build Coastguard Worker     inp_2qi = ptr_x[9];
1445*15dc779aSAndroid Build Coastguard Worker     inp_3qr = ptr_x[12];
1446*15dc779aSAndroid Build Coastguard Worker     inp_3qi = ptr_x[13];
1447*15dc779aSAndroid Build Coastguard Worker 
1448*15dc779aSAndroid Build Coastguard Worker     mul_0qr = inp_0qr;
1449*15dc779aSAndroid Build Coastguard Worker     mul_0qi = inp_0qi;
1450*15dc779aSAndroid Build Coastguard Worker 
1451*15dc779aSAndroid Build Coastguard Worker     mul_1qr = ((inp_1qr + inp_1qi) * 0.353546143f);
1452*15dc779aSAndroid Build Coastguard Worker     mul_1qi = ((-inp_1qr + inp_1qi) * 0.353546143f);
1453*15dc779aSAndroid Build Coastguard Worker 
1454*15dc779aSAndroid Build Coastguard Worker     mul_2qr = inp_2qi;
1455*15dc779aSAndroid Build Coastguard Worker     mul_2qi = inp_2qr;
1456*15dc779aSAndroid Build Coastguard Worker 
1457*15dc779aSAndroid Build Coastguard Worker     mul_3qr = ((-inp_3qr + inp_3qi) * 0.353546143f);
1458*15dc779aSAndroid Build Coastguard Worker     mul_3qi = ((inp_3qr + inp_3qi) * -0.353546143f);
1459*15dc779aSAndroid Build Coastguard Worker 
1460*15dc779aSAndroid Build Coastguard Worker     sum_0qr = mul_0qr + mul_2qr;
1461*15dc779aSAndroid Build Coastguard Worker     sum_0qi = mul_0qi - mul_2qi;
1462*15dc779aSAndroid Build Coastguard Worker     sum_1qr = mul_0qr - mul_2qr;
1463*15dc779aSAndroid Build Coastguard Worker     sum_1qi = mul_0qi + mul_2qi;
1464*15dc779aSAndroid Build Coastguard Worker     sum_2qr = mul_1qr + mul_3qr;
1465*15dc779aSAndroid Build Coastguard Worker     sum_2qi = mul_1qi + mul_3qi;
1466*15dc779aSAndroid Build Coastguard Worker     sum_3qr = mul_1qr - mul_3qr;
1467*15dc779aSAndroid Build Coastguard Worker     sum_3qi = mul_1qi - mul_3qi;
1468*15dc779aSAndroid Build Coastguard Worker 
1469*15dc779aSAndroid Build Coastguard Worker     ptr_y[0] = sum_0qr + (sum_2qr * 2);
1470*15dc779aSAndroid Build Coastguard Worker     ptr_y[1] = sum_0qi + (sum_2qi * 2);
1471*15dc779aSAndroid Build Coastguard Worker     ptr_y[h2] = sum_1qr + (sum_3qi * 2);
1472*15dc779aSAndroid Build Coastguard Worker     ptr_y[h2 + 1] = sum_1qi - (sum_3qr * 2);
1473*15dc779aSAndroid Build Coastguard Worker     ptr_y[l1] = sum_0qr - (sum_2qr * 2);
1474*15dc779aSAndroid Build Coastguard Worker     ptr_y[l1 + 1] = sum_0qi - (sum_2qi * 2);
1475*15dc779aSAndroid Build Coastguard Worker     ptr_y[l2] = sum_1qr - (sum_3qi * 2);
1476*15dc779aSAndroid Build Coastguard Worker     ptr_y[l2 + 1] = sum_1qi + (sum_3qr * 2);
1477*15dc779aSAndroid Build Coastguard Worker 
1478*15dc779aSAndroid Build Coastguard Worker     ptr_y += 2;
1479*15dc779aSAndroid Build Coastguard Worker     ptr_x += 16;
1480*15dc779aSAndroid Build Coastguard Worker 
1481*15dc779aSAndroid Build Coastguard Worker     /* 4th butter fly */
1482*15dc779aSAndroid Build Coastguard Worker 
1483*15dc779aSAndroid Build Coastguard Worker     inp_0qr = ptr_x[0];
1484*15dc779aSAndroid Build Coastguard Worker     inp_0qi = ptr_x[1];
1485*15dc779aSAndroid Build Coastguard Worker     inp_1qr = ptr_x[4];
1486*15dc779aSAndroid Build Coastguard Worker     inp_1qi = ptr_x[5];
1487*15dc779aSAndroid Build Coastguard Worker     inp_2qr = ptr_x[8];
1488*15dc779aSAndroid Build Coastguard Worker     inp_2qi = ptr_x[9];
1489*15dc779aSAndroid Build Coastguard Worker     inp_3qr = ptr_x[12];
1490*15dc779aSAndroid Build Coastguard Worker     inp_3qi = ptr_x[13];
1491*15dc779aSAndroid Build Coastguard Worker 
1492*15dc779aSAndroid Build Coastguard Worker     mul_0qr = inp_0qr;
1493*15dc779aSAndroid Build Coastguard Worker     mul_0qi = inp_0qi;
1494*15dc779aSAndroid Build Coastguard Worker 
1495*15dc779aSAndroid Build Coastguard Worker     mul_1qr = (inp_1qr * 0.191329956f) + (inp_1qi * 0.461929321f);
1496*15dc779aSAndroid Build Coastguard Worker     mul_1qi = (inp_1qr * -0.461929321f) + (inp_1qi * 0.191329956f);
1497*15dc779aSAndroid Build Coastguard Worker 
1498*15dc779aSAndroid Build Coastguard Worker     mul_2qr = ((-inp_2qr + inp_2qi) * 0.353546143f);
1499*15dc779aSAndroid Build Coastguard Worker     mul_2qi = ((inp_2qr + inp_2qi) * -0.353546143f);
1500*15dc779aSAndroid Build Coastguard Worker 
1501*15dc779aSAndroid Build Coastguard Worker     mul_3qr = (inp_3qr * -0.461929321f) + (inp_3qi * -0.191329956f);
1502*15dc779aSAndroid Build Coastguard Worker     mul_3qi = (inp_3qr * 0.191329956f) + (inp_3qi * -0.461929321f);
1503*15dc779aSAndroid Build Coastguard Worker 
1504*15dc779aSAndroid Build Coastguard Worker     sum_0qr = mul_0qr + (mul_2qr * 2);
1505*15dc779aSAndroid Build Coastguard Worker     sum_0qi = mul_0qi + (mul_2qi * 2);
1506*15dc779aSAndroid Build Coastguard Worker     sum_1qr = mul_0qr - (mul_2qr * 2);
1507*15dc779aSAndroid Build Coastguard Worker     sum_1qi = mul_0qi - (mul_2qi * 2);
1508*15dc779aSAndroid Build Coastguard Worker 
1509*15dc779aSAndroid Build Coastguard Worker     sum_2qr = mul_1qr + mul_3qr;
1510*15dc779aSAndroid Build Coastguard Worker     sum_2qi = mul_1qi + mul_3qi;
1511*15dc779aSAndroid Build Coastguard Worker     sum_3qr = mul_1qr - mul_3qr;
1512*15dc779aSAndroid Build Coastguard Worker     sum_3qi = mul_1qi - mul_3qi;
1513*15dc779aSAndroid Build Coastguard Worker 
1514*15dc779aSAndroid Build Coastguard Worker     ptr_y[0] = sum_0qr + (sum_2qr * 2);
1515*15dc779aSAndroid Build Coastguard Worker     ptr_y[1] = sum_0qi + (sum_2qi * 2);
1516*15dc779aSAndroid Build Coastguard Worker     ptr_y[h2] = sum_1qr + (sum_3qi * 2);
1517*15dc779aSAndroid Build Coastguard Worker     ptr_y[h2 + 1] = sum_1qi - (sum_3qr * 2);
1518*15dc779aSAndroid Build Coastguard Worker     ptr_y[l1] = sum_0qr - (sum_2qr * 2);
1519*15dc779aSAndroid Build Coastguard Worker     ptr_y[l1 + 1] = sum_0qi - (sum_2qi * 2);
1520*15dc779aSAndroid Build Coastguard Worker     ptr_y[l2] = sum_1qr - (sum_3qi * 2);
1521*15dc779aSAndroid Build Coastguard Worker     ptr_y[l2 + 1] = sum_1qi + (sum_3qr * 2);
1522*15dc779aSAndroid Build Coastguard Worker 
1523*15dc779aSAndroid Build Coastguard Worker     ptr_x = ptr_in;
1524*15dc779aSAndroid Build Coastguard Worker     ptr_y = &interm_y[32];
1525*15dc779aSAndroid Build Coastguard Worker 
1526*15dc779aSAndroid Build Coastguard Worker     /* Butter fly summation in 2 steps */
1527*15dc779aSAndroid Build Coastguard Worker     inp_0qr = ptr_x[2];
1528*15dc779aSAndroid Build Coastguard Worker     inp_0qi = ptr_x[3];
1529*15dc779aSAndroid Build Coastguard Worker     inp_1qr = ptr_x[6];
1530*15dc779aSAndroid Build Coastguard Worker     inp_1qi = ptr_x[7];
1531*15dc779aSAndroid Build Coastguard Worker     inp_2qr = ptr_x[10];
1532*15dc779aSAndroid Build Coastguard Worker     inp_2qi = ptr_x[11];
1533*15dc779aSAndroid Build Coastguard Worker     inp_3qr = ptr_x[14];
1534*15dc779aSAndroid Build Coastguard Worker     inp_3qi = ptr_x[15];
1535*15dc779aSAndroid Build Coastguard Worker 
1536*15dc779aSAndroid Build Coastguard Worker     mul_0qr = inp_0qr;
1537*15dc779aSAndroid Build Coastguard Worker     mul_0qi = inp_0qi;
1538*15dc779aSAndroid Build Coastguard Worker     mul_1qr = inp_1qr;
1539*15dc779aSAndroid Build Coastguard Worker     mul_1qi = inp_1qi;
1540*15dc779aSAndroid Build Coastguard Worker     mul_2qr = inp_2qr;
1541*15dc779aSAndroid Build Coastguard Worker     mul_2qi = inp_2qi;
1542*15dc779aSAndroid Build Coastguard Worker     mul_3qr = inp_3qr;
1543*15dc779aSAndroid Build Coastguard Worker     mul_3qi = inp_3qi;
1544*15dc779aSAndroid Build Coastguard Worker 
1545*15dc779aSAndroid Build Coastguard Worker     sum_0qr = mul_0qr + mul_2qr;
1546*15dc779aSAndroid Build Coastguard Worker     sum_0qi = mul_0qi + mul_2qi;
1547*15dc779aSAndroid Build Coastguard Worker     sum_1qr = mul_0qr - mul_2qr;
1548*15dc779aSAndroid Build Coastguard Worker     sum_1qi = mul_0qi - mul_2qi;
1549*15dc779aSAndroid Build Coastguard Worker     sum_2qr = mul_1qr + mul_3qr;
1550*15dc779aSAndroid Build Coastguard Worker     sum_2qi = mul_1qi + mul_3qi;
1551*15dc779aSAndroid Build Coastguard Worker     sum_3qr = mul_1qr - mul_3qr;
1552*15dc779aSAndroid Build Coastguard Worker     sum_3qi = mul_1qi - mul_3qi;
1553*15dc779aSAndroid Build Coastguard Worker 
1554*15dc779aSAndroid Build Coastguard Worker     ptr_y[0] = sum_0qr + sum_2qr;
1555*15dc779aSAndroid Build Coastguard Worker     ptr_y[1] = sum_0qi + sum_2qi;
1556*15dc779aSAndroid Build Coastguard Worker     ptr_y[h2] = sum_1qr + sum_3qi;
1557*15dc779aSAndroid Build Coastguard Worker     ptr_y[h2 + 1] = sum_1qi - sum_3qr;
1558*15dc779aSAndroid Build Coastguard Worker     ptr_y[l1] = sum_0qr - sum_2qr;
1559*15dc779aSAndroid Build Coastguard Worker     ptr_y[l1 + 1] = sum_0qi - sum_2qi;
1560*15dc779aSAndroid Build Coastguard Worker     ptr_y[l2] = sum_1qr - sum_3qi;
1561*15dc779aSAndroid Build Coastguard Worker     ptr_y[l2 + 1] = sum_1qi + sum_3qr;
1562*15dc779aSAndroid Build Coastguard Worker 
1563*15dc779aSAndroid Build Coastguard Worker     ptr_y += 2;
1564*15dc779aSAndroid Build Coastguard Worker     ptr_x += 16;
1565*15dc779aSAndroid Build Coastguard Worker 
1566*15dc779aSAndroid Build Coastguard Worker     /* 2nd butter fly */
1567*15dc779aSAndroid Build Coastguard Worker 
1568*15dc779aSAndroid Build Coastguard Worker     inp_0qr = ptr_x[2];
1569*15dc779aSAndroid Build Coastguard Worker     inp_0qi = ptr_x[3];
1570*15dc779aSAndroid Build Coastguard Worker     inp_1qr = ptr_x[6];
1571*15dc779aSAndroid Build Coastguard Worker     inp_1qi = ptr_x[7];
1572*15dc779aSAndroid Build Coastguard Worker     inp_2qr = ptr_x[10];
1573*15dc779aSAndroid Build Coastguard Worker     inp_2qi = ptr_x[11];
1574*15dc779aSAndroid Build Coastguard Worker     inp_3qr = ptr_x[14];
1575*15dc779aSAndroid Build Coastguard Worker     inp_3qi = ptr_x[15];
1576*15dc779aSAndroid Build Coastguard Worker 
1577*15dc779aSAndroid Build Coastguard Worker     mul_0qr = inp_0qr;
1578*15dc779aSAndroid Build Coastguard Worker     mul_0qi = inp_0qi;
1579*15dc779aSAndroid Build Coastguard Worker 
1580*15dc779aSAndroid Build Coastguard Worker     mul_1qr = (inp_1qr * 0.461929321f) + (inp_1qi * 0.191329956f);
1581*15dc779aSAndroid Build Coastguard Worker     mul_1qi = (inp_1qr * -0.191329956f) + (inp_1qi * 0.461929321f);
1582*15dc779aSAndroid Build Coastguard Worker 
1583*15dc779aSAndroid Build Coastguard Worker     mul_2qr = ((inp_2qr + inp_2qi) * 0.353546143f);
1584*15dc779aSAndroid Build Coastguard Worker     mul_2qi = ((-inp_2qr + inp_2qi) * 0.353546143f);
1585*15dc779aSAndroid Build Coastguard Worker 
1586*15dc779aSAndroid Build Coastguard Worker     mul_3qr = (inp_3qr * 0.191329956f) + (inp_3qi * 0.461929321f);
1587*15dc779aSAndroid Build Coastguard Worker     mul_3qi = (inp_3qr * -0.461929321f) + (inp_3qi * 0.191329956f);
1588*15dc779aSAndroid Build Coastguard Worker 
1589*15dc779aSAndroid Build Coastguard Worker     sum_0qr = mul_0qr + (mul_2qr * 2);
1590*15dc779aSAndroid Build Coastguard Worker     sum_0qi = mul_0qi + (mul_2qi * 2);
1591*15dc779aSAndroid Build Coastguard Worker     sum_1qr = mul_0qr - (mul_2qr * 2);
1592*15dc779aSAndroid Build Coastguard Worker     sum_1qi = mul_0qi - (mul_2qi * 2);
1593*15dc779aSAndroid Build Coastguard Worker 
1594*15dc779aSAndroid Build Coastguard Worker     sum_2qr = mul_1qr + mul_3qr;
1595*15dc779aSAndroid Build Coastguard Worker     sum_2qi = mul_1qi + mul_3qi;
1596*15dc779aSAndroid Build Coastguard Worker     sum_3qr = mul_1qr - mul_3qr;
1597*15dc779aSAndroid Build Coastguard Worker     sum_3qi = mul_1qi - mul_3qi;
1598*15dc779aSAndroid Build Coastguard Worker 
1599*15dc779aSAndroid Build Coastguard Worker     ptr_y[0] = sum_0qr + (sum_2qr * 2);
1600*15dc779aSAndroid Build Coastguard Worker     ptr_y[1] = sum_0qi + (sum_2qi * 2);
1601*15dc779aSAndroid Build Coastguard Worker     ptr_y[h2] = sum_1qr + (sum_3qi * 2);
1602*15dc779aSAndroid Build Coastguard Worker     ptr_y[h2 + 1] = sum_1qi - (sum_3qr * 2);
1603*15dc779aSAndroid Build Coastguard Worker     ptr_y[l1] = sum_0qr - (sum_2qr * 2);
1604*15dc779aSAndroid Build Coastguard Worker     ptr_y[l1 + 1] = sum_0qi - (sum_2qi * 2);
1605*15dc779aSAndroid Build Coastguard Worker     ptr_y[l2] = sum_1qr - (sum_3qi * 2);
1606*15dc779aSAndroid Build Coastguard Worker     ptr_y[l2 + 1] = sum_1qi + (sum_3qr * 2);
1607*15dc779aSAndroid Build Coastguard Worker 
1608*15dc779aSAndroid Build Coastguard Worker     ptr_y += 2;
1609*15dc779aSAndroid Build Coastguard Worker     ptr_x += 16;
1610*15dc779aSAndroid Build Coastguard Worker 
1611*15dc779aSAndroid Build Coastguard Worker     /* 3rd butter fly */
1612*15dc779aSAndroid Build Coastguard Worker 
1613*15dc779aSAndroid Build Coastguard Worker     inp_0qr = ptr_x[2];
1614*15dc779aSAndroid Build Coastguard Worker     inp_0qi = ptr_x[3];
1615*15dc779aSAndroid Build Coastguard Worker     inp_1qr = ptr_x[6];
1616*15dc779aSAndroid Build Coastguard Worker     inp_1qi = ptr_x[7];
1617*15dc779aSAndroid Build Coastguard Worker     inp_2qr = ptr_x[10];
1618*15dc779aSAndroid Build Coastguard Worker     inp_2qi = ptr_x[11];
1619*15dc779aSAndroid Build Coastguard Worker     inp_3qr = ptr_x[14];
1620*15dc779aSAndroid Build Coastguard Worker     inp_3qi = ptr_x[15];
1621*15dc779aSAndroid Build Coastguard Worker 
1622*15dc779aSAndroid Build Coastguard Worker     mul_0qr = inp_0qr;
1623*15dc779aSAndroid Build Coastguard Worker     mul_0qi = inp_0qi;
1624*15dc779aSAndroid Build Coastguard Worker 
1625*15dc779aSAndroid Build Coastguard Worker     mul_1qr = ((inp_1qr + inp_1qi) * 0.353546143f);
1626*15dc779aSAndroid Build Coastguard Worker     mul_1qi = ((-inp_1qr + inp_1qi) * 0.353546143f);
1627*15dc779aSAndroid Build Coastguard Worker 
1628*15dc779aSAndroid Build Coastguard Worker     mul_2qr = inp_2qi;
1629*15dc779aSAndroid Build Coastguard Worker     mul_2qi = inp_2qr;
1630*15dc779aSAndroid Build Coastguard Worker 
1631*15dc779aSAndroid Build Coastguard Worker     mul_3qr = ((-inp_3qr + inp_3qi) * 0.353546143f);
1632*15dc779aSAndroid Build Coastguard Worker     mul_3qi = ((inp_3qr + inp_3qi) * -0.353546143f);
1633*15dc779aSAndroid Build Coastguard Worker 
1634*15dc779aSAndroid Build Coastguard Worker     sum_0qr = mul_0qr + mul_2qr;
1635*15dc779aSAndroid Build Coastguard Worker     sum_0qi = mul_0qi - mul_2qi;
1636*15dc779aSAndroid Build Coastguard Worker     sum_1qr = mul_0qr - mul_2qr;
1637*15dc779aSAndroid Build Coastguard Worker     sum_1qi = mul_0qi + mul_2qi;
1638*15dc779aSAndroid Build Coastguard Worker     sum_2qr = mul_1qr + mul_3qr;
1639*15dc779aSAndroid Build Coastguard Worker     sum_2qi = mul_1qi + mul_3qi;
1640*15dc779aSAndroid Build Coastguard Worker     sum_3qr = mul_1qr - mul_3qr;
1641*15dc779aSAndroid Build Coastguard Worker     sum_3qi = mul_1qi - mul_3qi;
1642*15dc779aSAndroid Build Coastguard Worker 
1643*15dc779aSAndroid Build Coastguard Worker     ptr_y[0] = sum_0qr + (sum_2qr * 2);
1644*15dc779aSAndroid Build Coastguard Worker     ptr_y[1] = sum_0qi + (sum_2qi * 2);
1645*15dc779aSAndroid Build Coastguard Worker     ptr_y[h2] = sum_1qr + (sum_3qi * 2);
1646*15dc779aSAndroid Build Coastguard Worker     ptr_y[h2 + 1] = sum_1qi - (sum_3qr * 2);
1647*15dc779aSAndroid Build Coastguard Worker     ptr_y[l1] = sum_0qr - (sum_2qr * 2);
1648*15dc779aSAndroid Build Coastguard Worker     ptr_y[l1 + 1] = sum_0qi - (sum_2qi * 2);
1649*15dc779aSAndroid Build Coastguard Worker     ptr_y[l2] = sum_1qr - (sum_3qi * 2);
1650*15dc779aSAndroid Build Coastguard Worker     ptr_y[l2 + 1] = sum_1qi + (sum_3qr * 2);
1651*15dc779aSAndroid Build Coastguard Worker 
1652*15dc779aSAndroid Build Coastguard Worker     ptr_y += 2;
1653*15dc779aSAndroid Build Coastguard Worker     ptr_x += 16;
1654*15dc779aSAndroid Build Coastguard Worker 
1655*15dc779aSAndroid Build Coastguard Worker     /* 4th butter fly */
1656*15dc779aSAndroid Build Coastguard Worker 
1657*15dc779aSAndroid Build Coastguard Worker     inp_0qr = ptr_x[2];
1658*15dc779aSAndroid Build Coastguard Worker     inp_0qi = ptr_x[3];
1659*15dc779aSAndroid Build Coastguard Worker     inp_1qr = ptr_x[6];
1660*15dc779aSAndroid Build Coastguard Worker     inp_1qi = ptr_x[7];
1661*15dc779aSAndroid Build Coastguard Worker     inp_2qr = ptr_x[10];
1662*15dc779aSAndroid Build Coastguard Worker     inp_2qi = ptr_x[11];
1663*15dc779aSAndroid Build Coastguard Worker     inp_3qr = ptr_x[14];
1664*15dc779aSAndroid Build Coastguard Worker     inp_3qi = ptr_x[15];
1665*15dc779aSAndroid Build Coastguard Worker 
1666*15dc779aSAndroid Build Coastguard Worker     mul_0qr = inp_0qr;
1667*15dc779aSAndroid Build Coastguard Worker     mul_0qi = inp_0qi;
1668*15dc779aSAndroid Build Coastguard Worker 
1669*15dc779aSAndroid Build Coastguard Worker     mul_1qr = (inp_1qr * 0.191329956f) + (inp_1qi * 0.461929321f);
1670*15dc779aSAndroid Build Coastguard Worker     mul_1qi = (inp_1qr * -0.461929321f) + (inp_1qi * 0.191329956f);
1671*15dc779aSAndroid Build Coastguard Worker 
1672*15dc779aSAndroid Build Coastguard Worker     mul_2qr = ((-inp_2qr + inp_2qi) * 0.353546143f);
1673*15dc779aSAndroid Build Coastguard Worker     mul_2qi = ((inp_2qr + inp_2qi) * -0.353546143f);
1674*15dc779aSAndroid Build Coastguard Worker 
1675*15dc779aSAndroid Build Coastguard Worker     mul_3qr = (inp_3qr * -0.461929321f) + (inp_3qi * -0.191329956f);
1676*15dc779aSAndroid Build Coastguard Worker     mul_3qi = (inp_3qr * 0.191329956f) + (inp_3qi * -0.461929321f);
1677*15dc779aSAndroid Build Coastguard Worker 
1678*15dc779aSAndroid Build Coastguard Worker     sum_0qr = mul_0qr + (mul_2qr * 2);
1679*15dc779aSAndroid Build Coastguard Worker     sum_0qi = mul_0qi + (mul_2qi * 2);
1680*15dc779aSAndroid Build Coastguard Worker     sum_1qr = mul_0qr - (mul_2qr * 2);
1681*15dc779aSAndroid Build Coastguard Worker     sum_1qi = mul_0qi - (mul_2qi * 2);
1682*15dc779aSAndroid Build Coastguard Worker 
1683*15dc779aSAndroid Build Coastguard Worker     sum_2qr = mul_1qr + mul_3qr;
1684*15dc779aSAndroid Build Coastguard Worker     sum_2qi = mul_1qi + mul_3qi;
1685*15dc779aSAndroid Build Coastguard Worker     sum_3qr = mul_1qr - mul_3qr;
1686*15dc779aSAndroid Build Coastguard Worker     sum_3qi = mul_1qi - mul_3qi;
1687*15dc779aSAndroid Build Coastguard Worker 
1688*15dc779aSAndroid Build Coastguard Worker     ptr_y[0] = sum_0qr + (sum_2qr * 2);
1689*15dc779aSAndroid Build Coastguard Worker     ptr_y[1] = sum_0qi + (sum_2qi * 2);
1690*15dc779aSAndroid Build Coastguard Worker     ptr_y[h2] = sum_1qr + (sum_3qi * 2);
1691*15dc779aSAndroid Build Coastguard Worker     ptr_y[h2 + 1] = sum_1qi - (sum_3qr * 2);
1692*15dc779aSAndroid Build Coastguard Worker     ptr_y[l1] = sum_0qr - (sum_2qr * 2);
1693*15dc779aSAndroid Build Coastguard Worker     ptr_y[l1 + 1] = sum_0qi - (sum_2qi * 2);
1694*15dc779aSAndroid Build Coastguard Worker     ptr_y[l2] = sum_1qr - (sum_3qi * 2);
1695*15dc779aSAndroid Build Coastguard Worker     ptr_y[l2 + 1] = sum_1qi + (sum_3qr * 2);
1696*15dc779aSAndroid Build Coastguard Worker   }
1697*15dc779aSAndroid Build Coastguard Worker 
1698*15dc779aSAndroid Build Coastguard Worker   // Last stage of 32 point FFT
1699*15dc779aSAndroid Build Coastguard Worker   {
1700*15dc779aSAndroid Build Coastguard Worker     ptr_y = ptr_out;
1701*15dc779aSAndroid Build Coastguard Worker     ptr_y[idx1] = interm_y[0] + interm_y[32];
1702*15dc779aSAndroid Build Coastguard Worker     ptr_y[idx1 + 1] = interm_y[1] + interm_y[33];
1703*15dc779aSAndroid Build Coastguard Worker     ptr_y[idx2] = interm_y[0] - interm_y[32];
1704*15dc779aSAndroid Build Coastguard Worker     ptr_y[idx2 + 1] = interm_y[1] - interm_y[33];
1705*15dc779aSAndroid Build Coastguard Worker     idx1 += FFT15X2;
1706*15dc779aSAndroid Build Coastguard Worker     idx2 += FFT15X2;
1707*15dc779aSAndroid Build Coastguard Worker     for (i = 1; i < FFT16; i++) {
1708*15dc779aSAndroid Build Coastguard Worker       mul_r = (interm_y[FFT32 + 2 * i + 0] * ixheaace_fft_mix_rad_twid_tbl_32[i - 1]) -
1709*15dc779aSAndroid Build Coastguard Worker               (interm_y[FFT32 + 2 * i + 1] * ixheaace_fft_mix_rad_twid_tbl_h_32[i - 1]);
1710*15dc779aSAndroid Build Coastguard Worker       mul_i = (interm_y[FFT32 + 2 * i + 0] * ixheaace_fft_mix_rad_twid_tbl_h_32[i - 1]) +
1711*15dc779aSAndroid Build Coastguard Worker               (interm_y[FFT32 + 2 * i + 1] * ixheaace_fft_mix_rad_twid_tbl_32[i - 1]);
1712*15dc779aSAndroid Build Coastguard Worker 
1713*15dc779aSAndroid Build Coastguard Worker       mul_r = mul_r / 2;
1714*15dc779aSAndroid Build Coastguard Worker       mul_i = mul_i / 2;
1715*15dc779aSAndroid Build Coastguard Worker       ptr_y[idx1] = interm_y[2 * i + 0] + (mul_r * 2);
1716*15dc779aSAndroid Build Coastguard Worker       ptr_y[idx1 + 1] = interm_y[2 * i + 1] + (mul_i * 2);
1717*15dc779aSAndroid Build Coastguard Worker       ptr_y[idx2] = interm_y[2 * i + 0] - (mul_r * 2);
1718*15dc779aSAndroid Build Coastguard Worker       ptr_y[idx2 + 1] = interm_y[2 * i + 1] - (mul_i * 2);
1719*15dc779aSAndroid Build Coastguard Worker       idx1 += FFT15X2;
1720*15dc779aSAndroid Build Coastguard Worker       idx2 += FFT15X2;
1721*15dc779aSAndroid Build Coastguard Worker     }
1722*15dc779aSAndroid Build Coastguard Worker   }
1723*15dc779aSAndroid Build Coastguard Worker }
1724*15dc779aSAndroid Build Coastguard Worker 
ixheaace_dec_rearrange_short_flt(FLOAT32 * ptr_in,FLOAT32 * ptr_out,WORD32 N,const WORD16 * ptr_re_arr_tab)1725*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_dec_rearrange_short_flt(FLOAT32 *ptr_in, FLOAT32 *ptr_out, WORD32 N,
1726*15dc779aSAndroid Build Coastguard Worker                                              const WORD16 *ptr_re_arr_tab) {
1727*15dc779aSAndroid Build Coastguard Worker   WORD32 n, i = 0;
1728*15dc779aSAndroid Build Coastguard Worker 
1729*15dc779aSAndroid Build Coastguard Worker   for (n = 0; n < N; n++) {
1730*15dc779aSAndroid Build Coastguard Worker     WORD32 idx = ptr_re_arr_tab[n] << 1;
1731*15dc779aSAndroid Build Coastguard Worker     ptr_out[i++] = ptr_in[idx];
1732*15dc779aSAndroid Build Coastguard Worker     ptr_out[i++] = ptr_in[idx + 1];
1733*15dc779aSAndroid Build Coastguard Worker   }
1734*15dc779aSAndroid Build Coastguard Worker }
1735*15dc779aSAndroid Build Coastguard Worker 
ixheaace_fft_5_flt(FLOAT32 * ptr_in,FLOAT32 * ptr_out)1736*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_fft_5_flt(FLOAT32 *ptr_in, FLOAT32 *ptr_out) {
1737*15dc779aSAndroid Build Coastguard Worker   FLOAT32 C51 = 0.951056516f;
1738*15dc779aSAndroid Build Coastguard Worker   FLOAT32 C52 = -0.769420885f;
1739*15dc779aSAndroid Build Coastguard Worker   FLOAT32 C53 = -0.363271264f;
1740*15dc779aSAndroid Build Coastguard Worker   FLOAT32 C54 = 0.559016994f;
1741*15dc779aSAndroid Build Coastguard Worker   FLOAT32 C55 = -0.625f;
1742*15dc779aSAndroid Build Coastguard Worker 
1743*15dc779aSAndroid Build Coastguard Worker   FLOAT32 r1, r2, r3, r4;
1744*15dc779aSAndroid Build Coastguard Worker   FLOAT32 s1, s2, s3, s4, t, temp1, temp2;
1745*15dc779aSAndroid Build Coastguard Worker 
1746*15dc779aSAndroid Build Coastguard Worker   r1 = (ptr_in[2] + ptr_in[8]);
1747*15dc779aSAndroid Build Coastguard Worker   r4 = (ptr_in[2] - ptr_in[8]);
1748*15dc779aSAndroid Build Coastguard Worker   r3 = (ptr_in[4] + ptr_in[6]);
1749*15dc779aSAndroid Build Coastguard Worker   r2 = (ptr_in[4] - ptr_in[6]);
1750*15dc779aSAndroid Build Coastguard Worker 
1751*15dc779aSAndroid Build Coastguard Worker   t = ((r1 - r3) * C54);
1752*15dc779aSAndroid Build Coastguard Worker   r1 = (r1 + r3);
1753*15dc779aSAndroid Build Coastguard Worker 
1754*15dc779aSAndroid Build Coastguard Worker   temp1 = (ptr_in[0] + r1);
1755*15dc779aSAndroid Build Coastguard Worker   r1 = (temp1 + (((r1 * C55)) * 2));
1756*15dc779aSAndroid Build Coastguard Worker 
1757*15dc779aSAndroid Build Coastguard Worker   r3 = (r1 - t);
1758*15dc779aSAndroid Build Coastguard Worker   r1 = (r1 + t);
1759*15dc779aSAndroid Build Coastguard Worker 
1760*15dc779aSAndroid Build Coastguard Worker   t = ((r4 + r2) * C51);
1761*15dc779aSAndroid Build Coastguard Worker   r4 = (t + ((r4 * C52) * 2));
1762*15dc779aSAndroid Build Coastguard Worker   r2 = (t + (r2 * C53));
1763*15dc779aSAndroid Build Coastguard Worker 
1764*15dc779aSAndroid Build Coastguard Worker   s1 = (ptr_in[3] + ptr_in[9]);
1765*15dc779aSAndroid Build Coastguard Worker   s4 = (ptr_in[3] - ptr_in[9]);
1766*15dc779aSAndroid Build Coastguard Worker   s3 = (ptr_in[5] + ptr_in[7]);
1767*15dc779aSAndroid Build Coastguard Worker   s2 = (ptr_in[5] - ptr_in[7]);
1768*15dc779aSAndroid Build Coastguard Worker 
1769*15dc779aSAndroid Build Coastguard Worker   t = ((s1 - s3) * C54);
1770*15dc779aSAndroid Build Coastguard Worker   s1 = (s1 + s3);
1771*15dc779aSAndroid Build Coastguard Worker 
1772*15dc779aSAndroid Build Coastguard Worker   temp2 = (ptr_in[1] + s1);
1773*15dc779aSAndroid Build Coastguard Worker 
1774*15dc779aSAndroid Build Coastguard Worker   s1 = (temp2 + (((s1 * C55)) * 2));
1775*15dc779aSAndroid Build Coastguard Worker 
1776*15dc779aSAndroid Build Coastguard Worker   s3 = (s1 - t);
1777*15dc779aSAndroid Build Coastguard Worker   s1 = (s1 + t);
1778*15dc779aSAndroid Build Coastguard Worker 
1779*15dc779aSAndroid Build Coastguard Worker   t = ((s4 + s2) * C51);
1780*15dc779aSAndroid Build Coastguard Worker   s4 = (t + (((s4 * C52)) * 2));
1781*15dc779aSAndroid Build Coastguard Worker   s2 = (t + ((s2 * C53)));
1782*15dc779aSAndroid Build Coastguard Worker 
1783*15dc779aSAndroid Build Coastguard Worker   ptr_out[0] = temp1;
1784*15dc779aSAndroid Build Coastguard Worker   ptr_out[1] = temp2;
1785*15dc779aSAndroid Build Coastguard Worker   ptr_out[2] = (r1 + s2);
1786*15dc779aSAndroid Build Coastguard Worker   ptr_out[3] = (s1 - r2);
1787*15dc779aSAndroid Build Coastguard Worker   ptr_out[4] = (r3 - s4);
1788*15dc779aSAndroid Build Coastguard Worker   ptr_out[5] = (s3 + r4);
1789*15dc779aSAndroid Build Coastguard Worker   ptr_out[6] = (r3 + s4);
1790*15dc779aSAndroid Build Coastguard Worker   ptr_out[7] = (s3 - r4);
1791*15dc779aSAndroid Build Coastguard Worker   ptr_out[8] = (r1 - s2);
1792*15dc779aSAndroid Build Coastguard Worker   ptr_out[9] = (s1 + r2);
1793*15dc779aSAndroid Build Coastguard Worker }
1794*15dc779aSAndroid Build Coastguard Worker 
ixheaace_fft_3_flt(FLOAT32 * ptr_in,FLOAT32 * ptr_out)1795*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_fft_3_flt(FLOAT32 *ptr_in, FLOAT32 *ptr_out) {
1796*15dc779aSAndroid Build Coastguard Worker   FLOAT32 add_r, sub_r;
1797*15dc779aSAndroid Build Coastguard Worker   FLOAT32 add_i, sub_i;
1798*15dc779aSAndroid Build Coastguard Worker   FLOAT32 x_01_r, x_01_i, temp;
1799*15dc779aSAndroid Build Coastguard Worker 
1800*15dc779aSAndroid Build Coastguard Worker   FLOAT32 p1, p2, p3, p4;
1801*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sinmu = 0.866025404f;
1802*15dc779aSAndroid Build Coastguard Worker 
1803*15dc779aSAndroid Build Coastguard Worker   x_01_r = (ptr_in[0] + ptr_in[2]);
1804*15dc779aSAndroid Build Coastguard Worker   x_01_i = (ptr_in[1] + ptr_in[3]);
1805*15dc779aSAndroid Build Coastguard Worker 
1806*15dc779aSAndroid Build Coastguard Worker   add_r = (ptr_in[2] + ptr_in[4]);
1807*15dc779aSAndroid Build Coastguard Worker   add_i = (ptr_in[3] + ptr_in[5]);
1808*15dc779aSAndroid Build Coastguard Worker 
1809*15dc779aSAndroid Build Coastguard Worker   sub_r = (ptr_in[2] - ptr_in[4]);
1810*15dc779aSAndroid Build Coastguard Worker   sub_i = (ptr_in[3] - ptr_in[5]);
1811*15dc779aSAndroid Build Coastguard Worker 
1812*15dc779aSAndroid Build Coastguard Worker   p1 = add_r / 2;
1813*15dc779aSAndroid Build Coastguard Worker   p2 = (sub_i * sinmu);
1814*15dc779aSAndroid Build Coastguard Worker   p3 = (sub_r * sinmu);
1815*15dc779aSAndroid Build Coastguard Worker   p4 = add_i / 2;
1816*15dc779aSAndroid Build Coastguard Worker 
1817*15dc779aSAndroid Build Coastguard Worker   temp = (ptr_in[0] - p1);
1818*15dc779aSAndroid Build Coastguard Worker 
1819*15dc779aSAndroid Build Coastguard Worker   ptr_out[0] = (x_01_r + ptr_in[4]);
1820*15dc779aSAndroid Build Coastguard Worker   ptr_out[1] = (x_01_i + ptr_in[5]);
1821*15dc779aSAndroid Build Coastguard Worker   ptr_out[2] = (temp + p2);
1822*15dc779aSAndroid Build Coastguard Worker   ptr_out[3] = ((ptr_in[1] - p3) - p4);
1823*15dc779aSAndroid Build Coastguard Worker   ptr_out[4] = (temp - p2);
1824*15dc779aSAndroid Build Coastguard Worker   ptr_out[5] = ((ptr_in[1] + p3) - p4);
1825*15dc779aSAndroid Build Coastguard Worker }
1826*15dc779aSAndroid Build Coastguard Worker 
ixheaace_pre_twiddle_120(FLOAT32 * ptr_in,FLOAT32 * ptr_data,WORD32 n,const FLOAT32 * ptr_cos_sin_tbl)1827*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_pre_twiddle_120(FLOAT32 *ptr_in, FLOAT32 *ptr_data, WORD32 n,
1828*15dc779aSAndroid Build Coastguard Worker                                      const FLOAT32 *ptr_cos_sin_tbl) {
1829*15dc779aSAndroid Build Coastguard Worker   WORD npoints_4, i;
1830*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tempr, tempi, temp;
1831*15dc779aSAndroid Build Coastguard Worker   FLOAT32 c, c1, s, s1;
1832*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_in1, *ptr_in2;
1833*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_x = ptr_in + (n - 1);
1834*15dc779aSAndroid Build Coastguard Worker 
1835*15dc779aSAndroid Build Coastguard Worker   npoints_4 = n >> 2;
1836*15dc779aSAndroid Build Coastguard Worker 
1837*15dc779aSAndroid Build Coastguard Worker   ptr_in1 = ptr_data;
1838*15dc779aSAndroid Build Coastguard Worker   ptr_in2 = ptr_data + n - 1;
1839*15dc779aSAndroid Build Coastguard Worker 
1840*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < npoints_4; i++) {
1841*15dc779aSAndroid Build Coastguard Worker     c = *ptr_cos_sin_tbl++;
1842*15dc779aSAndroid Build Coastguard Worker     s = *ptr_cos_sin_tbl++;
1843*15dc779aSAndroid Build Coastguard Worker 
1844*15dc779aSAndroid Build Coastguard Worker     tempr = *ptr_in1++;
1845*15dc779aSAndroid Build Coastguard Worker     tempi = *ptr_in2--;
1846*15dc779aSAndroid Build Coastguard Worker 
1847*15dc779aSAndroid Build Coastguard Worker     temp = -((tempr * c) + (tempi * s));
1848*15dc779aSAndroid Build Coastguard Worker     *ptr_in++ = temp;
1849*15dc779aSAndroid Build Coastguard Worker 
1850*15dc779aSAndroid Build Coastguard Worker     temp = -((tempi * c) - (tempr * s));
1851*15dc779aSAndroid Build Coastguard Worker     *ptr_in++ = temp;
1852*15dc779aSAndroid Build Coastguard Worker 
1853*15dc779aSAndroid Build Coastguard Worker     c1 = *ptr_cos_sin_tbl++;
1854*15dc779aSAndroid Build Coastguard Worker     s1 = *ptr_cos_sin_tbl++;
1855*15dc779aSAndroid Build Coastguard Worker 
1856*15dc779aSAndroid Build Coastguard Worker     tempi = *ptr_in1++;
1857*15dc779aSAndroid Build Coastguard Worker     tempr = *ptr_in2--;
1858*15dc779aSAndroid Build Coastguard Worker 
1859*15dc779aSAndroid Build Coastguard Worker     temp = -((tempi * c1) - (tempr * s1));
1860*15dc779aSAndroid Build Coastguard Worker     *ptr_x-- = temp;
1861*15dc779aSAndroid Build Coastguard Worker 
1862*15dc779aSAndroid Build Coastguard Worker     temp = -((tempr * c1) + (tempi * s1));
1863*15dc779aSAndroid Build Coastguard Worker     *ptr_x-- = temp;
1864*15dc779aSAndroid Build Coastguard Worker   }
1865*15dc779aSAndroid Build Coastguard Worker }
1866*15dc779aSAndroid Build Coastguard Worker 
ixheaace_post_twiddle_120(FLOAT32 * ptr_out,FLOAT32 * ptr_x,const FLOAT32 * ptr_cos_sin_tbl,WORD m)1867*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_post_twiddle_120(FLOAT32 *ptr_out, FLOAT32 *ptr_x,
1868*15dc779aSAndroid Build Coastguard Worker                                       const FLOAT32 *ptr_cos_sin_tbl, WORD m) {
1869*15dc779aSAndroid Build Coastguard Worker   WORD i;
1870*15dc779aSAndroid Build Coastguard Worker   FLOAT32 c, c1, s, s1;
1871*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tempr, tempi, temp;
1872*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_in2 = ptr_x + (m - 1);
1873*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_in1 = ptr_x;
1874*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_x1 = ptr_out;
1875*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_x2 = ptr_out + (m - 1);
1876*15dc779aSAndroid Build Coastguard Worker 
1877*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < m; i += 4) {
1878*15dc779aSAndroid Build Coastguard Worker     c = *ptr_cos_sin_tbl++;
1879*15dc779aSAndroid Build Coastguard Worker     s = *ptr_cos_sin_tbl++;
1880*15dc779aSAndroid Build Coastguard Worker     c1 = *ptr_cos_sin_tbl++;
1881*15dc779aSAndroid Build Coastguard Worker     s1 = *ptr_cos_sin_tbl++;
1882*15dc779aSAndroid Build Coastguard Worker 
1883*15dc779aSAndroid Build Coastguard Worker     tempr = *ptr_in1++;
1884*15dc779aSAndroid Build Coastguard Worker     tempi = *ptr_in1++;
1885*15dc779aSAndroid Build Coastguard Worker 
1886*15dc779aSAndroid Build Coastguard Worker     temp = -((tempr * s) - (tempi * c));
1887*15dc779aSAndroid Build Coastguard Worker     *ptr_x2-- = temp;
1888*15dc779aSAndroid Build Coastguard Worker 
1889*15dc779aSAndroid Build Coastguard Worker     temp = -((tempr * c) + (tempi * s));
1890*15dc779aSAndroid Build Coastguard Worker     *ptr_x1++ = temp;
1891*15dc779aSAndroid Build Coastguard Worker 
1892*15dc779aSAndroid Build Coastguard Worker     tempi = *ptr_in2--;
1893*15dc779aSAndroid Build Coastguard Worker     tempr = *ptr_in2--;
1894*15dc779aSAndroid Build Coastguard Worker 
1895*15dc779aSAndroid Build Coastguard Worker     temp = -((tempr * s1) - (tempi * c1));
1896*15dc779aSAndroid Build Coastguard Worker     *ptr_x1++ = temp;
1897*15dc779aSAndroid Build Coastguard Worker 
1898*15dc779aSAndroid Build Coastguard Worker     temp = -((tempr * c1) + (tempi * s1));
1899*15dc779aSAndroid Build Coastguard Worker     *ptr_x2-- = temp;
1900*15dc779aSAndroid Build Coastguard Worker   }
1901*15dc779aSAndroid Build Coastguard Worker }
1902*15dc779aSAndroid Build Coastguard Worker 
ixheaace_fft_960_15(FLOAT32 * ptr_in_flt,FLOAT32 * ptr_out_flt)1903*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_fft_960_15(FLOAT32 *ptr_in_flt, FLOAT32 *ptr_out_flt) {
1904*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
1905*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_buf1_flt, *ptr_buf2_flt;
1906*15dc779aSAndroid Build Coastguard Worker   ixheaace_dec_rearrange_short_flt(ptr_in_flt, ptr_out_flt, FFT15, re_arr_tab_5);
1907*15dc779aSAndroid Build Coastguard Worker 
1908*15dc779aSAndroid Build Coastguard Worker   ptr_buf1_flt = ptr_out_flt;
1909*15dc779aSAndroid Build Coastguard Worker   ptr_buf2_flt = ptr_in_flt;
1910*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < FFT3; i++) {
1911*15dc779aSAndroid Build Coastguard Worker     ixheaace_fft_5_flt(ptr_buf1_flt, ptr_buf2_flt);
1912*15dc779aSAndroid Build Coastguard Worker 
1913*15dc779aSAndroid Build Coastguard Worker     ptr_buf1_flt += (FFT5 * 2);
1914*15dc779aSAndroid Build Coastguard Worker     ptr_buf2_flt += (FFT5 * 2);
1915*15dc779aSAndroid Build Coastguard Worker   }
1916*15dc779aSAndroid Build Coastguard Worker 
1917*15dc779aSAndroid Build Coastguard Worker   ixheaace_dec_rearrange_short_flt(ptr_in_flt, ptr_out_flt, FFT15, re_arr_tab_3);
1918*15dc779aSAndroid Build Coastguard Worker   ptr_buf1_flt = ptr_out_flt;
1919*15dc779aSAndroid Build Coastguard Worker   ptr_buf2_flt = ptr_in_flt;
1920*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < FFT5; i++) {
1921*15dc779aSAndroid Build Coastguard Worker     ixheaace_fft_3_flt(ptr_buf1_flt, ptr_buf2_flt);
1922*15dc779aSAndroid Build Coastguard Worker 
1923*15dc779aSAndroid Build Coastguard Worker     ptr_buf1_flt += (FFT3 * 2);
1924*15dc779aSAndroid Build Coastguard Worker     ptr_buf2_flt += (FFT3 * 2);
1925*15dc779aSAndroid Build Coastguard Worker   }
1926*15dc779aSAndroid Build Coastguard Worker 
1927*15dc779aSAndroid Build Coastguard Worker   ixheaace_dec_rearrange_short_flt(ptr_in_flt, ptr_out_flt, FFT15, re_arr_tab_sml);
1928*15dc779aSAndroid Build Coastguard Worker }
1929*15dc779aSAndroid Build Coastguard Worker 
ixheaace_fft_120(WORD32 npoints,FLOAT32 * ptr_x_flt,FLOAT32 * ptr_y_flt)1930*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_fft_120(WORD32 npoints, FLOAT32 *ptr_x_flt, FLOAT32 *ptr_y_flt) {
1931*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
1932*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_buf1_flt, *ptr_buf2_flt;
1933*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_in_flt, *ptr_out_flt;
1934*15dc779aSAndroid Build Coastguard Worker 
1935*15dc779aSAndroid Build Coastguard Worker   ptr_in_flt = ptr_x_flt;
1936*15dc779aSAndroid Build Coastguard Worker   ptr_out_flt = ptr_y_flt;
1937*15dc779aSAndroid Build Coastguard Worker   ixheaace_dec_rearrange_short_flt(ptr_in_flt, ptr_out_flt, 60, re_arr_tab_4);
1938*15dc779aSAndroid Build Coastguard Worker 
1939*15dc779aSAndroid Build Coastguard Worker   ptr_buf1_flt = ptr_out_flt;
1940*15dc779aSAndroid Build Coastguard Worker   ptr_buf2_flt = ptr_in_flt;
1941*15dc779aSAndroid Build Coastguard Worker 
1942*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < FFT15; i++) {
1943*15dc779aSAndroid Build Coastguard Worker     {
1944*15dc779aSAndroid Build Coastguard Worker       FLOAT32 x_0, x_1, x_2, x_3, x_4, x_5, x_6, x_7;
1945*15dc779aSAndroid Build Coastguard Worker       FLOAT32 *y0, *y1, *y2, *y3;
1946*15dc779aSAndroid Build Coastguard Worker       FLOAT32 *x0;
1947*15dc779aSAndroid Build Coastguard Worker       FLOAT32 xh0_0, xh1_0, xh0_1, xh1_1, xl0_0, xl1_0, xl0_1, xl1_1;
1948*15dc779aSAndroid Build Coastguard Worker       WORD32 h2;
1949*15dc779aSAndroid Build Coastguard Worker       FLOAT32 n00, n01, n10, n11, n20, n21, n30, n31;
1950*15dc779aSAndroid Build Coastguard Worker 
1951*15dc779aSAndroid Build Coastguard Worker       ptr_x_flt = ptr_buf1_flt;
1952*15dc779aSAndroid Build Coastguard Worker       ptr_y_flt = ptr_buf2_flt;
1953*15dc779aSAndroid Build Coastguard Worker       npoints = 4;
1954*15dc779aSAndroid Build Coastguard Worker       h2 = 0;
1955*15dc779aSAndroid Build Coastguard Worker 
1956*15dc779aSAndroid Build Coastguard Worker       y0 = ptr_y_flt;
1957*15dc779aSAndroid Build Coastguard Worker       y2 = ptr_y_flt + (WORD32)npoints;
1958*15dc779aSAndroid Build Coastguard Worker       x0 = ptr_x_flt;
1959*15dc779aSAndroid Build Coastguard Worker       y1 = y0 + (WORD32)(npoints >> 1);
1960*15dc779aSAndroid Build Coastguard Worker       y3 = y2 + (WORD32)(npoints >> 1);
1961*15dc779aSAndroid Build Coastguard Worker 
1962*15dc779aSAndroid Build Coastguard Worker       x_0 = x0[0];
1963*15dc779aSAndroid Build Coastguard Worker       x_1 = x0[1];
1964*15dc779aSAndroid Build Coastguard Worker       x_2 = x0[2];
1965*15dc779aSAndroid Build Coastguard Worker       x_3 = x0[3];
1966*15dc779aSAndroid Build Coastguard Worker       x_4 = x0[4];
1967*15dc779aSAndroid Build Coastguard Worker       x_5 = x0[5];
1968*15dc779aSAndroid Build Coastguard Worker       x_6 = x0[6];
1969*15dc779aSAndroid Build Coastguard Worker       x_7 = x0[7];
1970*15dc779aSAndroid Build Coastguard Worker 
1971*15dc779aSAndroid Build Coastguard Worker       xh0_0 = x_0 + x_4;
1972*15dc779aSAndroid Build Coastguard Worker       xh1_0 = x_1 + x_5;
1973*15dc779aSAndroid Build Coastguard Worker       xl0_0 = x_0 - x_4;
1974*15dc779aSAndroid Build Coastguard Worker       xl1_0 = x_1 - x_5;
1975*15dc779aSAndroid Build Coastguard Worker       xh0_1 = x_2 + x_6;
1976*15dc779aSAndroid Build Coastguard Worker       xh1_1 = x_3 + x_7;
1977*15dc779aSAndroid Build Coastguard Worker       xl0_1 = x_2 - x_6;
1978*15dc779aSAndroid Build Coastguard Worker       xl1_1 = x_3 - x_7;
1979*15dc779aSAndroid Build Coastguard Worker 
1980*15dc779aSAndroid Build Coastguard Worker       n00 = xh0_0 + xh0_1;
1981*15dc779aSAndroid Build Coastguard Worker       n01 = xh1_0 + xh1_1;
1982*15dc779aSAndroid Build Coastguard Worker       n10 = xl0_0 + xl1_1;
1983*15dc779aSAndroid Build Coastguard Worker       n11 = xl1_0 - xl0_1;
1984*15dc779aSAndroid Build Coastguard Worker       n20 = xh0_0 - xh0_1;
1985*15dc779aSAndroid Build Coastguard Worker       n21 = xh1_0 - xh1_1;
1986*15dc779aSAndroid Build Coastguard Worker       n30 = xl0_0 - xl1_1;
1987*15dc779aSAndroid Build Coastguard Worker       n31 = xl1_0 + xl0_1;
1988*15dc779aSAndroid Build Coastguard Worker 
1989*15dc779aSAndroid Build Coastguard Worker       y0[2 * h2] = n00;
1990*15dc779aSAndroid Build Coastguard Worker       y0[2 * h2 + 1] = n01;
1991*15dc779aSAndroid Build Coastguard Worker       y1[2 * h2] = n10;
1992*15dc779aSAndroid Build Coastguard Worker       y1[2 * h2 + 1] = n11;
1993*15dc779aSAndroid Build Coastguard Worker       y2[2 * h2] = n20;
1994*15dc779aSAndroid Build Coastguard Worker       y2[2 * h2 + 1] = n21;
1995*15dc779aSAndroid Build Coastguard Worker       y3[2 * h2] = n30;
1996*15dc779aSAndroid Build Coastguard Worker       y3[2 * h2 + 1] = n31;
1997*15dc779aSAndroid Build Coastguard Worker     }
1998*15dc779aSAndroid Build Coastguard Worker 
1999*15dc779aSAndroid Build Coastguard Worker     ptr_buf1_flt += (FFT4 * 2);
2000*15dc779aSAndroid Build Coastguard Worker     ptr_buf2_flt += (FFT4 * 2);
2001*15dc779aSAndroid Build Coastguard Worker   }
2002*15dc779aSAndroid Build Coastguard Worker 
2003*15dc779aSAndroid Build Coastguard Worker   ixheaace_dec_rearrange_short_flt(ptr_in_flt, ptr_out_flt, 60, re_arr_tab_15_4);
2004*15dc779aSAndroid Build Coastguard Worker 
2005*15dc779aSAndroid Build Coastguard Worker   ptr_buf1_flt = ptr_out_flt;
2006*15dc779aSAndroid Build Coastguard Worker   ptr_buf2_flt = ptr_in_flt;
2007*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < FFT4; i++) {
2008*15dc779aSAndroid Build Coastguard Worker     ixheaace_fft_960_15(ptr_buf1_flt, ptr_buf2_flt);
2009*15dc779aSAndroid Build Coastguard Worker     ptr_buf1_flt += (FFT15 * 2);
2010*15dc779aSAndroid Build Coastguard Worker     ptr_buf2_flt += (FFT15 * 2);
2011*15dc779aSAndroid Build Coastguard Worker   }
2012*15dc779aSAndroid Build Coastguard Worker 
2013*15dc779aSAndroid Build Coastguard Worker   ixheaace_dec_rearrange_short_flt(ptr_in_flt, ptr_out_flt, 60, re_arr_tab_120);
2014*15dc779aSAndroid Build Coastguard Worker }
2015*15dc779aSAndroid Build Coastguard Worker 
ixheaace_cfft_480(FLOAT32 * ptr_inp,FLOAT32 * ptr_op)2016*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_cfft_480(FLOAT32 *ptr_inp, FLOAT32 *ptr_op) {
2017*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
2018*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_buf1, *ptr_buf2;
2019*15dc779aSAndroid Build Coastguard Worker   FLOAT32 fft5_out[FFT15X2] = {0};
2020*15dc779aSAndroid Build Coastguard Worker 
2021*15dc779aSAndroid Build Coastguard Worker   ptr_buf1 = ptr_inp;
2022*15dc779aSAndroid Build Coastguard Worker   ptr_buf2 = ptr_op;
2023*15dc779aSAndroid Build Coastguard Worker 
2024*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < FFT32; i++) {
2025*15dc779aSAndroid Build Coastguard Worker     ixheaace_cfft_15_480(ptr_buf1, ptr_buf2, &fft5_out[0]);
2026*15dc779aSAndroid Build Coastguard Worker     ptr_buf1 += 2;
2027*15dc779aSAndroid Build Coastguard Worker     ptr_buf2 += 2;
2028*15dc779aSAndroid Build Coastguard Worker   }
2029*15dc779aSAndroid Build Coastguard Worker 
2030*15dc779aSAndroid Build Coastguard Worker   ixheaace_cfft_twiddle_mult(ptr_op, ptr_inp, FFT15, FFT32, ixheaace_fft_mix_rad_twid_tbl_480,
2031*15dc779aSAndroid Build Coastguard Worker                              ixheaace_fft_mix_rad_twid_h_tbl_480);
2032*15dc779aSAndroid Build Coastguard Worker 
2033*15dc779aSAndroid Build Coastguard Worker   ptr_buf1 = ptr_inp;
2034*15dc779aSAndroid Build Coastguard Worker   ptr_buf2 = ptr_op;
2035*15dc779aSAndroid Build Coastguard Worker 
2036*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < FFT15; i++) {
2037*15dc779aSAndroid Build Coastguard Worker     ixheaace_cfft_32_480(ptr_buf1, ptr_buf2);
2038*15dc779aSAndroid Build Coastguard Worker     ptr_buf1 += (FFT32X2);
2039*15dc779aSAndroid Build Coastguard Worker     ptr_buf2 += 2;
2040*15dc779aSAndroid Build Coastguard Worker   }
2041*15dc779aSAndroid Build Coastguard Worker }
2042*15dc779aSAndroid Build Coastguard Worker 
ixheaace_pre_twiddle_960(FLOAT32 * ptr_x,FLOAT32 * ptr_data,WORD32 n,const FLOAT32 * ptr_cos_sin_tbl)2043*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_pre_twiddle_960(FLOAT32 *ptr_x, FLOAT32 *ptr_data, WORD32 n,
2044*15dc779aSAndroid Build Coastguard Worker                                      const FLOAT32 *ptr_cos_sin_tbl) {
2045*15dc779aSAndroid Build Coastguard Worker   WORD npoints_4, i;
2046*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tempr, tempi, temp;
2047*15dc779aSAndroid Build Coastguard Worker   FLOAT32 c, c1, s, s1;
2048*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_in_1, *ptr_in_2;
2049*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_x_1 = ptr_x + (n - 1);
2050*15dc779aSAndroid Build Coastguard Worker 
2051*15dc779aSAndroid Build Coastguard Worker   npoints_4 = n >> 2;
2052*15dc779aSAndroid Build Coastguard Worker 
2053*15dc779aSAndroid Build Coastguard Worker   ptr_in_1 = ptr_data;
2054*15dc779aSAndroid Build Coastguard Worker   ptr_in_2 = ptr_data + n - 1;
2055*15dc779aSAndroid Build Coastguard Worker 
2056*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < npoints_4; i++) {
2057*15dc779aSAndroid Build Coastguard Worker     c = *ptr_cos_sin_tbl++;
2058*15dc779aSAndroid Build Coastguard Worker     s = *ptr_cos_sin_tbl++;
2059*15dc779aSAndroid Build Coastguard Worker 
2060*15dc779aSAndroid Build Coastguard Worker     tempr = *ptr_in_1++;
2061*15dc779aSAndroid Build Coastguard Worker     tempi = *ptr_in_2--;
2062*15dc779aSAndroid Build Coastguard Worker 
2063*15dc779aSAndroid Build Coastguard Worker     temp = -((tempr * c) + (tempi * s));
2064*15dc779aSAndroid Build Coastguard Worker     *ptr_x++ = temp;
2065*15dc779aSAndroid Build Coastguard Worker 
2066*15dc779aSAndroid Build Coastguard Worker     temp = -((tempi * c) - (tempr * s));
2067*15dc779aSAndroid Build Coastguard Worker     *ptr_x++ = temp;
2068*15dc779aSAndroid Build Coastguard Worker 
2069*15dc779aSAndroid Build Coastguard Worker     c1 = *ptr_cos_sin_tbl++;
2070*15dc779aSAndroid Build Coastguard Worker     s1 = *ptr_cos_sin_tbl++;
2071*15dc779aSAndroid Build Coastguard Worker 
2072*15dc779aSAndroid Build Coastguard Worker     tempi = *ptr_in_1++;
2073*15dc779aSAndroid Build Coastguard Worker     tempr = *ptr_in_2--;
2074*15dc779aSAndroid Build Coastguard Worker 
2075*15dc779aSAndroid Build Coastguard Worker     temp = -((tempi * c1) - (tempr * s1));
2076*15dc779aSAndroid Build Coastguard Worker     *ptr_x_1-- = temp;
2077*15dc779aSAndroid Build Coastguard Worker 
2078*15dc779aSAndroid Build Coastguard Worker     temp = -((tempr * c1) + (tempi * s1));
2079*15dc779aSAndroid Build Coastguard Worker     *ptr_x_1-- = temp;
2080*15dc779aSAndroid Build Coastguard Worker   }
2081*15dc779aSAndroid Build Coastguard Worker }
2082*15dc779aSAndroid Build Coastguard Worker 
ixheaace_post_twiddle_960(FLOAT32 * ptr_out,FLOAT32 * ptr_x,const FLOAT32 * ptr_cos_sin_tbl,WORD m)2083*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_post_twiddle_960(FLOAT32 *ptr_out, FLOAT32 *ptr_x,
2084*15dc779aSAndroid Build Coastguard Worker                                       const FLOAT32 *ptr_cos_sin_tbl, WORD m) {
2085*15dc779aSAndroid Build Coastguard Worker   WORD i;
2086*15dc779aSAndroid Build Coastguard Worker   FLOAT32 c, c1, s, s1;
2087*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tempr, tempi, temp;
2088*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_in2 = ptr_x + (m - 1);
2089*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_in1 = ptr_x;
2090*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_x1 = ptr_out;
2091*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_x2 = ptr_out + (m - 1);
2092*15dc779aSAndroid Build Coastguard Worker 
2093*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < m; i += 4) {
2094*15dc779aSAndroid Build Coastguard Worker     c = *ptr_cos_sin_tbl++;
2095*15dc779aSAndroid Build Coastguard Worker     s = *ptr_cos_sin_tbl++;
2096*15dc779aSAndroid Build Coastguard Worker     c1 = *ptr_cos_sin_tbl++;
2097*15dc779aSAndroid Build Coastguard Worker     s1 = *ptr_cos_sin_tbl++;
2098*15dc779aSAndroid Build Coastguard Worker 
2099*15dc779aSAndroid Build Coastguard Worker     tempr = *ptr_in1++;
2100*15dc779aSAndroid Build Coastguard Worker     tempi = *ptr_in1++;
2101*15dc779aSAndroid Build Coastguard Worker 
2102*15dc779aSAndroid Build Coastguard Worker     temp = -((tempr * s) - (tempi * c));
2103*15dc779aSAndroid Build Coastguard Worker     *ptr_x2-- = temp;
2104*15dc779aSAndroid Build Coastguard Worker 
2105*15dc779aSAndroid Build Coastguard Worker     temp = -((tempr * c) + (tempi * s));
2106*15dc779aSAndroid Build Coastguard Worker     *ptr_x1++ = temp;
2107*15dc779aSAndroid Build Coastguard Worker 
2108*15dc779aSAndroid Build Coastguard Worker     tempi = *ptr_in2--;
2109*15dc779aSAndroid Build Coastguard Worker     tempr = *ptr_in2--;
2110*15dc779aSAndroid Build Coastguard Worker 
2111*15dc779aSAndroid Build Coastguard Worker     temp = -((tempr * s1) - (tempi * c1));
2112*15dc779aSAndroid Build Coastguard Worker     *ptr_x1++ = temp;
2113*15dc779aSAndroid Build Coastguard Worker 
2114*15dc779aSAndroid Build Coastguard Worker     temp = -((tempr * c1) + (tempi * s1));
2115*15dc779aSAndroid Build Coastguard Worker     *ptr_x2-- = temp;
2116*15dc779aSAndroid Build Coastguard Worker   }
2117*15dc779aSAndroid Build Coastguard Worker }
2118*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mdct_960(FLOAT32 * ptr_input_flt,WORD8 * ptr_scratch)2119*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mdct_960(FLOAT32 *ptr_input_flt, WORD8 *ptr_scratch) {
2120*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_scratch_flt = (FLOAT32 *)ptr_scratch;
2121*15dc779aSAndroid Build Coastguard Worker   FLOAT32 const_mult_fac = 3.142857143f;
2122*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_data = ptr_input_flt;
2123*15dc779aSAndroid Build Coastguard Worker   WORD32 k;
2124*15dc779aSAndroid Build Coastguard Worker 
2125*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_scratch_flt, ptr_input_flt, sizeof(*ptr_scratch_flt) * FRAME_LEN_960);
2126*15dc779aSAndroid Build Coastguard Worker   ixheaace_pre_twiddle_960(ptr_input_flt, ptr_scratch_flt, FRAME_LEN_960, cos_sin_table_flt);
2127*15dc779aSAndroid Build Coastguard Worker 
2128*15dc779aSAndroid Build Coastguard Worker   ixheaace_cfft_480(ptr_input_flt, ptr_scratch_flt);
2129*15dc779aSAndroid Build Coastguard Worker 
2130*15dc779aSAndroid Build Coastguard Worker   ixheaace_post_twiddle_960(ptr_input_flt, ptr_scratch_flt, cos_sin_table_flt, FRAME_LEN_960);
2131*15dc779aSAndroid Build Coastguard Worker 
2132*15dc779aSAndroid Build Coastguard Worker   for (k = FRAME_LEN_960 - 1; k >= 0; k -= 2) {
2133*15dc779aSAndroid Build Coastguard Worker     *ptr_data = (*ptr_data * const_mult_fac);
2134*15dc779aSAndroid Build Coastguard Worker     ptr_data++;
2135*15dc779aSAndroid Build Coastguard Worker     *ptr_data = (*ptr_data * const_mult_fac);
2136*15dc779aSAndroid Build Coastguard Worker     ptr_data++;
2137*15dc779aSAndroid Build Coastguard Worker   }
2138*15dc779aSAndroid Build Coastguard Worker }
2139*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mdct_120(FLOAT32 * ptr_input_flt,WORD8 * ptr_scratch)2140*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mdct_120(FLOAT32 *ptr_input_flt, WORD8 *ptr_scratch) {
2141*15dc779aSAndroid Build Coastguard Worker   WORD32 n, k;
2142*15dc779aSAndroid Build Coastguard Worker   WORD32 n_by_2;
2143*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_scratch_flt = (FLOAT32 *)ptr_scratch;
2144*15dc779aSAndroid Build Coastguard Worker   FLOAT32 const_mltfac = 3.142857143f;
2145*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_data = ptr_input_flt;
2146*15dc779aSAndroid Build Coastguard Worker   n = 120;
2147*15dc779aSAndroid Build Coastguard Worker   n_by_2 = n >> 1;
2148*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_scratch_flt, ptr_input_flt, sizeof(*ptr_scratch_flt) * n);
2149*15dc779aSAndroid Build Coastguard Worker 
2150*15dc779aSAndroid Build Coastguard Worker   ixheaace_pre_twiddle_120(ptr_input_flt, ptr_scratch_flt, n, ixheaace_cosine_array_240);
2151*15dc779aSAndroid Build Coastguard Worker 
2152*15dc779aSAndroid Build Coastguard Worker   ixheaace_fft_120(n_by_2, ptr_input_flt, ptr_scratch_flt);
2153*15dc779aSAndroid Build Coastguard Worker 
2154*15dc779aSAndroid Build Coastguard Worker   ixheaace_post_twiddle_120(ptr_input_flt, ptr_scratch_flt, ixheaace_cosine_array_240, n);
2155*15dc779aSAndroid Build Coastguard Worker 
2156*15dc779aSAndroid Build Coastguard Worker   for (k = n - 1; k >= 0; k -= 2) {
2157*15dc779aSAndroid Build Coastguard Worker     *ptr_data = (*ptr_data * const_mltfac);
2158*15dc779aSAndroid Build Coastguard Worker     ptr_data++;
2159*15dc779aSAndroid Build Coastguard Worker     *ptr_data = (*ptr_data * const_mltfac);
2160*15dc779aSAndroid Build Coastguard Worker     ptr_data++;
2161*15dc779aSAndroid Build Coastguard Worker   }
2162*15dc779aSAndroid Build Coastguard Worker }
2163*15dc779aSAndroid Build Coastguard Worker 
ixheaace_mdct(FLOAT32 * ptr_dct_data,const FLOAT32 * ptr_trig_data,const FLOAT32 * ptr_sine_window,WORD32 n,WORD32 ld_n,WORD8 * ptr_scratch)2164*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mdct(FLOAT32 *ptr_dct_data, const FLOAT32 *ptr_trig_data,
2165*15dc779aSAndroid Build Coastguard Worker                           const FLOAT32 *ptr_sine_window, WORD32 n, WORD32 ld_n,
2166*15dc779aSAndroid Build Coastguard Worker                           WORD8 *ptr_scratch) {
2167*15dc779aSAndroid Build Coastguard Worker   ixheaace_pre_mdct(ptr_dct_data, n, ptr_sine_window);
2168*15dc779aSAndroid Build Coastguard Worker 
2169*15dc779aSAndroid Build Coastguard Worker   ixheaace_scratch_mem *pstr_scratch = (ixheaace_scratch_mem *)ptr_scratch;
2170*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_complex_fft(ptr_dct_data, n / 2, pstr_scratch);
2171*15dc779aSAndroid Build Coastguard Worker 
2172*15dc779aSAndroid Build Coastguard Worker   ixheaace_post_mdct(ptr_dct_data, n, ptr_trig_data,
2173*15dc779aSAndroid Build Coastguard Worker                      1 << (LD_FFT_TWIDDLE_TABLE_SIZE - (ld_n - 1)), FFT_TWIDDLE_TABLE_SIZE);
2174*15dc779aSAndroid Build Coastguard Worker }
2175*15dc779aSAndroid Build Coastguard Worker 
ixheaace_shift_mdct_delay_buffer(FLOAT32 * ptr_mdct_delay_buffer,const FLOAT32 * ptr_time_signal,WORD32 ch_increment,WORD32 frame_len)2176*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_shift_mdct_delay_buffer(FLOAT32 *ptr_mdct_delay_buffer,
2177*15dc779aSAndroid Build Coastguard Worker                                              const FLOAT32 *ptr_time_signal, WORD32 ch_increment,
2178*15dc779aSAndroid Build Coastguard Worker                                              WORD32 frame_len) {
2179*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
2180*15dc779aSAndroid Build Coastguard Worker   WORD32 blk_switch_offset = frame_len;
2181*15dc779aSAndroid Build Coastguard Worker   switch (frame_len) {
2182*15dc779aSAndroid Build Coastguard Worker     case FRAME_LEN_1024:
2183*15dc779aSAndroid Build Coastguard Worker       blk_switch_offset = BLK_SWITCH_OFFSET_LC_128;
2184*15dc779aSAndroid Build Coastguard Worker       memmove(ptr_mdct_delay_buffer, ptr_mdct_delay_buffer + frame_len,
2185*15dc779aSAndroid Build Coastguard Worker               (blk_switch_offset - frame_len) * sizeof(*ptr_mdct_delay_buffer));
2186*15dc779aSAndroid Build Coastguard Worker       break;
2187*15dc779aSAndroid Build Coastguard Worker 
2188*15dc779aSAndroid Build Coastguard Worker     case FRAME_LEN_960:
2189*15dc779aSAndroid Build Coastguard Worker       blk_switch_offset = BLK_SWITCH_OFFSET_LC_120;
2190*15dc779aSAndroid Build Coastguard Worker       memmove(ptr_mdct_delay_buffer, ptr_mdct_delay_buffer + frame_len,
2191*15dc779aSAndroid Build Coastguard Worker               (blk_switch_offset - frame_len) * sizeof(*ptr_mdct_delay_buffer));
2192*15dc779aSAndroid Build Coastguard Worker       break;
2193*15dc779aSAndroid Build Coastguard Worker 
2194*15dc779aSAndroid Build Coastguard Worker     case FRAME_LEN_512:
2195*15dc779aSAndroid Build Coastguard Worker     case FRAME_LEN_480:
2196*15dc779aSAndroid Build Coastguard Worker       blk_switch_offset = frame_len;
2197*15dc779aSAndroid Build Coastguard Worker       break;
2198*15dc779aSAndroid Build Coastguard Worker   }
2199*15dc779aSAndroid Build Coastguard Worker 
2200*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < frame_len; i++) {
2201*15dc779aSAndroid Build Coastguard Worker     ptr_mdct_delay_buffer[blk_switch_offset - frame_len + i] = ptr_time_signal[i * ch_increment];
2202*15dc779aSAndroid Build Coastguard Worker   }
2203*15dc779aSAndroid Build Coastguard Worker }
2204*15dc779aSAndroid Build Coastguard Worker 
ixheaace_transform_real_lc_ld(FLOAT32 * ptr_mdct_delay_buffer,const FLOAT32 * ptr_time_signal,WORD32 ch_increment,FLOAT32 * ptr_real_out,WORD32 block_type,WORD32 frame_len,WORD8 * ptr_scratch)2205*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_transform_real_lc_ld(FLOAT32 *ptr_mdct_delay_buffer, const FLOAT32 *ptr_time_signal,
2206*15dc779aSAndroid Build Coastguard Worker                                    WORD32 ch_increment, FLOAT32 *ptr_real_out, WORD32 block_type,
2207*15dc779aSAndroid Build Coastguard Worker                                    WORD32 frame_len, WORD8 *ptr_scratch) {
2208*15dc779aSAndroid Build Coastguard Worker   WORD32 i, w;
2209*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ws1, ws2;
2210*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_dct_in;
2211*15dc779aSAndroid Build Coastguard Worker   WORD32 frame_len_short = FRAME_LEN_SHORT_128;
2212*15dc779aSAndroid Build Coastguard Worker   WORD32 ls_trans = LS_TRANS_128;
2213*15dc779aSAndroid Build Coastguard Worker   WORD32 trans_offset = TRANSFORM_OFFSET_SHORT_128;
2214*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_window;
2215*15dc779aSAndroid Build Coastguard Worker   if (frame_len == FRAME_LEN_960) {
2216*15dc779aSAndroid Build Coastguard Worker     ls_trans = LS_TRANS_120;
2217*15dc779aSAndroid Build Coastguard Worker     trans_offset = TRANSFORM_OFFSET_SHORT_120;
2218*15dc779aSAndroid Build Coastguard Worker     frame_len_short = FRAME_LEN_SHORT_120;
2219*15dc779aSAndroid Build Coastguard Worker   }
2220*15dc779aSAndroid Build Coastguard Worker   switch (block_type) {
2221*15dc779aSAndroid Build Coastguard Worker     case LONG_WINDOW:
2222*15dc779aSAndroid Build Coastguard Worker       ptr_dct_in = ptr_real_out;
2223*15dc779aSAndroid Build Coastguard Worker       ptr_window = &long_window_KBD[0];
2224*15dc779aSAndroid Build Coastguard Worker       switch (frame_len) {
2225*15dc779aSAndroid Build Coastguard Worker         case FRAME_LEN_1024:
2226*15dc779aSAndroid Build Coastguard Worker           ptr_window = &long_window_KBD[0];
2227*15dc779aSAndroid Build Coastguard Worker           break;
2228*15dc779aSAndroid Build Coastguard Worker 
2229*15dc779aSAndroid Build Coastguard Worker         case FRAME_LEN_960:
2230*15dc779aSAndroid Build Coastguard Worker           ptr_window = &long_window_sine_960[0];
2231*15dc779aSAndroid Build Coastguard Worker           break;
2232*15dc779aSAndroid Build Coastguard Worker 
2233*15dc779aSAndroid Build Coastguard Worker         case FRAME_LEN_512:
2234*15dc779aSAndroid Build Coastguard Worker           ptr_window = &long_window_sine_ld[0];
2235*15dc779aSAndroid Build Coastguard Worker           break;
2236*15dc779aSAndroid Build Coastguard Worker 
2237*15dc779aSAndroid Build Coastguard Worker         case FRAME_LEN_480:
2238*15dc779aSAndroid Build Coastguard Worker           ptr_window = &long_window_sine_ld_480[0];
2239*15dc779aSAndroid Build Coastguard Worker           break;
2240*15dc779aSAndroid Build Coastguard Worker       }
2241*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < frame_len / 2; i++) {
2242*15dc779aSAndroid Build Coastguard Worker         ws1 = ptr_mdct_delay_buffer[i] * ptr_window[i];
2243*15dc779aSAndroid Build Coastguard Worker 
2244*15dc779aSAndroid Build Coastguard Worker         ws2 = ptr_mdct_delay_buffer[(frame_len - i - 1)] * ptr_window[frame_len - i - 1];
2245*15dc779aSAndroid Build Coastguard Worker 
2246*15dc779aSAndroid Build Coastguard Worker         ptr_dct_in[frame_len / 2 + i] = ws1 - ws2;
2247*15dc779aSAndroid Build Coastguard Worker       }
2248*15dc779aSAndroid Build Coastguard Worker 
2249*15dc779aSAndroid Build Coastguard Worker       ixheaace_shift_mdct_delay_buffer(ptr_mdct_delay_buffer, ptr_time_signal, ch_increment,
2250*15dc779aSAndroid Build Coastguard Worker                                        frame_len);
2251*15dc779aSAndroid Build Coastguard Worker 
2252*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < frame_len / 2; i++) {
2253*15dc779aSAndroid Build Coastguard Worker         ws1 = ptr_mdct_delay_buffer[i] * ptr_window[frame_len - i - 1];
2254*15dc779aSAndroid Build Coastguard Worker 
2255*15dc779aSAndroid Build Coastguard Worker         ws2 = ptr_mdct_delay_buffer[(frame_len - i - 1)] * ptr_window[i];
2256*15dc779aSAndroid Build Coastguard Worker 
2257*15dc779aSAndroid Build Coastguard Worker         ptr_dct_in[frame_len / 2 - i - 1] = -(ws1 + ws2);
2258*15dc779aSAndroid Build Coastguard Worker       }
2259*15dc779aSAndroid Build Coastguard Worker       switch (frame_len) {
2260*15dc779aSAndroid Build Coastguard Worker         case FRAME_LEN_1024:
2261*15dc779aSAndroid Build Coastguard Worker           ixheaace_mdct(ptr_dct_in, fft_twiddle_tab, long_window_sine, frame_len, 10,
2262*15dc779aSAndroid Build Coastguard Worker                         ptr_scratch);
2263*15dc779aSAndroid Build Coastguard Worker           break;
2264*15dc779aSAndroid Build Coastguard Worker 
2265*15dc779aSAndroid Build Coastguard Worker         case FRAME_LEN_960:
2266*15dc779aSAndroid Build Coastguard Worker           ixheaace_mdct_960(ptr_dct_in, ptr_scratch);
2267*15dc779aSAndroid Build Coastguard Worker           break;
2268*15dc779aSAndroid Build Coastguard Worker 
2269*15dc779aSAndroid Build Coastguard Worker         case FRAME_LEN_512:
2270*15dc779aSAndroid Build Coastguard Worker         case FRAME_LEN_480:
2271*15dc779aSAndroid Build Coastguard Worker           ixheaace_mdct(ptr_dct_in, fft_twiddle_tab, ptr_window, frame_len, 9, ptr_scratch);
2272*15dc779aSAndroid Build Coastguard Worker           break;
2273*15dc779aSAndroid Build Coastguard Worker       }
2274*15dc779aSAndroid Build Coastguard Worker       break;
2275*15dc779aSAndroid Build Coastguard Worker 
2276*15dc779aSAndroid Build Coastguard Worker     case START_WINDOW:
2277*15dc779aSAndroid Build Coastguard Worker       ptr_dct_in = ptr_real_out;
2278*15dc779aSAndroid Build Coastguard Worker       ptr_window = &long_window_KBD[0];
2279*15dc779aSAndroid Build Coastguard Worker       switch (frame_len) {
2280*15dc779aSAndroid Build Coastguard Worker         case FRAME_LEN_1024:
2281*15dc779aSAndroid Build Coastguard Worker           ptr_window = &long_window_KBD[0];
2282*15dc779aSAndroid Build Coastguard Worker           break;
2283*15dc779aSAndroid Build Coastguard Worker 
2284*15dc779aSAndroid Build Coastguard Worker         case FRAME_LEN_960:
2285*15dc779aSAndroid Build Coastguard Worker           ptr_window = &long_window_sine_960[0];
2286*15dc779aSAndroid Build Coastguard Worker           break;
2287*15dc779aSAndroid Build Coastguard Worker       }
2288*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < frame_len / 2; i++) {
2289*15dc779aSAndroid Build Coastguard Worker         ws1 = ptr_mdct_delay_buffer[i] * ptr_window[i];
2290*15dc779aSAndroid Build Coastguard Worker 
2291*15dc779aSAndroid Build Coastguard Worker         ws2 = ptr_mdct_delay_buffer[(frame_len - i - 1)] * ptr_window[frame_len - i - 1];
2292*15dc779aSAndroid Build Coastguard Worker 
2293*15dc779aSAndroid Build Coastguard Worker         ptr_dct_in[frame_len / 2 + i] = ws1 - ws2;
2294*15dc779aSAndroid Build Coastguard Worker       }
2295*15dc779aSAndroid Build Coastguard Worker 
2296*15dc779aSAndroid Build Coastguard Worker       ixheaace_shift_mdct_delay_buffer(ptr_mdct_delay_buffer, ptr_time_signal, ch_increment,
2297*15dc779aSAndroid Build Coastguard Worker                                        frame_len);
2298*15dc779aSAndroid Build Coastguard Worker 
2299*15dc779aSAndroid Build Coastguard Worker       if (frame_len == FRAME_LEN_1024) {
2300*15dc779aSAndroid Build Coastguard Worker         ptr_window = &short_window_sine[0];
2301*15dc779aSAndroid Build Coastguard Worker       } else if (frame_len == FRAME_LEN_960) {
2302*15dc779aSAndroid Build Coastguard Worker         ptr_window = &short_window_sine_120[0];
2303*15dc779aSAndroid Build Coastguard Worker       }
2304*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < ls_trans; i++) {
2305*15dc779aSAndroid Build Coastguard Worker         ws1 = ptr_mdct_delay_buffer[i];
2306*15dc779aSAndroid Build Coastguard Worker         ws2 = 0.0f;
2307*15dc779aSAndroid Build Coastguard Worker 
2308*15dc779aSAndroid Build Coastguard Worker         ptr_dct_in[frame_len / 2 - i - 1] = -(ws1 + ws2);
2309*15dc779aSAndroid Build Coastguard Worker       }
2310*15dc779aSAndroid Build Coastguard Worker 
2311*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < frame_len_short / 2; i++) {
2312*15dc779aSAndroid Build Coastguard Worker         ws1 = ptr_mdct_delay_buffer[i + ls_trans] * ptr_window[frame_len_short - i - 1];
2313*15dc779aSAndroid Build Coastguard Worker 
2314*15dc779aSAndroid Build Coastguard Worker         ws2 = ptr_mdct_delay_buffer[(frame_len - i - 1 - ls_trans)] * ptr_window[i];
2315*15dc779aSAndroid Build Coastguard Worker 
2316*15dc779aSAndroid Build Coastguard Worker         ptr_dct_in[frame_len / 2 - i - 1 - ls_trans] = -(ws1 + ws2);
2317*15dc779aSAndroid Build Coastguard Worker       }
2318*15dc779aSAndroid Build Coastguard Worker       if (frame_len == FRAME_LEN_960) {
2319*15dc779aSAndroid Build Coastguard Worker         ixheaace_mdct_960(ptr_dct_in, ptr_scratch);
2320*15dc779aSAndroid Build Coastguard Worker       } else {
2321*15dc779aSAndroid Build Coastguard Worker         ixheaace_mdct(ptr_dct_in, fft_twiddle_tab, long_window_sine, frame_len, 10, ptr_scratch);
2322*15dc779aSAndroid Build Coastguard Worker       }
2323*15dc779aSAndroid Build Coastguard Worker 
2324*15dc779aSAndroid Build Coastguard Worker       break;
2325*15dc779aSAndroid Build Coastguard Worker 
2326*15dc779aSAndroid Build Coastguard Worker     case STOP_WINDOW:
2327*15dc779aSAndroid Build Coastguard Worker       ptr_window = &long_window_KBD[0];
2328*15dc779aSAndroid Build Coastguard Worker       ptr_dct_in = ptr_real_out;
2329*15dc779aSAndroid Build Coastguard Worker       if (frame_len == FRAME_LEN_1024) {
2330*15dc779aSAndroid Build Coastguard Worker         ptr_window = &short_window_sine[0];
2331*15dc779aSAndroid Build Coastguard Worker       } else if (frame_len == FRAME_LEN_960) {
2332*15dc779aSAndroid Build Coastguard Worker         ptr_window = &short_window_sine_120[0];
2333*15dc779aSAndroid Build Coastguard Worker       }
2334*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < ls_trans; i++) {
2335*15dc779aSAndroid Build Coastguard Worker         ws1 = 0.0f;
2336*15dc779aSAndroid Build Coastguard Worker         ws2 = ptr_mdct_delay_buffer[(frame_len - i - 1)];
2337*15dc779aSAndroid Build Coastguard Worker         ptr_dct_in[frame_len / 2 + i] = ws1 - ws2;
2338*15dc779aSAndroid Build Coastguard Worker       }
2339*15dc779aSAndroid Build Coastguard Worker 
2340*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < frame_len_short / 2; i++) {
2341*15dc779aSAndroid Build Coastguard Worker         ws1 = ptr_mdct_delay_buffer[(i + ls_trans)] * ptr_window[i];
2342*15dc779aSAndroid Build Coastguard Worker 
2343*15dc779aSAndroid Build Coastguard Worker         ws2 = ptr_mdct_delay_buffer[(frame_len - ls_trans - i - 1)] *
2344*15dc779aSAndroid Build Coastguard Worker               ptr_window[frame_len_short - i - 1];
2345*15dc779aSAndroid Build Coastguard Worker 
2346*15dc779aSAndroid Build Coastguard Worker         ptr_dct_in[frame_len / 2 + i + ls_trans] = ws1 - ws2;
2347*15dc779aSAndroid Build Coastguard Worker       }
2348*15dc779aSAndroid Build Coastguard Worker 
2349*15dc779aSAndroid Build Coastguard Worker       ixheaace_shift_mdct_delay_buffer(ptr_mdct_delay_buffer, ptr_time_signal, ch_increment,
2350*15dc779aSAndroid Build Coastguard Worker                                        frame_len);
2351*15dc779aSAndroid Build Coastguard Worker 
2352*15dc779aSAndroid Build Coastguard Worker       if (frame_len == FRAME_LEN_1024) {
2353*15dc779aSAndroid Build Coastguard Worker         ptr_window = &long_window_KBD[0];
2354*15dc779aSAndroid Build Coastguard Worker       } else if (frame_len == FRAME_LEN_960) {
2355*15dc779aSAndroid Build Coastguard Worker         ptr_window = &long_window_sine_960[0];
2356*15dc779aSAndroid Build Coastguard Worker       }
2357*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < frame_len / 2; i++) {
2358*15dc779aSAndroid Build Coastguard Worker         ws1 = ptr_mdct_delay_buffer[i] * ptr_window[frame_len - i - 1];
2359*15dc779aSAndroid Build Coastguard Worker 
2360*15dc779aSAndroid Build Coastguard Worker         ws2 = ptr_mdct_delay_buffer[(frame_len - i - 1)] * ptr_window[i];
2361*15dc779aSAndroid Build Coastguard Worker 
2362*15dc779aSAndroid Build Coastguard Worker         ptr_dct_in[frame_len / 2 - i - 1] = -(ws1 + ws2);
2363*15dc779aSAndroid Build Coastguard Worker       }
2364*15dc779aSAndroid Build Coastguard Worker 
2365*15dc779aSAndroid Build Coastguard Worker       if (frame_len == FRAME_LEN_960) {
2366*15dc779aSAndroid Build Coastguard Worker         ixheaace_mdct_960(ptr_dct_in, ptr_scratch);
2367*15dc779aSAndroid Build Coastguard Worker       } else {
2368*15dc779aSAndroid Build Coastguard Worker         ixheaace_mdct(ptr_dct_in, fft_twiddle_tab, long_window_sine, frame_len, 10, ptr_scratch);
2369*15dc779aSAndroid Build Coastguard Worker       }
2370*15dc779aSAndroid Build Coastguard Worker 
2371*15dc779aSAndroid Build Coastguard Worker       break;
2372*15dc779aSAndroid Build Coastguard Worker 
2373*15dc779aSAndroid Build Coastguard Worker     case SHORT_WINDOW:
2374*15dc779aSAndroid Build Coastguard Worker       ptr_window = &short_window_sine[0];
2375*15dc779aSAndroid Build Coastguard Worker       if (frame_len == FRAME_LEN_1024) {
2376*15dc779aSAndroid Build Coastguard Worker         ptr_window = &short_window_sine[0];
2377*15dc779aSAndroid Build Coastguard Worker       } else if (frame_len == FRAME_LEN_960) {
2378*15dc779aSAndroid Build Coastguard Worker         ptr_window = &short_window_sine_120[0];
2379*15dc779aSAndroid Build Coastguard Worker       }
2380*15dc779aSAndroid Build Coastguard Worker       for (w = 0; w < TRANS_FAC; w++) {
2381*15dc779aSAndroid Build Coastguard Worker         ptr_dct_in = ptr_real_out + w * frame_len_short;
2382*15dc779aSAndroid Build Coastguard Worker 
2383*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < frame_len_short / 2; i++) {
2384*15dc779aSAndroid Build Coastguard Worker           ws1 = ptr_mdct_delay_buffer[trans_offset + w * frame_len_short + i] * ptr_window[i];
2385*15dc779aSAndroid Build Coastguard Worker 
2386*15dc779aSAndroid Build Coastguard Worker           ws2 = ptr_mdct_delay_buffer[trans_offset + w * frame_len_short + frame_len_short - i -
2387*15dc779aSAndroid Build Coastguard Worker                                       1] *
2388*15dc779aSAndroid Build Coastguard Worker                 ptr_window[frame_len_short - i - 1];
2389*15dc779aSAndroid Build Coastguard Worker 
2390*15dc779aSAndroid Build Coastguard Worker           ptr_dct_in[frame_len_short / 2 + i] = ws1 - ws2;
2391*15dc779aSAndroid Build Coastguard Worker 
2392*15dc779aSAndroid Build Coastguard Worker           ws1 = ptr_mdct_delay_buffer[trans_offset + w * frame_len_short + frame_len_short + i] *
2393*15dc779aSAndroid Build Coastguard Worker                 ptr_window[frame_len_short - i - 1];
2394*15dc779aSAndroid Build Coastguard Worker 
2395*15dc779aSAndroid Build Coastguard Worker           ws2 = ptr_mdct_delay_buffer[trans_offset + w * frame_len_short + frame_len_short * 2 -
2396*15dc779aSAndroid Build Coastguard Worker                                       i - 1] *
2397*15dc779aSAndroid Build Coastguard Worker                 ptr_window[i];
2398*15dc779aSAndroid Build Coastguard Worker 
2399*15dc779aSAndroid Build Coastguard Worker           ptr_dct_in[frame_len_short / 2 - i - 1] = -(ws1 + ws2);
2400*15dc779aSAndroid Build Coastguard Worker         }
2401*15dc779aSAndroid Build Coastguard Worker         if (frame_len == FRAME_LEN_960) {
2402*15dc779aSAndroid Build Coastguard Worker           ixheaace_mdct_120(ptr_dct_in, ptr_scratch);
2403*15dc779aSAndroid Build Coastguard Worker         } else {
2404*15dc779aSAndroid Build Coastguard Worker           ixheaace_mdct(ptr_dct_in, fft_twiddle_tab, short_window_sine, frame_len_short, 7,
2405*15dc779aSAndroid Build Coastguard Worker                         ptr_scratch);
2406*15dc779aSAndroid Build Coastguard Worker         }
2407*15dc779aSAndroid Build Coastguard Worker       }
2408*15dc779aSAndroid Build Coastguard Worker 
2409*15dc779aSAndroid Build Coastguard Worker       ixheaace_shift_mdct_delay_buffer(ptr_mdct_delay_buffer, ptr_time_signal, ch_increment,
2410*15dc779aSAndroid Build Coastguard Worker                                        frame_len);
2411*15dc779aSAndroid Build Coastguard Worker       break;
2412*15dc779aSAndroid Build Coastguard Worker   }
2413*15dc779aSAndroid Build Coastguard Worker }
2414*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_transform_real_eld(FLOAT32 * ptr_mdct_delay_buffer,const FLOAT32 * ptr_time_signal,WORD32 ch_increment,FLOAT32 * ptr_real_out,WORD8 * ptr_shared_buffer5,WORD32 frame_len)2415*15dc779aSAndroid Build Coastguard Worker VOID ia_enhaacplus_enc_transform_real_eld(FLOAT32 *ptr_mdct_delay_buffer,
2416*15dc779aSAndroid Build Coastguard Worker                                           const FLOAT32 *ptr_time_signal, WORD32 ch_increment,
2417*15dc779aSAndroid Build Coastguard Worker                                           FLOAT32 *ptr_real_out, WORD8 *ptr_shared_buffer5,
2418*15dc779aSAndroid Build Coastguard Worker                                           WORD32 frame_len) {
2419*15dc779aSAndroid Build Coastguard Worker   WORD32 i, loop_len;
2420*15dc779aSAndroid Build Coastguard Worker   FLOAT32 w1, w2;
2421*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_curr_data, *ptr_prev1_data, *ptr_prev2_data, *ptr_prev3_data;
2422*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_win0, *ptr_win1, *ptr_win2, *ptr_win3;
2423*15dc779aSAndroid Build Coastguard Worker 
2424*15dc779aSAndroid Build Coastguard Worker   loop_len = frame_len / 4;
2425*15dc779aSAndroid Build Coastguard Worker 
2426*15dc779aSAndroid Build Coastguard Worker   ptr_curr_data = &ptr_mdct_delay_buffer[3 * frame_len];
2427*15dc779aSAndroid Build Coastguard Worker   ptr_prev1_data = &ptr_mdct_delay_buffer[2 * frame_len];
2428*15dc779aSAndroid Build Coastguard Worker   ptr_prev2_data = &ptr_mdct_delay_buffer[frame_len];
2429*15dc779aSAndroid Build Coastguard Worker   ptr_prev3_data = &ptr_mdct_delay_buffer[0];
2430*15dc779aSAndroid Build Coastguard Worker 
2431*15dc779aSAndroid Build Coastguard Worker   ptr_win0 = &low_delay_window_eld[0];
2432*15dc779aSAndroid Build Coastguard Worker   ptr_win1 = &low_delay_window_eld[frame_len];
2433*15dc779aSAndroid Build Coastguard Worker   ptr_win2 = &low_delay_window_eld[2 * frame_len];
2434*15dc779aSAndroid Build Coastguard Worker   ptr_win3 = &low_delay_window_eld[3 * frame_len];
2435*15dc779aSAndroid Build Coastguard Worker 
2436*15dc779aSAndroid Build Coastguard Worker   memmove(&ptr_mdct_delay_buffer[0], &ptr_mdct_delay_buffer[frame_len],
2437*15dc779aSAndroid Build Coastguard Worker           (3 * frame_len) * sizeof(ptr_mdct_delay_buffer[0]));
2438*15dc779aSAndroid Build Coastguard Worker 
2439*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < frame_len; i++) {
2440*15dc779aSAndroid Build Coastguard Worker     ptr_curr_data[i] = ptr_time_signal[i * ch_increment];
2441*15dc779aSAndroid Build Coastguard Worker   }
2442*15dc779aSAndroid Build Coastguard Worker 
2443*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < loop_len; i++) {
2444*15dc779aSAndroid Build Coastguard Worker     w1 = ptr_prev3_data[(frame_len / 2) + loop_len + i] * ptr_win3[(frame_len / 2) - 1 - i];
2445*15dc779aSAndroid Build Coastguard Worker     w1 += ptr_prev3_data[(frame_len / 2) + loop_len - 1 - i] * ptr_win3[(frame_len / 2) + i];
2446*15dc779aSAndroid Build Coastguard Worker 
2447*15dc779aSAndroid Build Coastguard Worker     w2 = (-ptr_prev1_data[(frame_len / 2) + loop_len + i] * ptr_win1[(frame_len / 2) - 1 - i]);
2448*15dc779aSAndroid Build Coastguard Worker     w2 += (-ptr_prev1_data[(frame_len / 2) + loop_len - 1 - i] * ptr_win1[(frame_len / 2) + i]);
2449*15dc779aSAndroid Build Coastguard Worker 
2450*15dc779aSAndroid Build Coastguard Worker     ptr_real_out[i] = w1 + w2;
2451*15dc779aSAndroid Build Coastguard Worker   }
2452*15dc779aSAndroid Build Coastguard Worker 
2453*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < loop_len; i++) {
2454*15dc779aSAndroid Build Coastguard Worker     w1 = (-ptr_prev2_data[(frame_len / 2) + loop_len + i] * ptr_win2[(frame_len / 2) - 1 - i]);
2455*15dc779aSAndroid Build Coastguard Worker     w1 += ptr_prev2_data[(frame_len / 2) + loop_len - 1 - i] * ptr_win2[(frame_len / 2) + i];
2456*15dc779aSAndroid Build Coastguard Worker 
2457*15dc779aSAndroid Build Coastguard Worker     w2 = ptr_curr_data[(frame_len / 2) + loop_len + i] * ptr_win0[(frame_len / 2) - 1 - i];
2458*15dc779aSAndroid Build Coastguard Worker     w2 += (-ptr_curr_data[(frame_len / 2) + loop_len - 1 - i] * ptr_win0[(frame_len / 2) + i]);
2459*15dc779aSAndroid Build Coastguard Worker 
2460*15dc779aSAndroid Build Coastguard Worker     ptr_real_out[frame_len - 1 - i] = w1 + w2;
2461*15dc779aSAndroid Build Coastguard Worker   }
2462*15dc779aSAndroid Build Coastguard Worker 
2463*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < loop_len; i++) {
2464*15dc779aSAndroid Build Coastguard Worker     w1 = ptr_prev2_data[loop_len - 1 - i] * ptr_win3[i];
2465*15dc779aSAndroid Build Coastguard Worker     w1 += ptr_prev3_data[loop_len + i] * ptr_win3[frame_len - 1 - i];
2466*15dc779aSAndroid Build Coastguard Worker 
2467*15dc779aSAndroid Build Coastguard Worker     w2 = (-ptr_curr_data[loop_len - 1 - i] * ptr_win1[i]);
2468*15dc779aSAndroid Build Coastguard Worker     w2 += (-ptr_prev1_data[loop_len + i] * ptr_win1[frame_len - 1 - i]);
2469*15dc779aSAndroid Build Coastguard Worker 
2470*15dc779aSAndroid Build Coastguard Worker     ptr_real_out[(frame_len / 2) - 1 - i] = w1 + w2;
2471*15dc779aSAndroid Build Coastguard Worker   }
2472*15dc779aSAndroid Build Coastguard Worker 
2473*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < loop_len; i++) {
2474*15dc779aSAndroid Build Coastguard Worker     w1 = -(ptr_prev1_data[loop_len - 1 - i] * ptr_win2[i]);
2475*15dc779aSAndroid Build Coastguard Worker     w1 += ptr_prev2_data[loop_len + i] * ptr_win2[frame_len - 1 - i];
2476*15dc779aSAndroid Build Coastguard Worker 
2477*15dc779aSAndroid Build Coastguard Worker     /* First 128 coeffcients are zeros in the window table so they are not used in the code here*/
2478*15dc779aSAndroid Build Coastguard Worker     w2 = (-ptr_curr_data[loop_len + i] * ptr_win0[frame_len - 1 - i]);
2479*15dc779aSAndroid Build Coastguard Worker 
2480*15dc779aSAndroid Build Coastguard Worker     ptr_real_out[(frame_len / 2) + i] = w1 + w2;
2481*15dc779aSAndroid Build Coastguard Worker   }
2482*15dc779aSAndroid Build Coastguard Worker 
2483*15dc779aSAndroid Build Coastguard Worker   ixheaace_mdct(ptr_real_out, fft_twiddle_tab, long_window_sine_ld, frame_len, 9,
2484*15dc779aSAndroid Build Coastguard Worker                 ptr_shared_buffer5);
2485*15dc779aSAndroid Build Coastguard Worker }
2486