xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_hbe_dft_trans.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker  *
5*15dc779aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker  *
9*15dc779aSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker  *
11*15dc779aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker  * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker  *
17*15dc779aSAndroid Build Coastguard Worker  *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker  */
20*15dc779aSAndroid Build Coastguard Worker #include <math.h>
21*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
22*15dc779aSAndroid Build Coastguard Worker #include <string.h>
23*15dc779aSAndroid Build Coastguard Worker 
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
25*15dc779aSAndroid Build Coastguard Worker 
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
27*15dc779aSAndroid Build Coastguard Worker 
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_interface.h"
29*15dc779aSAndroid Build Coastguard Worker 
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_tns_usac.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
32*15dc779aSAndroid Build Coastguard Worker 
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_acelp_info.h"
34*15dc779aSAndroid Build Coastguard Worker 
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_info.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_sbr_const.h"
43*15dc779aSAndroid Build Coastguard Worker 
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_freq_sca.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lpp_tran.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_calc.h"
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pvc_dec.h"
57*15dc779aSAndroid Build Coastguard Worker 
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_dec.h"
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrqmftrans.h"
61*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_poly.h"
62*15dc779aSAndroid Build Coastguard Worker 
63*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
64*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
65*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_op.h"
66*15dc779aSAndroid Build Coastguard Worker 
67*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_esbr_rom.h"
68*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_map_prot_filter(WORD32 filt_length)69*15dc779aSAndroid Build Coastguard Worker static FLOAT32 *ixheaacd_map_prot_filter(WORD32 filt_length) {
70*15dc779aSAndroid Build Coastguard Worker   switch (filt_length) {
71*15dc779aSAndroid Build Coastguard Worker     case 4:
72*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[0];
73*15dc779aSAndroid Build Coastguard Worker       break;
74*15dc779aSAndroid Build Coastguard Worker     case 8:
75*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[40];
76*15dc779aSAndroid Build Coastguard Worker       break;
77*15dc779aSAndroid Build Coastguard Worker     case 12:
78*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[120];
79*15dc779aSAndroid Build Coastguard Worker       break;
80*15dc779aSAndroid Build Coastguard Worker     case 16:
81*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[240];
82*15dc779aSAndroid Build Coastguard Worker       break;
83*15dc779aSAndroid Build Coastguard Worker     case 20:
84*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[400];
85*15dc779aSAndroid Build Coastguard Worker       break;
86*15dc779aSAndroid Build Coastguard Worker     case 24:
87*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[600];
88*15dc779aSAndroid Build Coastguard Worker       break;
89*15dc779aSAndroid Build Coastguard Worker     case 28:
90*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff_28_36[0];
91*15dc779aSAndroid Build Coastguard Worker       break;
92*15dc779aSAndroid Build Coastguard Worker     case 32:
93*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[840];
94*15dc779aSAndroid Build Coastguard Worker       break;
95*15dc779aSAndroid Build Coastguard Worker     case 36:
96*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff_28_36[280];
97*15dc779aSAndroid Build Coastguard Worker       break;
98*15dc779aSAndroid Build Coastguard Worker     case 40:
99*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[1160];
100*15dc779aSAndroid Build Coastguard Worker       break;
101*15dc779aSAndroid Build Coastguard Worker     case 44:
102*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[1560];
103*15dc779aSAndroid Build Coastguard Worker       break;
104*15dc779aSAndroid Build Coastguard Worker     default:
105*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[0];
106*15dc779aSAndroid Build Coastguard Worker   }
107*15dc779aSAndroid Build Coastguard Worker }
108*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_create_dft_hbe_window(FLOAT32 * win,WORD32 x_over_bin1,WORD32 x_over_bin2,WORD32 ts,WORD32 size)109*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_create_dft_hbe_window(FLOAT32 *win, WORD32 x_over_bin1,
110*15dc779aSAndroid Build Coastguard Worker                                            WORD32 x_over_bin2,
111*15dc779aSAndroid Build Coastguard Worker                                            WORD32 ts, WORD32 size) {
112*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *ptr_freq_domain_win = NULL;
113*15dc779aSAndroid Build Coastguard Worker   WORD32 n;
114*15dc779aSAndroid Build Coastguard Worker   if (ts == 12) {
115*15dc779aSAndroid Build Coastguard Worker     ptr_freq_domain_win = &ixheaac_dft_hbe_window_ts_12[0];
116*15dc779aSAndroid Build Coastguard Worker   } else {
117*15dc779aSAndroid Build Coastguard Worker     ptr_freq_domain_win = &ixheaac_dft_hbe_window_ts_18[0];
118*15dc779aSAndroid Build Coastguard Worker   }
119*15dc779aSAndroid Build Coastguard Worker   for (n = 0; n < (x_over_bin1 - ts / 2); n++) {
120*15dc779aSAndroid Build Coastguard Worker     win[n] = 0;
121*15dc779aSAndroid Build Coastguard Worker   }
122*15dc779aSAndroid Build Coastguard Worker 
123*15dc779aSAndroid Build Coastguard Worker   for (n = (x_over_bin1 - ts / 2); n <= (x_over_bin1 + ts / 2); n++) {
124*15dc779aSAndroid Build Coastguard Worker     win[n] = (FLOAT32)ptr_freq_domain_win[n - (x_over_bin1 - ts / 2)];
125*15dc779aSAndroid Build Coastguard Worker   }
126*15dc779aSAndroid Build Coastguard Worker 
127*15dc779aSAndroid Build Coastguard Worker   for (n = (x_over_bin1 + ts / 2 + 1); n < (x_over_bin2 - ts / 2); n++) {
128*15dc779aSAndroid Build Coastguard Worker     win[n] = (FLOAT32)1.0f;
129*15dc779aSAndroid Build Coastguard Worker   }
130*15dc779aSAndroid Build Coastguard Worker 
131*15dc779aSAndroid Build Coastguard Worker   for (n = (x_over_bin2 - ts / 2); n <= (x_over_bin2 + ts / 2); n++) {
132*15dc779aSAndroid Build Coastguard Worker     win[n] = (FLOAT32)1.0f - ptr_freq_domain_win[n - (x_over_bin2 - ts / 2)];
133*15dc779aSAndroid Build Coastguard Worker   }
134*15dc779aSAndroid Build Coastguard Worker 
135*15dc779aSAndroid Build Coastguard Worker   for (n = (x_over_bin2 + ts / 2 + 1); n < size; n++) {
136*15dc779aSAndroid Build Coastguard Worker     win[n] = 0.0f;
137*15dc779aSAndroid Build Coastguard Worker   }
138*15dc779aSAndroid Build Coastguard Worker }
139*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_calc_anal_synth_window(WORD32 fft_size,FLOAT32 * ptr_window)140*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaacd_calc_anal_synth_window(WORD32 fft_size, FLOAT32 *ptr_window) {
141*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sin_pi_2_N = 0.0f;
142*15dc779aSAndroid Build Coastguard Worker   FLOAT32 cos_pi_2_N = 0.0f;
143*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_sin_pi_n_by_N = NULL;
144*15dc779aSAndroid Build Coastguard Worker   WORD32 hop_stride = 1;
145*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j;
146*15dc779aSAndroid Build Coastguard Worker   WORD32 l_fft_stride = 512;
147*15dc779aSAndroid Build Coastguard Worker   switch (fft_size) {
148*15dc779aSAndroid Build Coastguard Worker     case 64:
149*15dc779aSAndroid Build Coastguard Worker       hop_stride = 16;
150*15dc779aSAndroid Build Coastguard Worker       ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaac_sine_pi_n_by_1024[0];
151*15dc779aSAndroid Build Coastguard Worker       sin_pi_2_N = ptr_sin_pi_n_by_N[hop_stride >> 1];
152*15dc779aSAndroid Build Coastguard Worker       cos_pi_2_N = ptr_sin_pi_n_by_N[512 + (hop_stride >> 1)];
153*15dc779aSAndroid Build Coastguard Worker       l_fft_stride = 512;
154*15dc779aSAndroid Build Coastguard Worker       break;
155*15dc779aSAndroid Build Coastguard Worker     case 128:
156*15dc779aSAndroid Build Coastguard Worker       hop_stride = 8;
157*15dc779aSAndroid Build Coastguard Worker       ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaac_sine_pi_n_by_1024[0];
158*15dc779aSAndroid Build Coastguard Worker       sin_pi_2_N = ptr_sin_pi_n_by_N[hop_stride >> 1];
159*15dc779aSAndroid Build Coastguard Worker       cos_pi_2_N = ptr_sin_pi_n_by_N[512 + (hop_stride >> 1)];
160*15dc779aSAndroid Build Coastguard Worker       l_fft_stride = 512;
161*15dc779aSAndroid Build Coastguard Worker       break;
162*15dc779aSAndroid Build Coastguard Worker     case 256:
163*15dc779aSAndroid Build Coastguard Worker       hop_stride = 4;
164*15dc779aSAndroid Build Coastguard Worker       ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaac_sine_pi_n_by_1024[0];
165*15dc779aSAndroid Build Coastguard Worker       sin_pi_2_N = ptr_sin_pi_n_by_N[hop_stride >> 1];
166*15dc779aSAndroid Build Coastguard Worker       cos_pi_2_N = ptr_sin_pi_n_by_N[512 + (hop_stride >> 1)];
167*15dc779aSAndroid Build Coastguard Worker       l_fft_stride = 512;
168*15dc779aSAndroid Build Coastguard Worker       break;
169*15dc779aSAndroid Build Coastguard Worker     case 512:
170*15dc779aSAndroid Build Coastguard Worker       hop_stride = 2;
171*15dc779aSAndroid Build Coastguard Worker       ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaac_sine_pi_n_by_1024[0];
172*15dc779aSAndroid Build Coastguard Worker       sin_pi_2_N = ptr_sin_pi_n_by_N[1];
173*15dc779aSAndroid Build Coastguard Worker       cos_pi_2_N = ptr_sin_pi_n_by_N[512 + 1];
174*15dc779aSAndroid Build Coastguard Worker       l_fft_stride = 512;
175*15dc779aSAndroid Build Coastguard Worker       break;
176*15dc779aSAndroid Build Coastguard Worker     case 1024:
177*15dc779aSAndroid Build Coastguard Worker       hop_stride = 1;
178*15dc779aSAndroid Build Coastguard Worker       ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaac_sine_pi_n_by_1024[0];
179*15dc779aSAndroid Build Coastguard Worker       sin_pi_2_N = ixheaac_sine_pi_by_2_N[0];
180*15dc779aSAndroid Build Coastguard Worker       cos_pi_2_N = ixheaac_sine_pi_by_2_N[1];
181*15dc779aSAndroid Build Coastguard Worker       l_fft_stride = 512;
182*15dc779aSAndroid Build Coastguard Worker       break;
183*15dc779aSAndroid Build Coastguard Worker     case 192:
184*15dc779aSAndroid Build Coastguard Worker       hop_stride = 4;
185*15dc779aSAndroid Build Coastguard Worker       ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaac_sine_pi_n_by_768[0];
186*15dc779aSAndroid Build Coastguard Worker       sin_pi_2_N = ptr_sin_pi_n_by_N[hop_stride >> 1];
187*15dc779aSAndroid Build Coastguard Worker       cos_pi_2_N = ptr_sin_pi_n_by_N[384 + (hop_stride >> 1)];
188*15dc779aSAndroid Build Coastguard Worker       l_fft_stride = 384;
189*15dc779aSAndroid Build Coastguard Worker       break;
190*15dc779aSAndroid Build Coastguard Worker     case 384:
191*15dc779aSAndroid Build Coastguard Worker       hop_stride = 2;
192*15dc779aSAndroid Build Coastguard Worker       ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaac_sine_pi_n_by_768[0];
193*15dc779aSAndroid Build Coastguard Worker       sin_pi_2_N = ptr_sin_pi_n_by_N[1];
194*15dc779aSAndroid Build Coastguard Worker       cos_pi_2_N = ptr_sin_pi_n_by_N[384 + 1];
195*15dc779aSAndroid Build Coastguard Worker       l_fft_stride = 384;
196*15dc779aSAndroid Build Coastguard Worker       break;
197*15dc779aSAndroid Build Coastguard Worker     case 768:
198*15dc779aSAndroid Build Coastguard Worker       hop_stride = 1;
199*15dc779aSAndroid Build Coastguard Worker       ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaac_sine_pi_n_by_768[0];
200*15dc779aSAndroid Build Coastguard Worker       sin_pi_2_N = ixheaac_sine_pi_by_2_N[8];
201*15dc779aSAndroid Build Coastguard Worker       cos_pi_2_N = ixheaac_sine_pi_by_2_N[9];
202*15dc779aSAndroid Build Coastguard Worker       l_fft_stride = 384;
203*15dc779aSAndroid Build Coastguard Worker       break;
204*15dc779aSAndroid Build Coastguard Worker     case 320:
205*15dc779aSAndroid Build Coastguard Worker       hop_stride = 3;
206*15dc779aSAndroid Build Coastguard Worker       ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaac_sine_pi_n_by_960[0];
207*15dc779aSAndroid Build Coastguard Worker       sin_pi_2_N = ixheaac_sine_pi_by_2_N[16];
208*15dc779aSAndroid Build Coastguard Worker       cos_pi_2_N = ixheaac_sine_pi_by_2_N[17];
209*15dc779aSAndroid Build Coastguard Worker       l_fft_stride = 480;
210*15dc779aSAndroid Build Coastguard Worker       break;
211*15dc779aSAndroid Build Coastguard Worker     case 960:
212*15dc779aSAndroid Build Coastguard Worker       hop_stride = 1;
213*15dc779aSAndroid Build Coastguard Worker       ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaac_sine_pi_n_by_960[0];
214*15dc779aSAndroid Build Coastguard Worker       sin_pi_2_N = ixheaac_sine_pi_by_2_N[2];
215*15dc779aSAndroid Build Coastguard Worker       cos_pi_2_N = ixheaac_sine_pi_by_2_N[3];
216*15dc779aSAndroid Build Coastguard Worker       l_fft_stride = 480;
217*15dc779aSAndroid Build Coastguard Worker       break;
218*15dc779aSAndroid Build Coastguard Worker     case 448:
219*15dc779aSAndroid Build Coastguard Worker       hop_stride = 2;
220*15dc779aSAndroid Build Coastguard Worker       ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaac_sine_pi_n_by_896[0];
221*15dc779aSAndroid Build Coastguard Worker       sin_pi_2_N = ptr_sin_pi_n_by_N[1];
222*15dc779aSAndroid Build Coastguard Worker       cos_pi_2_N = ptr_sin_pi_n_by_N[448 + 1];
223*15dc779aSAndroid Build Coastguard Worker       l_fft_stride = 448;
224*15dc779aSAndroid Build Coastguard Worker       break;
225*15dc779aSAndroid Build Coastguard Worker     case 896:
226*15dc779aSAndroid Build Coastguard Worker       hop_stride = 1;
227*15dc779aSAndroid Build Coastguard Worker       ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaac_sine_pi_n_by_896[0];
228*15dc779aSAndroid Build Coastguard Worker       sin_pi_2_N = ixheaac_sine_pi_by_2_N[4];
229*15dc779aSAndroid Build Coastguard Worker       cos_pi_2_N = ixheaac_sine_pi_by_2_N[5];
230*15dc779aSAndroid Build Coastguard Worker       l_fft_stride = 448;
231*15dc779aSAndroid Build Coastguard Worker       break;
232*15dc779aSAndroid Build Coastguard Worker     case 576:
233*15dc779aSAndroid Build Coastguard Worker       hop_stride = 1;
234*15dc779aSAndroid Build Coastguard Worker       ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaac_sine_pi_n_by_576[0];
235*15dc779aSAndroid Build Coastguard Worker       sin_pi_2_N = ixheaac_sine_pi_by_2_N[14];
236*15dc779aSAndroid Build Coastguard Worker       cos_pi_2_N = ixheaac_sine_pi_by_2_N[15];
237*15dc779aSAndroid Build Coastguard Worker       l_fft_stride = 288;
238*15dc779aSAndroid Build Coastguard Worker       break;
239*15dc779aSAndroid Build Coastguard Worker     case 640:
240*15dc779aSAndroid Build Coastguard Worker       hop_stride = 1;
241*15dc779aSAndroid Build Coastguard Worker       ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaac_sine_pi_n_by_640[0];
242*15dc779aSAndroid Build Coastguard Worker       sin_pi_2_N = ixheaac_sine_pi_by_2_N[12];
243*15dc779aSAndroid Build Coastguard Worker       cos_pi_2_N = ixheaac_sine_pi_by_2_N[13];
244*15dc779aSAndroid Build Coastguard Worker       l_fft_stride = 320;
245*15dc779aSAndroid Build Coastguard Worker       break;
246*15dc779aSAndroid Build Coastguard Worker     case 704:
247*15dc779aSAndroid Build Coastguard Worker       hop_stride = 1;
248*15dc779aSAndroid Build Coastguard Worker       ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaac_sine_pi_n_by_704[0];
249*15dc779aSAndroid Build Coastguard Worker       sin_pi_2_N = ixheaac_sine_pi_by_2_N[10];
250*15dc779aSAndroid Build Coastguard Worker       cos_pi_2_N = ixheaac_sine_pi_by_2_N[11];
251*15dc779aSAndroid Build Coastguard Worker       l_fft_stride = 352;
252*15dc779aSAndroid Build Coastguard Worker       break;
253*15dc779aSAndroid Build Coastguard Worker     case 832:
254*15dc779aSAndroid Build Coastguard Worker       hop_stride = 1;
255*15dc779aSAndroid Build Coastguard Worker       ptr_sin_pi_n_by_N = (FLOAT32 *)&ixheaac_sine_pi_n_by_832[0];
256*15dc779aSAndroid Build Coastguard Worker       sin_pi_2_N = ixheaac_sine_pi_by_2_N[6];
257*15dc779aSAndroid Build Coastguard Worker       cos_pi_2_N = ixheaac_sine_pi_by_2_N[7];
258*15dc779aSAndroid Build Coastguard Worker       l_fft_stride = 416;
259*15dc779aSAndroid Build Coastguard Worker       break;
260*15dc779aSAndroid Build Coastguard Worker     default:
261*15dc779aSAndroid Build Coastguard Worker       return -1;
262*15dc779aSAndroid Build Coastguard Worker   }
263*15dc779aSAndroid Build Coastguard Worker 
264*15dc779aSAndroid Build Coastguard Worker   for (i = 0, j = 0; j < (fft_size >> 1); i += hop_stride, j++) {
265*15dc779aSAndroid Build Coastguard Worker     FLOAT32 cos_val = ptr_sin_pi_n_by_N[i + l_fft_stride];
266*15dc779aSAndroid Build Coastguard Worker     FLOAT32 sin_val = ptr_sin_pi_n_by_N[i];
267*15dc779aSAndroid Build Coastguard Worker     ptr_window[j] = cos_val * sin_pi_2_N + sin_val * cos_pi_2_N;
268*15dc779aSAndroid Build Coastguard Worker   }
269*15dc779aSAndroid Build Coastguard Worker 
270*15dc779aSAndroid Build Coastguard Worker   for (; j < fft_size; j++, i += hop_stride) {
271*15dc779aSAndroid Build Coastguard Worker     FLOAT32 cos_val = ptr_sin_pi_n_by_N[i - l_fft_stride];
272*15dc779aSAndroid Build Coastguard Worker     FLOAT32 sin_val = ptr_sin_pi_n_by_N[i];
273*15dc779aSAndroid Build Coastguard Worker     ptr_window[j] = sin_val * cos_pi_2_N - cos_val * sin_pi_2_N;
274*15dc779aSAndroid Build Coastguard Worker   }
275*15dc779aSAndroid Build Coastguard Worker   return 0;
276*15dc779aSAndroid Build Coastguard Worker }
277*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dft_hbe_data_reinit(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,WORD16 * p_freq_band_tab[2],WORD16 * p_num_sfb)278*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_dft_hbe_data_reinit(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
279*15dc779aSAndroid Build Coastguard Worker                                     WORD16 *p_freq_band_tab[2], WORD16 *p_num_sfb) {
280*15dc779aSAndroid Build Coastguard Worker   WORD32 sfb;
281*15dc779aSAndroid Build Coastguard Worker   WORD32 patch;
282*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
283*15dc779aSAndroid Build Coastguard Worker   WORD32 temp_start;
284*15dc779aSAndroid Build Coastguard Worker   FLOAT32 fb_ratio;
285*15dc779aSAndroid Build Coastguard Worker   WORD32 stop_patch;
286*15dc779aSAndroid Build Coastguard Worker   WORD32 in_hop_size_divisor = 8;
287*15dc779aSAndroid Build Coastguard Worker   static const WORD32 trans_samp[2] = {12, 18};
288*15dc779aSAndroid Build Coastguard Worker   WORD32 err = 0;
289*15dc779aSAndroid Build Coastguard Worker 
290*15dc779aSAndroid Build Coastguard Worker   ptr_hbe_txposer->start_band = p_freq_band_tab[LOW][0];
291*15dc779aSAndroid Build Coastguard Worker   ptr_hbe_txposer->end_band = p_freq_band_tab[LOW][p_num_sfb[LOW]];
292*15dc779aSAndroid Build Coastguard Worker   ptr_hbe_txposer->esbr_hq = 1;
293*15dc779aSAndroid Build Coastguard Worker 
294*15dc779aSAndroid Build Coastguard Worker   ptr_hbe_txposer->synth_size = 4 * ((ptr_hbe_txposer->start_band + 4) / 8 + 1);
295*15dc779aSAndroid Build Coastguard Worker   ptr_hbe_txposer->k_start = ixheaac_start_subband2kL_tbl[ptr_hbe_txposer->start_band];
296*15dc779aSAndroid Build Coastguard Worker 
297*15dc779aSAndroid Build Coastguard Worker   fb_ratio = ptr_hbe_txposer->synth_size / 32.0f;
298*15dc779aSAndroid Build Coastguard Worker 
299*15dc779aSAndroid Build Coastguard Worker   ptr_hbe_txposer->ana_fft_size[0] = (WORD32)(fb_ratio * ptr_hbe_txposer->fft_size[0]);
300*15dc779aSAndroid Build Coastguard Worker   ptr_hbe_txposer->ana_fft_size[1] = (WORD32)(fb_ratio * ptr_hbe_txposer->fft_size[1]);
301*15dc779aSAndroid Build Coastguard Worker 
302*15dc779aSAndroid Build Coastguard Worker   ptr_hbe_txposer->in_hop_size = ptr_hbe_txposer->ana_fft_size[0] / in_hop_size_divisor;
303*15dc779aSAndroid Build Coastguard Worker 
304*15dc779aSAndroid Build Coastguard Worker   ptr_hbe_txposer->synth_window = (FLOAT32 *)&ptr_hbe_txposer->synthesis_window_buf[0];
305*15dc779aSAndroid Build Coastguard Worker   ptr_hbe_txposer->anal_window = (FLOAT32 *)&ptr_hbe_txposer->analysis_window_buf[0];
306*15dc779aSAndroid Build Coastguard Worker 
307*15dc779aSAndroid Build Coastguard Worker   err = ixheaacd_calc_anal_synth_window(ptr_hbe_txposer->ana_fft_size[0],
308*15dc779aSAndroid Build Coastguard Worker                                         ptr_hbe_txposer->anal_window);
309*15dc779aSAndroid Build Coastguard Worker   if (err) {
310*15dc779aSAndroid Build Coastguard Worker     return err;
311*15dc779aSAndroid Build Coastguard Worker   }
312*15dc779aSAndroid Build Coastguard Worker 
313*15dc779aSAndroid Build Coastguard Worker   memset(ptr_hbe_txposer->synth_buf, 0, 1280 * sizeof(ptr_hbe_txposer->synth_buf[0]));
314*15dc779aSAndroid Build Coastguard Worker 
315*15dc779aSAndroid Build Coastguard Worker   ptr_hbe_txposer->synth_wind_coeff = ixheaacd_map_prot_filter(ptr_hbe_txposer->synth_size);
316*15dc779aSAndroid Build Coastguard Worker 
317*15dc779aSAndroid Build Coastguard Worker   temp_start = 2 * ((ptr_hbe_txposer->start_band - 1) / 2);
318*15dc779aSAndroid Build Coastguard Worker   ptr_hbe_txposer->analy_size =
319*15dc779aSAndroid Build Coastguard Worker       4 * ((min(64, ptr_hbe_txposer->end_band + 1) - temp_start - 1) / 4 +
320*15dc779aSAndroid Build Coastguard Worker            1);
321*15dc779aSAndroid Build Coastguard Worker   ptr_hbe_txposer->a_start = temp_start - max(0, temp_start + ptr_hbe_txposer->analy_size - 64);
322*15dc779aSAndroid Build Coastguard Worker 
323*15dc779aSAndroid Build Coastguard Worker   fb_ratio = ptr_hbe_txposer->analy_size / 64.0f;
324*15dc779aSAndroid Build Coastguard Worker 
325*15dc779aSAndroid Build Coastguard Worker   ptr_hbe_txposer->syn_fft_size[0] = (WORD32)(fb_ratio * ptr_hbe_txposer->fft_size[0]);
326*15dc779aSAndroid Build Coastguard Worker   ptr_hbe_txposer->syn_fft_size[1] = (WORD32)(fb_ratio * ptr_hbe_txposer->fft_size[1]);
327*15dc779aSAndroid Build Coastguard Worker 
328*15dc779aSAndroid Build Coastguard Worker   ptr_hbe_txposer->out_hop_size = 2 * ptr_hbe_txposer->syn_fft_size[0] / in_hop_size_divisor;
329*15dc779aSAndroid Build Coastguard Worker 
330*15dc779aSAndroid Build Coastguard Worker   err = ixheaacd_calc_anal_synth_window(ptr_hbe_txposer->syn_fft_size[0],
331*15dc779aSAndroid Build Coastguard Worker                                         ptr_hbe_txposer->synth_window);
332*15dc779aSAndroid Build Coastguard Worker   if (err) {
333*15dc779aSAndroid Build Coastguard Worker     return err;
334*15dc779aSAndroid Build Coastguard Worker   }
335*15dc779aSAndroid Build Coastguard Worker 
336*15dc779aSAndroid Build Coastguard Worker   ptr_hbe_txposer->analy_wind_coeff = ixheaacd_map_prot_filter(ptr_hbe_txposer->analy_size);
337*15dc779aSAndroid Build Coastguard Worker 
338*15dc779aSAndroid Build Coastguard Worker   memset(&ptr_hbe_txposer->x_over_qmf[0], 0, sizeof(ptr_hbe_txposer->x_over_qmf));
339*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < MAX_STRETCH; i++) {
340*15dc779aSAndroid Build Coastguard Worker     memset(&ptr_hbe_txposer->x_over_bin[i][0], 0,
341*15dc779aSAndroid Build Coastguard Worker            2 * sizeof(ptr_hbe_txposer->x_over_bin[i][0]));
342*15dc779aSAndroid Build Coastguard Worker   }
343*15dc779aSAndroid Build Coastguard Worker   sfb = 0;
344*15dc779aSAndroid Build Coastguard Worker   stop_patch = MAX_STRETCH;
345*15dc779aSAndroid Build Coastguard Worker 
346*15dc779aSAndroid Build Coastguard Worker   switch (ptr_hbe_txposer->synth_size) {
347*15dc779aSAndroid Build Coastguard Worker     case 4:
348*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->synth_cos_tab = (FLOAT32 *)ixheaac_synth_cos_table_kl_4;
349*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaac_real_synth_fft_p2;
350*15dc779aSAndroid Build Coastguard Worker       break;
351*15dc779aSAndroid Build Coastguard Worker     case 8:
352*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->synth_cos_tab = (FLOAT32 *)ixheaac_synth_cos_table_kl_8;
353*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaac_real_synth_fft_p2;
354*15dc779aSAndroid Build Coastguard Worker       break;
355*15dc779aSAndroid Build Coastguard Worker     case 12:
356*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->synth_cos_tab = (FLOAT32 *)ixheaac_synth_cos_table_kl_12;
357*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaac_real_synth_fft_p3;
358*15dc779aSAndroid Build Coastguard Worker       break;
359*15dc779aSAndroid Build Coastguard Worker     case 16:
360*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->synth_cos_tab = (FLOAT32 *)ixheaac_synth_cos_table_kl_16;
361*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaac_real_synth_fft_p2;
362*15dc779aSAndroid Build Coastguard Worker       break;
363*15dc779aSAndroid Build Coastguard Worker     case 20:
364*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->synth_cos_tab = (FLOAT32 *)ixheaac_synth_cos_table_kl_20;
365*15dc779aSAndroid Build Coastguard Worker       break;
366*15dc779aSAndroid Build Coastguard Worker     case 28:
367*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->synth_cos_tab = (FLOAT32 *)ixheaac_synth_cos_table_kl_20;
368*15dc779aSAndroid Build Coastguard Worker       break;
369*15dc779aSAndroid Build Coastguard Worker     default:
370*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->synth_cos_tab = (FLOAT32 *)ixheaac_synth_cos_table_kl_4;
371*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaac_real_synth_fft_p2;
372*15dc779aSAndroid Build Coastguard Worker   }
373*15dc779aSAndroid Build Coastguard Worker 
374*15dc779aSAndroid Build Coastguard Worker   {
375*15dc779aSAndroid Build Coastguard Worker     WORD32 l, k, L = ptr_hbe_txposer->analy_size;
376*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < L; k++) {
377*15dc779aSAndroid Build Coastguard Worker       for (l = 0; l < 2 * L; l++) {
378*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->str_dft_hbe_anal_coeff.real[k][l] =
379*15dc779aSAndroid Build Coastguard Worker             (FLOAT32)cos(PI / (2 * L) *
380*15dc779aSAndroid Build Coastguard Worker                          ((k + 0.5) * (2 * l - L / 64.0) - L / 64.0 *
381*15dc779aSAndroid Build Coastguard Worker                           ptr_hbe_txposer->a_start));
382*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->str_dft_hbe_anal_coeff.imag[k][l] =
383*15dc779aSAndroid Build Coastguard Worker             (FLOAT32)sin(PI / (2 * L) *
384*15dc779aSAndroid Build Coastguard Worker                          ((k + 0.5) * (2 * l - L / 64.0) - L / 64.0 *
385*15dc779aSAndroid Build Coastguard Worker                           ptr_hbe_txposer->a_start));
386*15dc779aSAndroid Build Coastguard Worker       }
387*15dc779aSAndroid Build Coastguard Worker     }
388*15dc779aSAndroid Build Coastguard Worker   }
389*15dc779aSAndroid Build Coastguard Worker 
390*15dc779aSAndroid Build Coastguard Worker   for (patch = 1; patch <= stop_patch; patch++) {
391*15dc779aSAndroid Build Coastguard Worker     while (sfb <= p_num_sfb[LOW] &&
392*15dc779aSAndroid Build Coastguard Worker            p_freq_band_tab[LOW][sfb] <= patch * ptr_hbe_txposer->start_band)
393*15dc779aSAndroid Build Coastguard Worker       sfb++;
394*15dc779aSAndroid Build Coastguard Worker     if (sfb <= p_num_sfb[LOW]) {
395*15dc779aSAndroid Build Coastguard Worker       if ((patch * ptr_hbe_txposer->start_band - p_freq_band_tab[LOW][sfb - 1]) <= 3) {
396*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->x_over_qmf[patch - 1] = p_freq_band_tab[LOW][sfb - 1];
397*15dc779aSAndroid Build Coastguard Worker         if (patch <= MAX_STRETCH) {
398*15dc779aSAndroid Build Coastguard Worker           ptr_hbe_txposer->x_over_bin[patch - 1][0] = (WORD32)(
399*15dc779aSAndroid Build Coastguard Worker               ptr_hbe_txposer->fft_size[0] * p_freq_band_tab[LOW][sfb - 1] / 128 + 0.5);
400*15dc779aSAndroid Build Coastguard Worker           ptr_hbe_txposer->x_over_bin[patch - 1][1] = (WORD32)(
401*15dc779aSAndroid Build Coastguard Worker               ptr_hbe_txposer->fft_size[1] * p_freq_band_tab[LOW][sfb - 1] / 128 + 0.5);
402*15dc779aSAndroid Build Coastguard Worker         }
403*15dc779aSAndroid Build Coastguard Worker       } else {
404*15dc779aSAndroid Build Coastguard Worker         WORD32 sfb = 0;
405*15dc779aSAndroid Build Coastguard Worker         while (sfb <= p_num_sfb[HIGH] &&
406*15dc779aSAndroid Build Coastguard Worker                p_freq_band_tab[HIGH][sfb] <= patch * ptr_hbe_txposer->start_band)
407*15dc779aSAndroid Build Coastguard Worker           sfb++;
408*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->x_over_qmf[patch - 1] = p_freq_band_tab[HIGH][sfb - 1];
409*15dc779aSAndroid Build Coastguard Worker         if (patch <= MAX_STRETCH) {
410*15dc779aSAndroid Build Coastguard Worker           ptr_hbe_txposer->x_over_bin[patch - 1][0] = (WORD32)(
411*15dc779aSAndroid Build Coastguard Worker               ptr_hbe_txposer->fft_size[0] * p_freq_band_tab[HIGH][sfb - 1] / 128 + 0.5);
412*15dc779aSAndroid Build Coastguard Worker           ptr_hbe_txposer->x_over_bin[patch - 1][1] = (WORD32)(
413*15dc779aSAndroid Build Coastguard Worker               ptr_hbe_txposer->fft_size[1] * p_freq_band_tab[HIGH][sfb - 1] / 128 + 0.5);
414*15dc779aSAndroid Build Coastguard Worker         }
415*15dc779aSAndroid Build Coastguard Worker       }
416*15dc779aSAndroid Build Coastguard Worker     } else {
417*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->x_over_qmf[patch - 1] = ptr_hbe_txposer->end_band;
418*15dc779aSAndroid Build Coastguard Worker       if (patch <= MAX_STRETCH) {
419*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->x_over_bin[patch - 1][0] =
420*15dc779aSAndroid Build Coastguard Worker             (WORD32)(ptr_hbe_txposer->fft_size[0] * ptr_hbe_txposer->end_band / 128 + 0.5);
421*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->x_over_bin[patch - 1][1] =
422*15dc779aSAndroid Build Coastguard Worker             (WORD32)(ptr_hbe_txposer->fft_size[1] * ptr_hbe_txposer->end_band / 128 + 0.5);
423*15dc779aSAndroid Build Coastguard Worker       }
424*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->max_stretch = min(patch, MAX_STRETCH);
425*15dc779aSAndroid Build Coastguard Worker       break;
426*15dc779aSAndroid Build Coastguard Worker     }
427*15dc779aSAndroid Build Coastguard Worker   }
428*15dc779aSAndroid Build Coastguard Worker 
429*15dc779aSAndroid Build Coastguard Worker   for (patch = 0; patch < ptr_hbe_txposer->max_stretch - 1; patch++) {
430*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 2; i++) {
431*15dc779aSAndroid Build Coastguard Worker       ixheaacd_create_dft_hbe_window(ptr_hbe_txposer->fd_win_buf[patch][i],
432*15dc779aSAndroid Build Coastguard Worker                                      ptr_hbe_txposer->x_over_bin[patch][i],
433*15dc779aSAndroid Build Coastguard Worker                                      ptr_hbe_txposer->x_over_bin[patch + 1][i], trans_samp[i],
434*15dc779aSAndroid Build Coastguard Worker                                      ptr_hbe_txposer->fft_size[i]);
435*15dc779aSAndroid Build Coastguard Worker     }
436*15dc779aSAndroid Build Coastguard Worker   }
437*15dc779aSAndroid Build Coastguard Worker   return 0;
438*15dc779aSAndroid Build Coastguard Worker }
439*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dft_hbe_apply_win(const FLOAT32 * inp1,const FLOAT32 * inp2,FLOAT32 * out,WORD32 n)440*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_dft_hbe_apply_win(const FLOAT32 *inp1, const FLOAT32 *inp2, FLOAT32 *out,
441*15dc779aSAndroid Build Coastguard Worker                                        WORD32 n) {
442*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
443*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < n; i++) {
444*15dc779aSAndroid Build Coastguard Worker     out[i] = inp1[i] * inp2[i];
445*15dc779aSAndroid Build Coastguard Worker   }
446*15dc779aSAndroid Build Coastguard Worker }
447*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dft_hbe_fft_memmove(FLOAT32 * ptr_spectrum,WORD32 size)448*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_dft_hbe_fft_memmove(FLOAT32 *ptr_spectrum, WORD32 size) {
449*15dc779aSAndroid Build Coastguard Worker   WORD32 n;
450*15dc779aSAndroid Build Coastguard Worker 
451*15dc779aSAndroid Build Coastguard Worker   for (n = 0; n < size / 2; n++) {
452*15dc779aSAndroid Build Coastguard Worker     FLOAT32 tmp = ptr_spectrum[n];
453*15dc779aSAndroid Build Coastguard Worker     ptr_spectrum[n] = ptr_spectrum[n + size / 2];
454*15dc779aSAndroid Build Coastguard Worker     ptr_spectrum[n + size / 2] = tmp;
455*15dc779aSAndroid Build Coastguard Worker   }
456*15dc779aSAndroid Build Coastguard Worker }
457*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_karth2polar(FLOAT32 * spectrum,FLOAT32 * mag,FLOAT32 * phase,WORD32 fft_size)458*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_karth2polar(FLOAT32 *spectrum, FLOAT32 *mag, FLOAT32 *phase, WORD32 fft_size) {
459*15dc779aSAndroid Build Coastguard Worker   WORD32 n;
460*15dc779aSAndroid Build Coastguard Worker 
461*15dc779aSAndroid Build Coastguard Worker   for (n = 1; n < fft_size / 2; n++) {
462*15dc779aSAndroid Build Coastguard Worker     phase[n] = (FLOAT32)atan2(spectrum[2 * n + 1], spectrum[2 * n]);
463*15dc779aSAndroid Build Coastguard Worker     mag[n] = (FLOAT32)sqrt(spectrum[2 * n] * spectrum[2 * n] +
464*15dc779aSAndroid Build Coastguard Worker                            spectrum[2 * n + 1] * spectrum[2 * n + 1]);
465*15dc779aSAndroid Build Coastguard Worker   }
466*15dc779aSAndroid Build Coastguard Worker 
467*15dc779aSAndroid Build Coastguard Worker   if (spectrum[0] < 0) {
468*15dc779aSAndroid Build Coastguard Worker     phase[0] = (FLOAT32)acos(-1);
469*15dc779aSAndroid Build Coastguard Worker     mag[0] = -spectrum[0];
470*15dc779aSAndroid Build Coastguard Worker   } else {
471*15dc779aSAndroid Build Coastguard Worker     phase[0] = 0;
472*15dc779aSAndroid Build Coastguard Worker     mag[0] = spectrum[0];
473*15dc779aSAndroid Build Coastguard Worker   }
474*15dc779aSAndroid Build Coastguard Worker 
475*15dc779aSAndroid Build Coastguard Worker   if (spectrum[1] < 0) {
476*15dc779aSAndroid Build Coastguard Worker     phase[fft_size / 2] = (FLOAT32)acos(-1);
477*15dc779aSAndroid Build Coastguard Worker     mag[fft_size / 2] = -spectrum[1];
478*15dc779aSAndroid Build Coastguard Worker   } else {
479*15dc779aSAndroid Build Coastguard Worker     phase[fft_size / 2] = 0;
480*15dc779aSAndroid Build Coastguard Worker     mag[fft_size / 2] = spectrum[1];
481*15dc779aSAndroid Build Coastguard Worker   }
482*15dc779aSAndroid Build Coastguard Worker }
483*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_hbe_fft_table(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer)484*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_fft_table(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer) {
485*15dc779aSAndroid Build Coastguard Worker   WORD32 oversampling_flag = ptr_hbe_txposer->oversampling_flag;
486*15dc779aSAndroid Build Coastguard Worker   WORD32 ana_fft_size = ptr_hbe_txposer->ana_fft_size[oversampling_flag];
487*15dc779aSAndroid Build Coastguard Worker   WORD32 syn_fft_size = ptr_hbe_txposer->syn_fft_size[oversampling_flag];
488*15dc779aSAndroid Build Coastguard Worker 
489*15dc779aSAndroid Build Coastguard Worker   switch (ana_fft_size) {
490*15dc779aSAndroid Build Coastguard Worker     case 576:
491*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ana_cos_sin_tab = (FLOAT32 *)ixheaac_sin_cos_576;
492*15dc779aSAndroid Build Coastguard Worker       break;
493*15dc779aSAndroid Build Coastguard Worker     case 384:
494*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ana_cos_sin_tab = (FLOAT32 *)ixheaac_sin_cos_384;
495*15dc779aSAndroid Build Coastguard Worker       break;
496*15dc779aSAndroid Build Coastguard Worker     case 512:
497*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ana_cos_sin_tab = (FLOAT32 *)ixheaac_sin_cos_512;
498*15dc779aSAndroid Build Coastguard Worker       break;
499*15dc779aSAndroid Build Coastguard Worker     case 768:
500*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ana_cos_sin_tab = (FLOAT32 *)ixheaac_sin_cos_768;
501*15dc779aSAndroid Build Coastguard Worker       break;
502*15dc779aSAndroid Build Coastguard Worker     default:
503*15dc779aSAndroid Build Coastguard Worker       break;
504*15dc779aSAndroid Build Coastguard Worker   }
505*15dc779aSAndroid Build Coastguard Worker 
506*15dc779aSAndroid Build Coastguard Worker   switch (syn_fft_size) {
507*15dc779aSAndroid Build Coastguard Worker     case 448:
508*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->syn_cos_sin_tab = (FLOAT32 *)ixheaac_sin_cos_448;
509*15dc779aSAndroid Build Coastguard Worker       break;
510*15dc779aSAndroid Build Coastguard Worker     case 512:
511*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->syn_cos_sin_tab = (FLOAT32 *)ixheaac_sin_cos_512;
512*15dc779aSAndroid Build Coastguard Worker       break;
513*15dc779aSAndroid Build Coastguard Worker     case 768:
514*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->syn_cos_sin_tab = (FLOAT32 *)ixheaac_sin_cos_768;
515*15dc779aSAndroid Build Coastguard Worker       break;
516*15dc779aSAndroid Build Coastguard Worker     case 672:
517*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->syn_cos_sin_tab = (FLOAT32 *)ixheaac_sin_cos_672;
518*15dc779aSAndroid Build Coastguard Worker       break;
519*15dc779aSAndroid Build Coastguard Worker     default:
520*15dc779aSAndroid Build Coastguard Worker       break;
521*15dc779aSAndroid Build Coastguard Worker   }
522*15dc779aSAndroid Build Coastguard Worker }
523*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_hbe_fft_map(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer)524*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_hbe_fft_map(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer) {
525*15dc779aSAndroid Build Coastguard Worker   WORD32 oversampling_flag = ptr_hbe_txposer->oversampling_flag;
526*15dc779aSAndroid Build Coastguard Worker   WORD32 ana_fft_size = ptr_hbe_txposer->ana_fft_size[oversampling_flag];
527*15dc779aSAndroid Build Coastguard Worker   WORD32 syn_fft_size = ptr_hbe_txposer->syn_fft_size[oversampling_flag];
528*15dc779aSAndroid Build Coastguard Worker 
529*15dc779aSAndroid Build Coastguard Worker   switch (ana_fft_size) {
530*15dc779aSAndroid Build Coastguard Worker     case 576:
531*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ana_cos_sin_tab = (FLOAT32 *)ixheaac_sin_cos_576;
532*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ixheaacd_hbe_anal_fft = &ixheaacd_hbe_apply_fft_288;
533*15dc779aSAndroid Build Coastguard Worker       break;
534*15dc779aSAndroid Build Coastguard Worker     case 384:
535*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ana_cos_sin_tab = (FLOAT32 *)ixheaac_sin_cos_384;
536*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ixheaacd_hbe_anal_fft = &ixheaacd_hbe_apply_cfftn_gen;
537*15dc779aSAndroid Build Coastguard Worker       break;
538*15dc779aSAndroid Build Coastguard Worker     case 512:
539*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ana_cos_sin_tab = (FLOAT32 *)ixheaac_sin_cos_512;
540*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ixheaacd_hbe_anal_fft = &ixheaacd_hbe_apply_cfftn;
541*15dc779aSAndroid Build Coastguard Worker       break;
542*15dc779aSAndroid Build Coastguard Worker     case 768:
543*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ana_cos_sin_tab = (FLOAT32 *)ixheaac_sin_cos_768;
544*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ixheaacd_hbe_anal_fft = &ixheaacd_hbe_apply_cfftn_gen;
545*15dc779aSAndroid Build Coastguard Worker       break;
546*15dc779aSAndroid Build Coastguard Worker     default:
547*15dc779aSAndroid Build Coastguard Worker       return IA_FATAL_ERROR;
548*15dc779aSAndroid Build Coastguard Worker       break;
549*15dc779aSAndroid Build Coastguard Worker   }
550*15dc779aSAndroid Build Coastguard Worker 
551*15dc779aSAndroid Build Coastguard Worker   switch (syn_fft_size) {
552*15dc779aSAndroid Build Coastguard Worker     case 448:
553*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->syn_cos_sin_tab = (FLOAT32 *)ixheaac_sin_cos_448;
554*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ixheaacd_hbe_synth_ifft = &ixheaacd_hbe_apply_ifft_224;
555*15dc779aSAndroid Build Coastguard Worker       break;
556*15dc779aSAndroid Build Coastguard Worker     case 512:
557*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->syn_cos_sin_tab = (FLOAT32 *)ixheaac_sin_cos_512;
558*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ixheaacd_hbe_synth_ifft = &ixheaacd_hbe_apply_cfftn;
559*15dc779aSAndroid Build Coastguard Worker       break;
560*15dc779aSAndroid Build Coastguard Worker     case 768:
561*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->syn_cos_sin_tab = (FLOAT32 *)ixheaac_sin_cos_768;
562*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ixheaacd_hbe_synth_ifft = &ixheaacd_hbe_apply_cfftn_gen;
563*15dc779aSAndroid Build Coastguard Worker       break;
564*15dc779aSAndroid Build Coastguard Worker     case 672:
565*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->syn_cos_sin_tab = (FLOAT32 *)ixheaac_sin_cos_672;
566*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->ixheaacd_hbe_synth_ifft = &ixheaacd_hbe_apply_ifft_336;
567*15dc779aSAndroid Build Coastguard Worker       break;
568*15dc779aSAndroid Build Coastguard Worker     default:
569*15dc779aSAndroid Build Coastguard Worker       return IA_FATAL_ERROR;
570*15dc779aSAndroid Build Coastguard Worker       break;
571*15dc779aSAndroid Build Coastguard Worker   }
572*15dc779aSAndroid Build Coastguard Worker 
573*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
574*15dc779aSAndroid Build Coastguard Worker }
575*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dft_hbe_apply_polar_t2(WORD32 trans_fac,ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,WORD32 pitch_in_bins,WORD out_transform_size)576*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_dft_hbe_apply_polar_t2(
577*15dc779aSAndroid Build Coastguard Worker     WORD32 trans_fac, ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
578*15dc779aSAndroid Build Coastguard Worker     WORD32 pitch_in_bins, WORD out_transform_size) {
579*15dc779aSAndroid Build Coastguard Worker   WORD32 tr;
580*15dc779aSAndroid Build Coastguard Worker   WORD32 ti;
581*15dc779aSAndroid Build Coastguard Worker   WORD32 m_tr;
582*15dc779aSAndroid Build Coastguard Worker   WORD32 p, i;
583*15dc779aSAndroid Build Coastguard Worker   FLOAT32 mag_t;
584*15dc779aSAndroid Build Coastguard Worker   FLOAT32 phase_t;
585*15dc779aSAndroid Build Coastguard Worker   FLOAT32 m_val;
586*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*fd_win_buf)[3][3][1536] = &ptr_hbe_txposer->fd_win_buf;
587*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *phase = ptr_hbe_txposer->phase;
588*15dc779aSAndroid Build Coastguard Worker   WORD32 oversampling_flag = ptr_hbe_txposer->oversampling_flag;
589*15dc779aSAndroid Build Coastguard Worker   WORD32 fft_size = ptr_hbe_txposer->fft_size[oversampling_flag];
590*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_spectrum_tx = ptr_hbe_txposer->ptr_spectrum_tx;
591*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *mag = ptr_hbe_txposer->mag;
592*15dc779aSAndroid Build Coastguard Worker   FLOAT32 p_flt = fft_size * pitch_in_bins / 1536.0f;
593*15dc779aSAndroid Build Coastguard Worker   p = (WORD32)p_flt;
594*15dc779aSAndroid Build Coastguard Worker   FLOAT32 q_thr = 4.0f;
595*15dc779aSAndroid Build Coastguard Worker   m_tr = 0;
596*15dc779aSAndroid Build Coastguard Worker 
597*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i <= out_transform_size; i++) {
598*15dc779aSAndroid Build Coastguard Worker     WORD32 utk = i;
599*15dc779aSAndroid Build Coastguard Worker 
600*15dc779aSAndroid Build Coastguard Worker     mag_t = (*fd_win_buf)[trans_fac - 2][oversampling_flag][i] * mag[utk];
601*15dc779aSAndroid Build Coastguard Worker 
602*15dc779aSAndroid Build Coastguard Worker     phase_t = trans_fac * phase[utk];
603*15dc779aSAndroid Build Coastguard Worker 
604*15dc779aSAndroid Build Coastguard Worker     if (phase_t == 0.0) {
605*15dc779aSAndroid Build Coastguard Worker       ptr_spectrum_tx[2 * i] += mag_t;
606*15dc779aSAndroid Build Coastguard Worker     } else {
607*15dc779aSAndroid Build Coastguard Worker       ptr_spectrum_tx[2 * i] += mag_t * (FLOAT32)cos(phase_t);
608*15dc779aSAndroid Build Coastguard Worker       ptr_spectrum_tx[2 * i + 1] += mag_t * (FLOAT32)sin(phase_t);
609*15dc779aSAndroid Build Coastguard Worker     }
610*15dc779aSAndroid Build Coastguard Worker     if (p > 0) {
611*15dc779aSAndroid Build Coastguard Worker       m_val = 0;
612*15dc779aSAndroid Build Coastguard Worker       for (tr = 1; tr < trans_fac; tr++) {
613*15dc779aSAndroid Build Coastguard Worker         FLOAT32 temp;
614*15dc779aSAndroid Build Coastguard Worker         ti = (WORD32)((2.0f * i - tr * p_flt) / trans_fac + 0.5f);
615*15dc779aSAndroid Build Coastguard Worker         if ((ti < 0) || (ti + p > fft_size / 2)) continue;
616*15dc779aSAndroid Build Coastguard Worker         temp = min(mag[ti], mag[ti + p]);
617*15dc779aSAndroid Build Coastguard Worker         if (temp > m_val) {
618*15dc779aSAndroid Build Coastguard Worker           m_val = temp;
619*15dc779aSAndroid Build Coastguard Worker           m_tr = tr;
620*15dc779aSAndroid Build Coastguard Worker           utk = ti;
621*15dc779aSAndroid Build Coastguard Worker         }
622*15dc779aSAndroid Build Coastguard Worker       }
623*15dc779aSAndroid Build Coastguard Worker 
624*15dc779aSAndroid Build Coastguard Worker       if (m_val > q_thr * mag[2 * i / trans_fac]) {
625*15dc779aSAndroid Build Coastguard Worker         mag_t = (FLOAT32)((*fd_win_buf)[trans_fac - 2][oversampling_flag][i] *
626*15dc779aSAndroid Build Coastguard Worker                          sqrt(mag[utk]) * sqrt(mag[utk + p]));
627*15dc779aSAndroid Build Coastguard Worker         phase_t = (trans_fac - m_tr) * phase[utk] + m_tr * phase[utk + p];
628*15dc779aSAndroid Build Coastguard Worker         ptr_spectrum_tx[2 * i] += (FLOAT32)(mag_t * cos(phase_t));
629*15dc779aSAndroid Build Coastguard Worker         ptr_spectrum_tx[2 * i + 1] += (FLOAT32)(mag_t * sin(phase_t));
630*15dc779aSAndroid Build Coastguard Worker       }
631*15dc779aSAndroid Build Coastguard Worker     }
632*15dc779aSAndroid Build Coastguard Worker   }
633*15dc779aSAndroid Build Coastguard Worker }
634*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dft_hbe_apply_polar_t3(WORD32 trans_fac,ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,WORD32 pitch_in_bins,WORD out_transform_size)635*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_dft_hbe_apply_polar_t3(
636*15dc779aSAndroid Build Coastguard Worker     WORD32 trans_fac, ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
637*15dc779aSAndroid Build Coastguard Worker     WORD32 pitch_in_bins, WORD out_transform_size) {
638*15dc779aSAndroid Build Coastguard Worker   WORD32 tr;
639*15dc779aSAndroid Build Coastguard Worker   WORD32 ti;
640*15dc779aSAndroid Build Coastguard Worker   WORD32 m_tr = 0;
641*15dc779aSAndroid Build Coastguard Worker   WORD32 p, i;
642*15dc779aSAndroid Build Coastguard Worker   FLOAT32 mag_t = 0;
643*15dc779aSAndroid Build Coastguard Worker   FLOAT32 phase_t;
644*15dc779aSAndroid Build Coastguard Worker   FLOAT32 m_val;
645*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*fd_win_buf)[3][3][1536] = &ptr_hbe_txposer->fd_win_buf;
646*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *phase = ptr_hbe_txposer->phase;
647*15dc779aSAndroid Build Coastguard Worker   WORD32 oversampling_flag = ptr_hbe_txposer->oversampling_flag;
648*15dc779aSAndroid Build Coastguard Worker   WORD32 fft_size = ptr_hbe_txposer->fft_size[oversampling_flag];
649*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_spectrum_tx = ptr_hbe_txposer->ptr_spectrum_tx;
650*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *mag = ptr_hbe_txposer->mag;
651*15dc779aSAndroid Build Coastguard Worker   FLOAT32 p_flt = fft_size * pitch_in_bins / 1536.0f;
652*15dc779aSAndroid Build Coastguard Worker   p = (WORD32)p_flt;
653*15dc779aSAndroid Build Coastguard Worker   FLOAT32 q_thr = 4.0f;
654*15dc779aSAndroid Build Coastguard Worker 
655*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i <= out_transform_size; i++) {
656*15dc779aSAndroid Build Coastguard Worker     WORD32 utk = 2 * i / trans_fac;
657*15dc779aSAndroid Build Coastguard Worker     FLOAT32 ptk = (2.0f * i / trans_fac) - utk;
658*15dc779aSAndroid Build Coastguard Worker     FLOAT32 k;
659*15dc779aSAndroid Build Coastguard Worker 
660*15dc779aSAndroid Build Coastguard Worker     if (i % 3 == 0) {
661*15dc779aSAndroid Build Coastguard Worker       mag_t = (*fd_win_buf)[trans_fac - 2][oversampling_flag][i] * mag[utk];
662*15dc779aSAndroid Build Coastguard Worker     } else if (i % 3 == 1) {
663*15dc779aSAndroid Build Coastguard Worker       k = (FLOAT32)cbrt(mag[utk]);
664*15dc779aSAndroid Build Coastguard Worker       mag_t = (*fd_win_buf)[trans_fac - 2][oversampling_flag][i] * k *
665*15dc779aSAndroid Build Coastguard Worker              (FLOAT32)pow(mag[utk + 1], ptk);
666*15dc779aSAndroid Build Coastguard Worker     } else if (i % 3 == 2) {
667*15dc779aSAndroid Build Coastguard Worker       k = (FLOAT32)cbrt(mag[utk + 1]);
668*15dc779aSAndroid Build Coastguard Worker       mag_t = (*fd_win_buf)[trans_fac - 2][oversampling_flag][i] *
669*15dc779aSAndroid Build Coastguard Worker              (FLOAT32)pow(mag[utk], 1.0 - ptk) * k;
670*15dc779aSAndroid Build Coastguard Worker     }
671*15dc779aSAndroid Build Coastguard Worker 
672*15dc779aSAndroid Build Coastguard Worker     phase_t = trans_fac * ((1 - ptk) * phase[utk] + ptk * phase[utk + 1]);
673*15dc779aSAndroid Build Coastguard Worker 
674*15dc779aSAndroid Build Coastguard Worker     ptr_spectrum_tx[2 * i] += mag_t * (FLOAT32)cos(phase_t);
675*15dc779aSAndroid Build Coastguard Worker     ptr_spectrum_tx[2 * i + 1] += mag_t * (FLOAT32)sin(phase_t);
676*15dc779aSAndroid Build Coastguard Worker 
677*15dc779aSAndroid Build Coastguard Worker     if (p > 0) {
678*15dc779aSAndroid Build Coastguard Worker       m_val = 0;
679*15dc779aSAndroid Build Coastguard Worker       for (tr = 1; tr < trans_fac; tr++) {
680*15dc779aSAndroid Build Coastguard Worker         FLOAT32 temp;
681*15dc779aSAndroid Build Coastguard Worker         ti = (WORD32)((2.0f * i - tr * p_flt) / trans_fac + 0.5f);
682*15dc779aSAndroid Build Coastguard Worker         if ((ti < 0) || (ti + p > fft_size / 2)) continue;
683*15dc779aSAndroid Build Coastguard Worker         temp = min(mag[ti], mag[ti + p]);
684*15dc779aSAndroid Build Coastguard Worker         if (temp > m_val) {
685*15dc779aSAndroid Build Coastguard Worker           m_val = temp;
686*15dc779aSAndroid Build Coastguard Worker           m_tr = tr;
687*15dc779aSAndroid Build Coastguard Worker           utk = ti;
688*15dc779aSAndroid Build Coastguard Worker         }
689*15dc779aSAndroid Build Coastguard Worker       }
690*15dc779aSAndroid Build Coastguard Worker 
691*15dc779aSAndroid Build Coastguard Worker       if (m_val > q_thr * mag[2 * i / trans_fac]) {
692*15dc779aSAndroid Build Coastguard Worker         FLOAT32 r = (FLOAT32)m_tr / trans_fac;
693*15dc779aSAndroid Build Coastguard Worker         if (m_tr == 1) {
694*15dc779aSAndroid Build Coastguard Worker           k = (FLOAT32)(cbrt((FLOAT32)mag[utk + p]));
695*15dc779aSAndroid Build Coastguard Worker           mag_t = (*fd_win_buf)[trans_fac - 2][oversampling_flag][i] *
696*15dc779aSAndroid Build Coastguard Worker                  (FLOAT32)pow(mag[utk], 1.0 - r) * k;
697*15dc779aSAndroid Build Coastguard Worker           phase_t = (trans_fac - m_tr) * phase[utk] + phase[utk + p];
698*15dc779aSAndroid Build Coastguard Worker         } else if (m_tr == 2) {
699*15dc779aSAndroid Build Coastguard Worker           k = (FLOAT32)(cbrt((FLOAT32)mag[utk]));
700*15dc779aSAndroid Build Coastguard Worker           mag_t = (*fd_win_buf)[trans_fac - 2][oversampling_flag][i] * k *
701*15dc779aSAndroid Build Coastguard Worker                  (FLOAT32)pow(mag[utk + p], r);
702*15dc779aSAndroid Build Coastguard Worker           phase_t = phase[utk] + m_tr * phase[utk + p];
703*15dc779aSAndroid Build Coastguard Worker         }
704*15dc779aSAndroid Build Coastguard Worker 
705*15dc779aSAndroid Build Coastguard Worker         ptr_spectrum_tx[2 * i] += mag_t * (FLOAT32)cos(phase_t);
706*15dc779aSAndroid Build Coastguard Worker         ptr_spectrum_tx[2 * i + 1] += mag_t * (FLOAT32)sin(phase_t);
707*15dc779aSAndroid Build Coastguard Worker       }
708*15dc779aSAndroid Build Coastguard Worker     }
709*15dc779aSAndroid Build Coastguard Worker   }
710*15dc779aSAndroid Build Coastguard Worker }
711*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dft_hbe_apply_polar_t(WORD32 trans_fac,ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,WORD32 pitch_in_bins,WORD out_transform_size)712*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_dft_hbe_apply_polar_t(
713*15dc779aSAndroid Build Coastguard Worker     WORD32 trans_fac, ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
714*15dc779aSAndroid Build Coastguard Worker     WORD32 pitch_in_bins, WORD out_transform_size) {
715*15dc779aSAndroid Build Coastguard Worker   WORD32 tr;
716*15dc779aSAndroid Build Coastguard Worker   WORD32 ti;
717*15dc779aSAndroid Build Coastguard Worker   WORD32 m_tr;
718*15dc779aSAndroid Build Coastguard Worker   WORD32 p, i;
719*15dc779aSAndroid Build Coastguard Worker   FLOAT32 mag_t;
720*15dc779aSAndroid Build Coastguard Worker   FLOAT32 phase_t;
721*15dc779aSAndroid Build Coastguard Worker   FLOAT32 m_val;
722*15dc779aSAndroid Build Coastguard Worker   FLOAT32(*fd_win_buf)[3][3][1536] = &ptr_hbe_txposer->fd_win_buf;
723*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *phase = ptr_hbe_txposer->phase;
724*15dc779aSAndroid Build Coastguard Worker   WORD32 oversampling_flag = ptr_hbe_txposer->oversampling_flag;
725*15dc779aSAndroid Build Coastguard Worker   WORD32 fft_size = ptr_hbe_txposer->fft_size[oversampling_flag];
726*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_spectrum_tx = ptr_hbe_txposer->ptr_spectrum_tx;
727*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *mag = ptr_hbe_txposer->mag;
728*15dc779aSAndroid Build Coastguard Worker   FLOAT32 p_flt = fft_size * pitch_in_bins / 1536.0f;
729*15dc779aSAndroid Build Coastguard Worker   p = (WORD32)p_flt;
730*15dc779aSAndroid Build Coastguard Worker   FLOAT32 q_thr = 4.0f;
731*15dc779aSAndroid Build Coastguard Worker   m_tr = 0;
732*15dc779aSAndroid Build Coastguard Worker 
733*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i <= out_transform_size; i++) {
734*15dc779aSAndroid Build Coastguard Worker     WORD32 utk = 2 * i / trans_fac;
735*15dc779aSAndroid Build Coastguard Worker     FLOAT32 ptk = (2.0f * i / trans_fac) - utk;
736*15dc779aSAndroid Build Coastguard Worker 
737*15dc779aSAndroid Build Coastguard Worker     mag_t = (*fd_win_buf)[trans_fac - 2][oversampling_flag][i] *
738*15dc779aSAndroid Build Coastguard Worker             (FLOAT32)pow(mag[utk], 1.0f - ptk) * (FLOAT32)pow(mag[utk + 1], ptk);
739*15dc779aSAndroid Build Coastguard Worker 
740*15dc779aSAndroid Build Coastguard Worker     phase_t = trans_fac * ((1 - ptk) * phase[utk] + ptk * phase[utk + 1]);
741*15dc779aSAndroid Build Coastguard Worker 
742*15dc779aSAndroid Build Coastguard Worker     ptr_spectrum_tx[2 * i] += mag_t * (FLOAT32)cos(phase_t);
743*15dc779aSAndroid Build Coastguard Worker     ptr_spectrum_tx[2 * i + 1] += mag_t * (FLOAT32)sin(phase_t);
744*15dc779aSAndroid Build Coastguard Worker 
745*15dc779aSAndroid Build Coastguard Worker     if (p > 0) {
746*15dc779aSAndroid Build Coastguard Worker       m_val = 0;
747*15dc779aSAndroid Build Coastguard Worker       for (tr = 1; tr < trans_fac; tr++) {
748*15dc779aSAndroid Build Coastguard Worker         FLOAT32 temp;
749*15dc779aSAndroid Build Coastguard Worker         ti = (WORD32)((2.0f * i - tr * p_flt) / trans_fac + 0.5f);
750*15dc779aSAndroid Build Coastguard Worker         if ((ti < 0) || (ti + p > fft_size / 2)) continue;
751*15dc779aSAndroid Build Coastguard Worker         temp = min(mag[ti], mag[ti + p]);
752*15dc779aSAndroid Build Coastguard Worker         if (temp > m_val) {
753*15dc779aSAndroid Build Coastguard Worker           m_val = temp;
754*15dc779aSAndroid Build Coastguard Worker           m_tr = tr;
755*15dc779aSAndroid Build Coastguard Worker           utk = ti;
756*15dc779aSAndroid Build Coastguard Worker         }
757*15dc779aSAndroid Build Coastguard Worker       }
758*15dc779aSAndroid Build Coastguard Worker 
759*15dc779aSAndroid Build Coastguard Worker       if (m_val > q_thr * mag[2 * i / trans_fac]) {
760*15dc779aSAndroid Build Coastguard Worker         FLOAT32 r = (FLOAT32)m_tr / trans_fac;
761*15dc779aSAndroid Build Coastguard Worker         mag_t = (*fd_win_buf)[trans_fac - 2][oversampling_flag][i] *
762*15dc779aSAndroid Build Coastguard Worker                 (FLOAT32)pow(mag[utk], 1.0 - r) * (FLOAT32)pow(mag[utk + p], r);
763*15dc779aSAndroid Build Coastguard Worker         phase_t = (trans_fac - m_tr) * phase[utk] + m_tr * phase[utk + p];
764*15dc779aSAndroid Build Coastguard Worker         ptr_spectrum_tx[2 * i] += mag_t * (FLOAT32)cos(phase_t);
765*15dc779aSAndroid Build Coastguard Worker         ptr_spectrum_tx[2 * i + 1] += mag_t * (FLOAT32)sin(phase_t);
766*15dc779aSAndroid Build Coastguard Worker       }
767*15dc779aSAndroid Build Coastguard Worker     }
768*15dc779aSAndroid Build Coastguard Worker   }
769*15dc779aSAndroid Build Coastguard Worker }
770*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dft_hbe_apply(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,FLOAT32 qmf_buf_real[][64],FLOAT32 qmf_buf_imag[][64],WORD32 num_columns,FLOAT32 pv_qmf_buf_real[][64],FLOAT32 pv_qmf_buf_imag[][64],WORD32 pitch_in_bins,FLOAT32 * dft_hbe_scratch_buf)771*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_dft_hbe_apply(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
772*15dc779aSAndroid Build Coastguard Worker                               FLOAT32 qmf_buf_real[][64], FLOAT32 qmf_buf_imag[][64],
773*15dc779aSAndroid Build Coastguard Worker                               WORD32 num_columns, FLOAT32 pv_qmf_buf_real[][64],
774*15dc779aSAndroid Build Coastguard Worker                               FLOAT32 pv_qmf_buf_imag[][64], WORD32 pitch_in_bins,
775*15dc779aSAndroid Build Coastguard Worker                               FLOAT32 *dft_hbe_scratch_buf) {
776*15dc779aSAndroid Build Coastguard Worker   WORD32 in_offset = 0;
777*15dc779aSAndroid Build Coastguard Worker   WORD32 out_offset = 0;
778*15dc779aSAndroid Build Coastguard Worker   WORD32 in_hop_size = ptr_hbe_txposer->in_hop_size;
779*15dc779aSAndroid Build Coastguard Worker   WORD32 oversampling_flag = ptr_hbe_txposer->oversampling_flag;
780*15dc779aSAndroid Build Coastguard Worker   WORD32 fft_size = ptr_hbe_txposer->fft_size[oversampling_flag];
781*15dc779aSAndroid Build Coastguard Worker 
782*15dc779aSAndroid Build Coastguard Worker   WORD32 out_hop_size = ptr_hbe_txposer->out_hop_size;
783*15dc779aSAndroid Build Coastguard Worker   WORD32 num_in_samples = num_columns * ptr_hbe_txposer->synth_size;
784*15dc779aSAndroid Build Coastguard Worker   WORD32 ana_fft_size = ptr_hbe_txposer->ana_fft_size[oversampling_flag];
785*15dc779aSAndroid Build Coastguard Worker   WORD32 syn_fft_size = ptr_hbe_txposer->syn_fft_size[oversampling_flag];
786*15dc779aSAndroid Build Coastguard Worker 
787*15dc779aSAndroid Build Coastguard Worker   WORD32 ana_pad_size = (ana_fft_size - ptr_hbe_txposer->ana_fft_size[0]) / 2;
788*15dc779aSAndroid Build Coastguard Worker   WORD32 syn_pad_size = (syn_fft_size - ptr_hbe_txposer->syn_fft_size[0]) / 2;
789*15dc779aSAndroid Build Coastguard Worker 
790*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_input_buf = ptr_hbe_txposer->ptr_input_buf;
791*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_output_buf = ptr_hbe_txposer->ptr_output_buf;
792*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_spectrum = ptr_hbe_txposer->ptr_spectrum;
793*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_spectrum_tx = ptr_hbe_txposer->ptr_spectrum_tx;
794*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *mag = ptr_hbe_txposer->mag;
795*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *phase = ptr_hbe_txposer->phase;
796*15dc779aSAndroid Build Coastguard Worker   WORD32 i, trans_fac;
797*15dc779aSAndroid Build Coastguard Worker 
798*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_cos_fft;
799*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_cos_ifft;
800*15dc779aSAndroid Build Coastguard Worker 
801*15dc779aSAndroid Build Coastguard Worker   WORD32 ana_fft_offset = ptr_hbe_txposer->k_start * fft_size / 32;
802*15dc779aSAndroid Build Coastguard Worker   WORD32 syn_fft_offset = ptr_hbe_txposer->a_start * fft_size / 64;
803*15dc779aSAndroid Build Coastguard Worker 
804*15dc779aSAndroid Build Coastguard Worker   WORD32 err_code = IA_NO_ERROR;
805*15dc779aSAndroid Build Coastguard Worker 
806*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_hbe_txposer->ptr_input_buf,
807*15dc779aSAndroid Build Coastguard Worker          ptr_hbe_txposer->ptr_input_buf + ptr_hbe_txposer->ana_fft_size[0],
808*15dc779aSAndroid Build Coastguard Worker          ptr_hbe_txposer->ana_fft_size[0] * sizeof(ptr_hbe_txposer->ptr_input_buf[0]));
809*15dc779aSAndroid Build Coastguard Worker 
810*15dc779aSAndroid Build Coastguard Worker   ixheaacd_real_synth_filt(ptr_hbe_txposer, num_columns, qmf_buf_real, qmf_buf_imag);
811*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_output_buf, ptr_output_buf + 2 * ptr_hbe_txposer->syn_fft_size[0],
812*15dc779aSAndroid Build Coastguard Worker          2 * ptr_hbe_txposer->syn_fft_size[0] * sizeof(*ptr_output_buf));
813*15dc779aSAndroid Build Coastguard Worker 
814*15dc779aSAndroid Build Coastguard Worker   memset(ptr_output_buf + 2 * ptr_hbe_txposer->syn_fft_size[0], 0,
815*15dc779aSAndroid Build Coastguard Worker          2 * ptr_hbe_txposer->syn_fft_size[0] * sizeof(*ptr_output_buf));
816*15dc779aSAndroid Build Coastguard Worker 
817*15dc779aSAndroid Build Coastguard Worker   err_code = ixheaacd_hbe_fft_map(ptr_hbe_txposer);
818*15dc779aSAndroid Build Coastguard Worker   if (err_code) return err_code;
819*15dc779aSAndroid Build Coastguard Worker   while (in_offset < num_in_samples) {
820*15dc779aSAndroid Build Coastguard Worker     memset(ptr_spectrum, 0, fft_size * sizeof(FLOAT32));
821*15dc779aSAndroid Build Coastguard Worker     memset(ptr_spectrum_tx, 0, ((fft_size + 2) * sizeof(FLOAT32)));
822*15dc779aSAndroid Build Coastguard Worker 
823*15dc779aSAndroid Build Coastguard Worker     memset(mag, 0, (fft_size / 2 + 2) * sizeof(FLOAT32));
824*15dc779aSAndroid Build Coastguard Worker     memset(phase, 0, (fft_size / 2 + 2) * sizeof(FLOAT32));
825*15dc779aSAndroid Build Coastguard Worker     ixheaacd_dft_hbe_apply_win(ptr_input_buf + in_offset, ptr_hbe_txposer->anal_window,
826*15dc779aSAndroid Build Coastguard Worker                                ptr_spectrum + ana_pad_size + ana_fft_offset,
827*15dc779aSAndroid Build Coastguard Worker                                ptr_hbe_txposer->ana_fft_size[0]);
828*15dc779aSAndroid Build Coastguard Worker     ixheaacd_dft_hbe_fft_memmove(ptr_spectrum + ana_fft_offset, ana_fft_size);
829*15dc779aSAndroid Build Coastguard Worker     {
830*15dc779aSAndroid Build Coastguard Worker       WORD32 len = ana_fft_size;
831*15dc779aSAndroid Build Coastguard Worker       ptr_cos_fft = ptr_hbe_txposer->ana_cos_sin_tab;
832*15dc779aSAndroid Build Coastguard Worker       FLOAT32 *ptr_fft_data = ptr_spectrum + ana_fft_offset;
833*15dc779aSAndroid Build Coastguard Worker       FLOAT32 tmp1, tmp2, tmp3, tmp4;
834*15dc779aSAndroid Build Coastguard Worker 
835*15dc779aSAndroid Build Coastguard Worker       (*(ptr_hbe_txposer->ixheaacd_hbe_anal_fft))(ptr_fft_data, dft_hbe_scratch_buf,
836*15dc779aSAndroid Build Coastguard Worker                                                   len / 2, -1);
837*15dc779aSAndroid Build Coastguard Worker 
838*15dc779aSAndroid Build Coastguard Worker       tmp1 = ptr_fft_data[0] + ptr_fft_data[1];
839*15dc779aSAndroid Build Coastguard Worker       ptr_fft_data[1] = ptr_fft_data[0] - ptr_fft_data[1];
840*15dc779aSAndroid Build Coastguard Worker       ptr_fft_data[0] = tmp1;
841*15dc779aSAndroid Build Coastguard Worker 
842*15dc779aSAndroid Build Coastguard Worker       for (i = 1; i <= (len / 4 + (len % 4) / 2); ++i) {
843*15dc779aSAndroid Build Coastguard Worker         tmp1 = ptr_fft_data[2 * i] - ptr_fft_data[len - 2 * i];
844*15dc779aSAndroid Build Coastguard Worker         tmp2 = ptr_fft_data[2 * i + 1] + ptr_fft_data[len - 2 * i + 1];
845*15dc779aSAndroid Build Coastguard Worker 
846*15dc779aSAndroid Build Coastguard Worker         tmp3 = (*(ptr_cos_fft)) * tmp1 -
847*15dc779aSAndroid Build Coastguard Worker                (*(ptr_cos_fft + 1)) * tmp2;
848*15dc779aSAndroid Build Coastguard Worker         tmp4 = (*(ptr_cos_fft + 1)) * tmp1 +
849*15dc779aSAndroid Build Coastguard Worker                (*(ptr_cos_fft)) * tmp2;
850*15dc779aSAndroid Build Coastguard Worker 
851*15dc779aSAndroid Build Coastguard Worker         ptr_cos_fft = ptr_cos_fft + 2;
852*15dc779aSAndroid Build Coastguard Worker 
853*15dc779aSAndroid Build Coastguard Worker         tmp1 = ptr_fft_data[2 * i] + ptr_fft_data[len - 2 * i];
854*15dc779aSAndroid Build Coastguard Worker         tmp2 = ptr_fft_data[2 * i + 1] - ptr_fft_data[len - 2 * i + 1];
855*15dc779aSAndroid Build Coastguard Worker 
856*15dc779aSAndroid Build Coastguard Worker         ptr_fft_data[2 * i + 0] = 0.5f * (tmp1 - tmp3);
857*15dc779aSAndroid Build Coastguard Worker         ptr_fft_data[2 * i + 1] = 0.5f * (tmp2 - tmp4);
858*15dc779aSAndroid Build Coastguard Worker         ptr_fft_data[len - 2 * i + 0] = 0.5f * (tmp1 + tmp3);
859*15dc779aSAndroid Build Coastguard Worker         ptr_fft_data[len - 2 * i + 1] = -0.5f * (tmp2 + tmp4);
860*15dc779aSAndroid Build Coastguard Worker       }
861*15dc779aSAndroid Build Coastguard Worker     }
862*15dc779aSAndroid Build Coastguard Worker     ixheaacd_karth2polar(ptr_spectrum + ana_fft_offset, mag + ana_fft_offset / 2,
863*15dc779aSAndroid Build Coastguard Worker                          phase + ana_fft_offset / 2, ana_fft_size);
864*15dc779aSAndroid Build Coastguard Worker 
865*15dc779aSAndroid Build Coastguard Worker     for (trans_fac = 2; trans_fac <= ptr_hbe_txposer->max_stretch; trans_fac++) {
866*15dc779aSAndroid Build Coastguard Worker       WORD32 out_transform_size;
867*15dc779aSAndroid Build Coastguard Worker 
868*15dc779aSAndroid Build Coastguard Worker       out_transform_size = (fft_size / 2);
869*15dc779aSAndroid Build Coastguard Worker 
870*15dc779aSAndroid Build Coastguard Worker       switch (trans_fac) {
871*15dc779aSAndroid Build Coastguard Worker         case 2:
872*15dc779aSAndroid Build Coastguard Worker           ixheaacd_dft_hbe_apply_polar_t2(trans_fac, ptr_hbe_txposer,
873*15dc779aSAndroid Build Coastguard Worker                                           pitch_in_bins, out_transform_size);
874*15dc779aSAndroid Build Coastguard Worker           break;
875*15dc779aSAndroid Build Coastguard Worker         case 3:
876*15dc779aSAndroid Build Coastguard Worker           ixheaacd_dft_hbe_apply_polar_t3(trans_fac, ptr_hbe_txposer,
877*15dc779aSAndroid Build Coastguard Worker                                           pitch_in_bins, out_transform_size);
878*15dc779aSAndroid Build Coastguard Worker           break;
879*15dc779aSAndroid Build Coastguard Worker         default:
880*15dc779aSAndroid Build Coastguard Worker           ixheaacd_dft_hbe_apply_polar_t(trans_fac, ptr_hbe_txposer,
881*15dc779aSAndroid Build Coastguard Worker                                          pitch_in_bins, out_transform_size);
882*15dc779aSAndroid Build Coastguard Worker       }
883*15dc779aSAndroid Build Coastguard Worker     }
884*15dc779aSAndroid Build Coastguard Worker 
885*15dc779aSAndroid Build Coastguard Worker     ptr_spectrum_tx[syn_fft_offset + 1] = ptr_spectrum_tx[syn_fft_offset +
886*15dc779aSAndroid Build Coastguard Worker                                                           syn_fft_size];
887*15dc779aSAndroid Build Coastguard Worker 
888*15dc779aSAndroid Build Coastguard Worker     {
889*15dc779aSAndroid Build Coastguard Worker       WORD32 len = syn_fft_size;
890*15dc779aSAndroid Build Coastguard Worker       ptr_cos_ifft = ptr_hbe_txposer->syn_cos_sin_tab;
891*15dc779aSAndroid Build Coastguard Worker       FLOAT32 *ptr_fft_data = ptr_spectrum_tx + syn_fft_offset;
892*15dc779aSAndroid Build Coastguard Worker       FLOAT32 tmp1, tmp2, tmp3, tmp4;
893*15dc779aSAndroid Build Coastguard Worker 
894*15dc779aSAndroid Build Coastguard Worker       FLOAT32 scale = 1.0f / len;
895*15dc779aSAndroid Build Coastguard Worker       tmp1 = ptr_fft_data[0] + ptr_fft_data[1];
896*15dc779aSAndroid Build Coastguard Worker       ptr_fft_data[1] = scale * (ptr_fft_data[0] - ptr_fft_data[1]);
897*15dc779aSAndroid Build Coastguard Worker       ptr_fft_data[0] = scale * tmp1;
898*15dc779aSAndroid Build Coastguard Worker 
899*15dc779aSAndroid Build Coastguard Worker       for (i = 1; i <= (len / 4 + (len % 4) / 2); ++i) {
900*15dc779aSAndroid Build Coastguard Worker         tmp1 = ptr_fft_data[2 * i] - ptr_fft_data[len - 2 * i];
901*15dc779aSAndroid Build Coastguard Worker         tmp2 = ptr_fft_data[2 * i + 1] + ptr_fft_data[len - 2 * i + 1];
902*15dc779aSAndroid Build Coastguard Worker 
903*15dc779aSAndroid Build Coastguard Worker         tmp3 = (*(ptr_cos_ifft)) * tmp1 +
904*15dc779aSAndroid Build Coastguard Worker                (*(ptr_cos_ifft + 1)) * tmp2;
905*15dc779aSAndroid Build Coastguard Worker         tmp4 = -(*(ptr_cos_ifft + 1)) * tmp1 +
906*15dc779aSAndroid Build Coastguard Worker                (*(ptr_cos_ifft)) * tmp2;
907*15dc779aSAndroid Build Coastguard Worker 
908*15dc779aSAndroid Build Coastguard Worker         ptr_cos_ifft = ptr_cos_ifft + 2;
909*15dc779aSAndroid Build Coastguard Worker 
910*15dc779aSAndroid Build Coastguard Worker         tmp1 = ptr_fft_data[2 * i] + ptr_fft_data[len - 2 * i];
911*15dc779aSAndroid Build Coastguard Worker         tmp2 = ptr_fft_data[2 * i + 1] - ptr_fft_data[len - 2 * i + 1];
912*15dc779aSAndroid Build Coastguard Worker 
913*15dc779aSAndroid Build Coastguard Worker         ptr_fft_data[2 * i] = scale * (tmp1 - tmp3);
914*15dc779aSAndroid Build Coastguard Worker         ptr_fft_data[2 * i + 1] = scale * (tmp2 - tmp4);
915*15dc779aSAndroid Build Coastguard Worker         ptr_fft_data[len - 2 * i] = scale * (tmp1 + tmp3);
916*15dc779aSAndroid Build Coastguard Worker         ptr_fft_data[len - 2 * i + 1] = -scale * (tmp2 + tmp4);
917*15dc779aSAndroid Build Coastguard Worker       }
918*15dc779aSAndroid Build Coastguard Worker 
919*15dc779aSAndroid Build Coastguard Worker       (*(ptr_hbe_txposer->ixheaacd_hbe_synth_ifft))(ptr_fft_data, dft_hbe_scratch_buf,
920*15dc779aSAndroid Build Coastguard Worker                                                     len / 2, 1);
921*15dc779aSAndroid Build Coastguard Worker     }
922*15dc779aSAndroid Build Coastguard Worker 
923*15dc779aSAndroid Build Coastguard Worker     ixheaacd_dft_hbe_fft_memmove(ptr_spectrum_tx + syn_fft_offset, syn_fft_size);
924*15dc779aSAndroid Build Coastguard Worker     ixheaacd_dft_hbe_apply_win(
925*15dc779aSAndroid Build Coastguard Worker         ptr_spectrum_tx + syn_pad_size + syn_fft_offset, ptr_hbe_txposer->synth_window,
926*15dc779aSAndroid Build Coastguard Worker         ptr_spectrum_tx + syn_pad_size + syn_fft_offset, ptr_hbe_txposer->syn_fft_size[0]);
927*15dc779aSAndroid Build Coastguard Worker 
928*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < ptr_hbe_txposer->syn_fft_size[0]; i++) {
929*15dc779aSAndroid Build Coastguard Worker       ptr_output_buf[out_offset + i] += ptr_spectrum_tx[syn_pad_size + syn_fft_offset + i];
930*15dc779aSAndroid Build Coastguard Worker     }
931*15dc779aSAndroid Build Coastguard Worker 
932*15dc779aSAndroid Build Coastguard Worker     in_offset += in_hop_size;
933*15dc779aSAndroid Build Coastguard Worker     out_offset += out_hop_size;
934*15dc779aSAndroid Build Coastguard Worker 
935*15dc779aSAndroid Build Coastguard Worker   }
936*15dc779aSAndroid Build Coastguard Worker 
937*15dc779aSAndroid Build Coastguard Worker   err_code = ixheaacd_dft_hbe_cplx_anal_filt(ptr_hbe_txposer, pv_qmf_buf_real,
938*15dc779aSAndroid Build Coastguard Worker                                              pv_qmf_buf_imag);
939*15dc779aSAndroid Build Coastguard Worker 
940*15dc779aSAndroid Build Coastguard Worker   return err_code;
941*15dc779aSAndroid Build Coastguard Worker }
942