xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_hbe_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 
69*15dc779aSAndroid Build Coastguard Worker #define SBR_CONST_PMIN 1.0f
70*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_map_prot_filter(WORD32 filt_length)71*15dc779aSAndroid Build Coastguard Worker static FLOAT32 *ixheaacd_map_prot_filter(WORD32 filt_length) {
72*15dc779aSAndroid Build Coastguard Worker   switch (filt_length) {
73*15dc779aSAndroid Build Coastguard Worker     case 4:
74*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[0];
75*15dc779aSAndroid Build Coastguard Worker       break;
76*15dc779aSAndroid Build Coastguard Worker     case 8:
77*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[40];
78*15dc779aSAndroid Build Coastguard Worker       break;
79*15dc779aSAndroid Build Coastguard Worker     case 12:
80*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[120];
81*15dc779aSAndroid Build Coastguard Worker       break;
82*15dc779aSAndroid Build Coastguard Worker     case 16:
83*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[240];
84*15dc779aSAndroid Build Coastguard Worker       break;
85*15dc779aSAndroid Build Coastguard Worker     case 20:
86*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[400];
87*15dc779aSAndroid Build Coastguard Worker       break;
88*15dc779aSAndroid Build Coastguard Worker     case 24:
89*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[600];
90*15dc779aSAndroid Build Coastguard Worker       break;
91*15dc779aSAndroid Build Coastguard Worker     case 32:
92*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[840];
93*15dc779aSAndroid Build Coastguard Worker       break;
94*15dc779aSAndroid Build Coastguard Worker     case 40:
95*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[1160];
96*15dc779aSAndroid Build Coastguard Worker       break;
97*15dc779aSAndroid Build Coastguard Worker     default:
98*15dc779aSAndroid Build Coastguard Worker       return (FLOAT32 *)&ixheaac_sub_samp_qmf_window_coeff[0];
99*15dc779aSAndroid Build Coastguard Worker   }
100*15dc779aSAndroid Build Coastguard Worker }
101*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_qmf_hbe_data_reinit(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,WORD16 * p_freq_band_tab[2],WORD16 * p_num_sfb,WORD32 upsamp_4_flag)102*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_qmf_hbe_data_reinit(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
103*15dc779aSAndroid Build Coastguard Worker                                     WORD16 *p_freq_band_tab[2],
104*15dc779aSAndroid Build Coastguard Worker                                     WORD16 *p_num_sfb, WORD32 upsamp_4_flag) {
105*15dc779aSAndroid Build Coastguard Worker   WORD32 synth_size, sfb, patch, stop_patch;
106*15dc779aSAndroid Build Coastguard Worker 
107*15dc779aSAndroid Build Coastguard Worker   if (ptr_hbe_txposer != NULL) {
108*15dc779aSAndroid Build Coastguard Worker     ptr_hbe_txposer->start_band = p_freq_band_tab[LOW][0];
109*15dc779aSAndroid Build Coastguard Worker     ptr_hbe_txposer->end_band = p_freq_band_tab[LOW][p_num_sfb[LOW]];
110*15dc779aSAndroid Build Coastguard Worker 
111*15dc779aSAndroid Build Coastguard Worker     ptr_hbe_txposer->synth_size =
112*15dc779aSAndroid Build Coastguard Worker         4 * ((ptr_hbe_txposer->start_band + 4) / 8 + 1);
113*15dc779aSAndroid Build Coastguard Worker     ptr_hbe_txposer->k_start =
114*15dc779aSAndroid Build Coastguard Worker         ixheaac_start_subband2kL_tbl[ptr_hbe_txposer->start_band];
115*15dc779aSAndroid Build Coastguard Worker 
116*15dc779aSAndroid Build Coastguard Worker     ptr_hbe_txposer->upsamp_4_flag = upsamp_4_flag;
117*15dc779aSAndroid Build Coastguard Worker     ptr_hbe_txposer->esbr_hq = 0;
118*15dc779aSAndroid Build Coastguard Worker 
119*15dc779aSAndroid Build Coastguard Worker     if (upsamp_4_flag) {
120*15dc779aSAndroid Build Coastguard Worker       if (ptr_hbe_txposer->k_start + ptr_hbe_txposer->synth_size > 16)
121*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->k_start = 16 - ptr_hbe_txposer->synth_size;
122*15dc779aSAndroid Build Coastguard Worker     } else if (ptr_hbe_txposer->core_frame_length == 768) {
123*15dc779aSAndroid Build Coastguard Worker       if (ptr_hbe_txposer->k_start + ptr_hbe_txposer->synth_size > 24)
124*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->k_start = 24 - ptr_hbe_txposer->synth_size;
125*15dc779aSAndroid Build Coastguard Worker     }
126*15dc779aSAndroid Build Coastguard Worker 
127*15dc779aSAndroid Build Coastguard Worker     memset(ptr_hbe_txposer->synth_buf, 0, 1280 * sizeof(FLOAT32));
128*15dc779aSAndroid Build Coastguard Worker     synth_size = ptr_hbe_txposer->synth_size;
129*15dc779aSAndroid Build Coastguard Worker     ptr_hbe_txposer->synth_buf_offset = 18 * synth_size;
130*15dc779aSAndroid Build Coastguard Worker     switch (synth_size) {
131*15dc779aSAndroid Build Coastguard Worker       case 4:
132*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->synth_cos_tab =
133*15dc779aSAndroid Build Coastguard Worker             (FLOAT32 *)ixheaac_synth_cos_table_kl_4;
134*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->analy_cos_sin_tab =
135*15dc779aSAndroid Build Coastguard Worker             (FLOAT32 *)ixheaac_analy_cos_sin_table_kl_8;
136*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaac_real_synth_fft_p2;
137*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->ixheaacd_cmplx_anal_fft = &ixheaac_cmplx_anal_fft_p2;
138*15dc779aSAndroid Build Coastguard Worker         break;
139*15dc779aSAndroid Build Coastguard Worker       case 8:
140*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->synth_cos_tab =
141*15dc779aSAndroid Build Coastguard Worker             (FLOAT32 *)ixheaac_synth_cos_table_kl_8;
142*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->analy_cos_sin_tab =
143*15dc779aSAndroid Build Coastguard Worker             (FLOAT32 *)ixheaac_analy_cos_sin_table_kl_16;
144*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaac_real_synth_fft_p2;
145*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->ixheaacd_cmplx_anal_fft = &ixheaac_cmplx_anal_fft_p2;
146*15dc779aSAndroid Build Coastguard Worker         break;
147*15dc779aSAndroid Build Coastguard Worker       case 12:
148*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->synth_cos_tab =
149*15dc779aSAndroid Build Coastguard Worker             (FLOAT32 *)ixheaac_synth_cos_table_kl_12;
150*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->analy_cos_sin_tab =
151*15dc779aSAndroid Build Coastguard Worker             (FLOAT32 *)ixheaac_analy_cos_sin_table_kl_24;
152*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaac_real_synth_fft_p3;
153*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->ixheaacd_cmplx_anal_fft = &ixheaac_cmplx_anal_fft_p3;
154*15dc779aSAndroid Build Coastguard Worker         break;
155*15dc779aSAndroid Build Coastguard Worker       case 16:
156*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->synth_cos_tab =
157*15dc779aSAndroid Build Coastguard Worker             (FLOAT32 *)ixheaac_synth_cos_table_kl_16;
158*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->analy_cos_sin_tab =
159*15dc779aSAndroid Build Coastguard Worker             (FLOAT32 *)ixheaac_analy_cos_sin_table_kl_32;
160*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaac_real_synth_fft_p2;
161*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->ixheaacd_cmplx_anal_fft = &ixheaac_cmplx_anal_fft_p2;
162*15dc779aSAndroid Build Coastguard Worker         break;
163*15dc779aSAndroid Build Coastguard Worker       case 20:
164*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->synth_cos_tab =
165*15dc779aSAndroid Build Coastguard Worker             (FLOAT32 *)ixheaac_synth_cos_table_kl_20;
166*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->analy_cos_sin_tab =
167*15dc779aSAndroid Build Coastguard Worker             (FLOAT32 *)ixheaac_analy_cos_sin_table_kl_40;
168*15dc779aSAndroid Build Coastguard Worker         break;
169*15dc779aSAndroid Build Coastguard Worker       default:
170*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->synth_cos_tab =
171*15dc779aSAndroid Build Coastguard Worker             (FLOAT32 *)ixheaac_synth_cos_table_kl_4;
172*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->analy_cos_sin_tab =
173*15dc779aSAndroid Build Coastguard Worker             (FLOAT32 *)ixheaac_analy_cos_sin_table_kl_8;
174*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->ixheaacd_real_synth_fft = &ixheaac_real_synth_fft_p2;
175*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->ixheaacd_cmplx_anal_fft = &ixheaac_cmplx_anal_fft_p2;
176*15dc779aSAndroid Build Coastguard Worker     }
177*15dc779aSAndroid Build Coastguard Worker 
178*15dc779aSAndroid Build Coastguard Worker     ptr_hbe_txposer->synth_wind_coeff = ixheaacd_map_prot_filter(synth_size);
179*15dc779aSAndroid Build Coastguard Worker 
180*15dc779aSAndroid Build Coastguard Worker     memset(ptr_hbe_txposer->analy_buf, 0, 640 * sizeof(FLOAT32));
181*15dc779aSAndroid Build Coastguard Worker     synth_size = 2 * ptr_hbe_txposer->synth_size;
182*15dc779aSAndroid Build Coastguard Worker     ptr_hbe_txposer->analy_wind_coeff = ixheaacd_map_prot_filter(synth_size);
183*15dc779aSAndroid Build Coastguard Worker 
184*15dc779aSAndroid Build Coastguard Worker     memset(ptr_hbe_txposer->x_over_qmf, 0, MAX_NUM_PATCHES * sizeof(WORD32));
185*15dc779aSAndroid Build Coastguard Worker     sfb = 0;
186*15dc779aSAndroid Build Coastguard Worker     if (upsamp_4_flag) {
187*15dc779aSAndroid Build Coastguard Worker       stop_patch = MAX_NUM_PATCHES;
188*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->max_stretch = MAX_STRETCH;
189*15dc779aSAndroid Build Coastguard Worker     } else {
190*15dc779aSAndroid Build Coastguard Worker       stop_patch = MAX_STRETCH;
191*15dc779aSAndroid Build Coastguard Worker     }
192*15dc779aSAndroid Build Coastguard Worker 
193*15dc779aSAndroid Build Coastguard Worker     for (patch = 1; patch <= stop_patch; patch++) {
194*15dc779aSAndroid Build Coastguard Worker       while (sfb <= p_num_sfb[LOW] &&
195*15dc779aSAndroid Build Coastguard Worker              p_freq_band_tab[LOW][sfb] <= patch * ptr_hbe_txposer->start_band)
196*15dc779aSAndroid Build Coastguard Worker         sfb++;
197*15dc779aSAndroid Build Coastguard Worker       if (sfb <= p_num_sfb[LOW]) {
198*15dc779aSAndroid Build Coastguard Worker         if ((patch * ptr_hbe_txposer->start_band -
199*15dc779aSAndroid Build Coastguard Worker              p_freq_band_tab[LOW][sfb - 1]) <= 3) {
200*15dc779aSAndroid Build Coastguard Worker           ptr_hbe_txposer->x_over_qmf[patch - 1] =
201*15dc779aSAndroid Build Coastguard Worker               p_freq_band_tab[LOW][sfb - 1];
202*15dc779aSAndroid Build Coastguard Worker         } else {
203*15dc779aSAndroid Build Coastguard Worker           WORD32 sfb = 0;
204*15dc779aSAndroid Build Coastguard Worker           while (sfb <= p_num_sfb[HIGH] &&
205*15dc779aSAndroid Build Coastguard Worker                  p_freq_band_tab[HIGH][sfb] <=
206*15dc779aSAndroid Build Coastguard Worker                      patch * ptr_hbe_txposer->start_band)
207*15dc779aSAndroid Build Coastguard Worker             sfb++;
208*15dc779aSAndroid Build Coastguard Worker           ptr_hbe_txposer->x_over_qmf[patch - 1] =
209*15dc779aSAndroid Build Coastguard Worker               p_freq_band_tab[HIGH][sfb - 1];
210*15dc779aSAndroid Build Coastguard Worker         }
211*15dc779aSAndroid Build Coastguard Worker       } else {
212*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->x_over_qmf[patch - 1] = ptr_hbe_txposer->end_band;
213*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer->max_stretch = min(patch, MAX_STRETCH);
214*15dc779aSAndroid Build Coastguard Worker         break;
215*15dc779aSAndroid Build Coastguard Worker       }
216*15dc779aSAndroid Build Coastguard Worker     }
217*15dc779aSAndroid Build Coastguard Worker     if (ptr_hbe_txposer->k_start < 0) {
218*15dc779aSAndroid Build Coastguard Worker       return -1;
219*15dc779aSAndroid Build Coastguard Worker     }
220*15dc779aSAndroid Build Coastguard Worker   }
221*15dc779aSAndroid Build Coastguard Worker   return 0;
222*15dc779aSAndroid Build Coastguard Worker }
223*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_qmf_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,ia_sbr_header_data_struct * ptr_header_data)224*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_qmf_hbe_apply(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
225*15dc779aSAndroid Build Coastguard Worker                               FLOAT32 qmf_buf_real[][64],
226*15dc779aSAndroid Build Coastguard Worker                               FLOAT32 qmf_buf_imag[][64], WORD32 num_columns,
227*15dc779aSAndroid Build Coastguard Worker                               FLOAT32 pv_qmf_buf_real[][64],
228*15dc779aSAndroid Build Coastguard Worker                               FLOAT32 pv_qmf_buf_imag[][64],
229*15dc779aSAndroid Build Coastguard Worker                               WORD32 pitch_in_bins,
230*15dc779aSAndroid Build Coastguard Worker                               ia_sbr_header_data_struct *ptr_header_data) {
231*15dc779aSAndroid Build Coastguard Worker   WORD32 i, qmf_band_idx;
232*15dc779aSAndroid Build Coastguard Worker   WORD32 qmf_voc_columns = ptr_hbe_txposer->no_bins / 2;
233*15dc779aSAndroid Build Coastguard Worker   WORD32 err_code = 0;
234*15dc779aSAndroid Build Coastguard Worker 
235*15dc779aSAndroid Build Coastguard Worker   memcpy(ptr_hbe_txposer->ptr_input_buf,
236*15dc779aSAndroid Build Coastguard Worker          ptr_hbe_txposer->ptr_input_buf +
237*15dc779aSAndroid Build Coastguard Worker              ptr_hbe_txposer->no_bins * ptr_hbe_txposer->synth_size,
238*15dc779aSAndroid Build Coastguard Worker          ptr_hbe_txposer->synth_size * sizeof(FLOAT32));
239*15dc779aSAndroid Build Coastguard Worker 
240*15dc779aSAndroid Build Coastguard Worker   if (ptr_hbe_txposer->ixheaacd_cmplx_anal_fft == NULL) {
241*15dc779aSAndroid Build Coastguard Worker     WORD32 err = ixheaacd_qmf_hbe_data_reinit(
242*15dc779aSAndroid Build Coastguard Worker         ptr_hbe_txposer,
243*15dc779aSAndroid Build Coastguard Worker         ptr_header_data->pstr_freq_band_data->freq_band_table,
244*15dc779aSAndroid Build Coastguard Worker         ptr_header_data->pstr_freq_band_data->num_sf_bands,
245*15dc779aSAndroid Build Coastguard Worker         ptr_header_data->is_usf_4);
246*15dc779aSAndroid Build Coastguard Worker     if (err)
247*15dc779aSAndroid Build Coastguard Worker       return err;
248*15dc779aSAndroid Build Coastguard Worker   }
249*15dc779aSAndroid Build Coastguard Worker 
250*15dc779aSAndroid Build Coastguard Worker   err_code = ixheaacd_real_synth_filt(ptr_hbe_txposer, num_columns,
251*15dc779aSAndroid Build Coastguard Worker                                       qmf_buf_real, qmf_buf_imag);
252*15dc779aSAndroid Build Coastguard Worker   if (err_code) return err_code;
253*15dc779aSAndroid Build Coastguard Worker 
254*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < HBE_OPER_WIN_LEN - 1; i++) {
255*15dc779aSAndroid Build Coastguard Worker     memcpy(ptr_hbe_txposer->qmf_in_buf[i],
256*15dc779aSAndroid Build Coastguard Worker            ptr_hbe_txposer->qmf_in_buf[i + qmf_voc_columns],
257*15dc779aSAndroid Build Coastguard Worker            TWICE_QMF_SYNTH_CHANNELS_NUM * sizeof(FLOAT32));
258*15dc779aSAndroid Build Coastguard Worker   }
259*15dc779aSAndroid Build Coastguard Worker 
260*15dc779aSAndroid Build Coastguard Worker   err_code = ixheaacd_complex_anal_filt(ptr_hbe_txposer);
261*15dc779aSAndroid Build Coastguard Worker   if (err_code) return err_code;
262*15dc779aSAndroid Build Coastguard Worker 
263*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < (ptr_hbe_txposer->hbe_qmf_out_len - ptr_hbe_txposer->no_bins);
264*15dc779aSAndroid Build Coastguard Worker        i++) {
265*15dc779aSAndroid Build Coastguard Worker     memcpy(ptr_hbe_txposer->qmf_out_buf[i],
266*15dc779aSAndroid Build Coastguard Worker            ptr_hbe_txposer->qmf_out_buf[i + ptr_hbe_txposer->no_bins],
267*15dc779aSAndroid Build Coastguard Worker            TWICE_QMF_SYNTH_CHANNELS_NUM * sizeof(FLOAT32));
268*15dc779aSAndroid Build Coastguard Worker   }
269*15dc779aSAndroid Build Coastguard Worker 
270*15dc779aSAndroid Build Coastguard Worker   for (; i < ptr_hbe_txposer->hbe_qmf_out_len; i++) {
271*15dc779aSAndroid Build Coastguard Worker     memset(ptr_hbe_txposer->qmf_out_buf[i], 0,
272*15dc779aSAndroid Build Coastguard Worker            TWICE_QMF_SYNTH_CHANNELS_NUM * sizeof(FLOAT32));
273*15dc779aSAndroid Build Coastguard Worker   }
274*15dc779aSAndroid Build Coastguard Worker 
275*15dc779aSAndroid Build Coastguard Worker   err_code = ixheaacd_hbe_post_anal_process(ptr_hbe_txposer, pitch_in_bins,
276*15dc779aSAndroid Build Coastguard Worker                                             ptr_hbe_txposer->upsamp_4_flag);
277*15dc779aSAndroid Build Coastguard Worker   if (err_code) return err_code;
278*15dc779aSAndroid Build Coastguard Worker 
279*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < ptr_hbe_txposer->no_bins; i++) {
280*15dc779aSAndroid Build Coastguard Worker     for (qmf_band_idx = ptr_hbe_txposer->start_band;
281*15dc779aSAndroid Build Coastguard Worker          qmf_band_idx < ptr_hbe_txposer->end_band; qmf_band_idx++) {
282*15dc779aSAndroid Build Coastguard Worker       pv_qmf_buf_real[i][qmf_band_idx] =
283*15dc779aSAndroid Build Coastguard Worker           (FLOAT32)(ptr_hbe_txposer->qmf_out_buf[i][2 * qmf_band_idx] *
284*15dc779aSAndroid Build Coastguard Worker                         ixheaac_phase_vocoder_cos_table[qmf_band_idx] -
285*15dc779aSAndroid Build Coastguard Worker                     ptr_hbe_txposer->qmf_out_buf[i][2 * qmf_band_idx + 1] *
286*15dc779aSAndroid Build Coastguard Worker                         ixheaac_phase_vocoder_sin_table[qmf_band_idx]);
287*15dc779aSAndroid Build Coastguard Worker 
288*15dc779aSAndroid Build Coastguard Worker       pv_qmf_buf_imag[i][qmf_band_idx] =
289*15dc779aSAndroid Build Coastguard Worker           (FLOAT32)(ptr_hbe_txposer->qmf_out_buf[i][2 * qmf_band_idx] *
290*15dc779aSAndroid Build Coastguard Worker                         ixheaac_phase_vocoder_sin_table[qmf_band_idx] +
291*15dc779aSAndroid Build Coastguard Worker                     ptr_hbe_txposer->qmf_out_buf[i][2 * qmf_band_idx + 1] *
292*15dc779aSAndroid Build Coastguard Worker                         ixheaac_phase_vocoder_cos_table[qmf_band_idx]);
293*15dc779aSAndroid Build Coastguard Worker     }
294*15dc779aSAndroid Build Coastguard Worker   }
295*15dc779aSAndroid Build Coastguard Worker   return 0;
296*15dc779aSAndroid Build Coastguard Worker }
297*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_norm_qmf_in_buf_4(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,WORD32 qmf_band_idx)298*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_norm_qmf_in_buf_4(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
299*15dc779aSAndroid Build Coastguard Worker                                 WORD32 qmf_band_idx) {
300*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
301*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *in_buf = &ptr_hbe_txposer->qmf_in_buf[0][2 * qmf_band_idx];
302*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *norm_buf = &ptr_hbe_txposer->norm_qmf_in_buf[0][2 * qmf_band_idx];
303*15dc779aSAndroid Build Coastguard Worker 
304*15dc779aSAndroid Build Coastguard Worker   for (; qmf_band_idx <= ptr_hbe_txposer->x_over_qmf[3]; qmf_band_idx++) {
305*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < ptr_hbe_txposer->hbe_qmf_in_len; i++) {
306*15dc779aSAndroid Build Coastguard Worker       FLOAT32 mag_scaling_fac = 0.0f;
307*15dc779aSAndroid Build Coastguard Worker       FLOAT32 x_r, x_i, temp;
308*15dc779aSAndroid Build Coastguard Worker       FLOAT64 base = 1e-17;
309*15dc779aSAndroid Build Coastguard Worker       x_r = in_buf[0];
310*15dc779aSAndroid Build Coastguard Worker       x_i = in_buf[1];
311*15dc779aSAndroid Build Coastguard Worker 
312*15dc779aSAndroid Build Coastguard Worker       temp = x_r * x_r;
313*15dc779aSAndroid Build Coastguard Worker       base = base + temp;
314*15dc779aSAndroid Build Coastguard Worker       temp = x_i * x_i;
315*15dc779aSAndroid Build Coastguard Worker       base = base + temp;
316*15dc779aSAndroid Build Coastguard Worker 
317*15dc779aSAndroid Build Coastguard Worker       temp = (FLOAT32)sqrt(sqrt(base));
318*15dc779aSAndroid Build Coastguard Worker       mag_scaling_fac = temp * (FLOAT32)(sqrt(temp));
319*15dc779aSAndroid Build Coastguard Worker 
320*15dc779aSAndroid Build Coastguard Worker       mag_scaling_fac = 1 / mag_scaling_fac;
321*15dc779aSAndroid Build Coastguard Worker 
322*15dc779aSAndroid Build Coastguard Worker       x_r *= mag_scaling_fac;
323*15dc779aSAndroid Build Coastguard Worker       x_i *= mag_scaling_fac;
324*15dc779aSAndroid Build Coastguard Worker 
325*15dc779aSAndroid Build Coastguard Worker       norm_buf[0] = x_r;
326*15dc779aSAndroid Build Coastguard Worker       norm_buf[1] = x_i;
327*15dc779aSAndroid Build Coastguard Worker 
328*15dc779aSAndroid Build Coastguard Worker       in_buf += 128;
329*15dc779aSAndroid Build Coastguard Worker       norm_buf += 128;
330*15dc779aSAndroid Build Coastguard Worker     }
331*15dc779aSAndroid Build Coastguard Worker 
332*15dc779aSAndroid Build Coastguard Worker     in_buf -= (128 * (ptr_hbe_txposer->hbe_qmf_in_len) - 2);
333*15dc779aSAndroid Build Coastguard Worker     norm_buf -= (128 * (ptr_hbe_txposer->hbe_qmf_in_len) - 2);
334*15dc779aSAndroid Build Coastguard Worker   }
335*15dc779aSAndroid Build Coastguard Worker }
336*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_norm_qmf_in_buf_2(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,WORD32 qmf_band_idx)337*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_norm_qmf_in_buf_2(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
338*15dc779aSAndroid Build Coastguard Worker                                 WORD32 qmf_band_idx) {
339*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
340*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *in_buf = &ptr_hbe_txposer->qmf_in_buf[0][2 * qmf_band_idx];
341*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *norm_buf = &ptr_hbe_txposer->norm_qmf_in_buf[0][2 * qmf_band_idx];
342*15dc779aSAndroid Build Coastguard Worker 
343*15dc779aSAndroid Build Coastguard Worker   for (; qmf_band_idx <= ptr_hbe_txposer->x_over_qmf[1]; qmf_band_idx++) {
344*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < ptr_hbe_txposer->hbe_qmf_in_len; i++) {
345*15dc779aSAndroid Build Coastguard Worker       FLOAT32 mag_scaling_fac = 0.0f;
346*15dc779aSAndroid Build Coastguard Worker       FLOAT32 x_r, x_i, temp;
347*15dc779aSAndroid Build Coastguard Worker       FLOAT64 base = 1e-17;
348*15dc779aSAndroid Build Coastguard Worker       x_r = in_buf[0];
349*15dc779aSAndroid Build Coastguard Worker       x_i = in_buf[1];
350*15dc779aSAndroid Build Coastguard Worker 
351*15dc779aSAndroid Build Coastguard Worker       temp = x_r * x_r;
352*15dc779aSAndroid Build Coastguard Worker       base = base + temp;
353*15dc779aSAndroid Build Coastguard Worker       temp = x_i * x_i;
354*15dc779aSAndroid Build Coastguard Worker       base = base + x_i * x_i;
355*15dc779aSAndroid Build Coastguard Worker 
356*15dc779aSAndroid Build Coastguard Worker       mag_scaling_fac = (FLOAT32)(1.0f / base);
357*15dc779aSAndroid Build Coastguard Worker       mag_scaling_fac = (FLOAT32)sqrt(sqrt(mag_scaling_fac));
358*15dc779aSAndroid Build Coastguard Worker 
359*15dc779aSAndroid Build Coastguard Worker       x_r *= mag_scaling_fac;
360*15dc779aSAndroid Build Coastguard Worker       x_i *= mag_scaling_fac;
361*15dc779aSAndroid Build Coastguard Worker 
362*15dc779aSAndroid Build Coastguard Worker       norm_buf[0] = x_r;
363*15dc779aSAndroid Build Coastguard Worker       norm_buf[1] = x_i;
364*15dc779aSAndroid Build Coastguard Worker 
365*15dc779aSAndroid Build Coastguard Worker       in_buf += 128;
366*15dc779aSAndroid Build Coastguard Worker       norm_buf += 128;
367*15dc779aSAndroid Build Coastguard Worker     }
368*15dc779aSAndroid Build Coastguard Worker 
369*15dc779aSAndroid Build Coastguard Worker     in_buf -= (128 * (ptr_hbe_txposer->hbe_qmf_in_len) - 2);
370*15dc779aSAndroid Build Coastguard Worker     norm_buf -= (128 * (ptr_hbe_txposer->hbe_qmf_in_len) - 2);
371*15dc779aSAndroid Build Coastguard Worker   }
372*15dc779aSAndroid Build Coastguard Worker }
373*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_hbe_xprod_proc_3(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,WORD32 qmf_band_idx,WORD32 qmf_col_idx,FLOAT32 p,WORD32 pitch_in_bins_idx)374*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_xprod_proc_3(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
375*15dc779aSAndroid Build Coastguard Worker                                WORD32 qmf_band_idx, WORD32 qmf_col_idx,
376*15dc779aSAndroid Build Coastguard Worker                                FLOAT32 p, WORD32 pitch_in_bins_idx) {
377*15dc779aSAndroid Build Coastguard Worker   WORD32 tr, n1, n2, max_trans_fac, max_n1, max_n2;
378*15dc779aSAndroid Build Coastguard Worker   WORD32 k, addrshift;
379*15dc779aSAndroid Build Coastguard Worker   WORD32 inp_band_idx = 2 * qmf_band_idx / 3;
380*15dc779aSAndroid Build Coastguard Worker 
381*15dc779aSAndroid Build Coastguard Worker   FLOAT64 temp_fac;
382*15dc779aSAndroid Build Coastguard Worker   FLOAT32 max_mag_value;
383*15dc779aSAndroid Build Coastguard Worker   FLOAT32 mag_zero_band, mag_n1_band, mag_n2_band, temp;
384*15dc779aSAndroid Build Coastguard Worker   FLOAT32 temp_r, temp_i;
385*15dc779aSAndroid Build Coastguard Worker   FLOAT32 mag_cmplx_gain = 1.8856f;
386*15dc779aSAndroid Build Coastguard Worker 
387*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *qmf_in_buf_ri =
388*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + HBE_ZERO_BAND_IDX];
389*15dc779aSAndroid Build Coastguard Worker 
390*15dc779aSAndroid Build Coastguard Worker   mag_zero_band =
391*15dc779aSAndroid Build Coastguard Worker       qmf_in_buf_ri[2 * inp_band_idx] * qmf_in_buf_ri[2 * inp_band_idx] +
392*15dc779aSAndroid Build Coastguard Worker       qmf_in_buf_ri[2 * inp_band_idx + 1] * qmf_in_buf_ri[2 * inp_band_idx + 1];
393*15dc779aSAndroid Build Coastguard Worker   max_mag_value = 0;
394*15dc779aSAndroid Build Coastguard Worker   max_n1 = max_n2 = max_trans_fac = 0;
395*15dc779aSAndroid Build Coastguard Worker 
396*15dc779aSAndroid Build Coastguard Worker   for (tr = 1; tr < 3; tr++) {
397*15dc779aSAndroid Build Coastguard Worker     temp_fac = (2.0f * qmf_band_idx + 1 - tr * p) * 0.3333334;
398*15dc779aSAndroid Build Coastguard Worker 
399*15dc779aSAndroid Build Coastguard Worker     n1 = (WORD32)(temp_fac);
400*15dc779aSAndroid Build Coastguard Worker     n2 = (WORD32)(temp_fac + p);
401*15dc779aSAndroid Build Coastguard Worker 
402*15dc779aSAndroid Build Coastguard Worker     mag_n1_band = qmf_in_buf_ri[2 * n1] * qmf_in_buf_ri[2 * n1] +
403*15dc779aSAndroid Build Coastguard Worker                   qmf_in_buf_ri[2 * n1 + 1] * qmf_in_buf_ri[2 * n1 + 1];
404*15dc779aSAndroid Build Coastguard Worker     mag_n2_band = qmf_in_buf_ri[2 * n2] * qmf_in_buf_ri[2 * n2] +
405*15dc779aSAndroid Build Coastguard Worker                   qmf_in_buf_ri[2 * n2 + 1] * qmf_in_buf_ri[2 * n2 + 1];
406*15dc779aSAndroid Build Coastguard Worker     temp = min(mag_n1_band, mag_n2_band);
407*15dc779aSAndroid Build Coastguard Worker 
408*15dc779aSAndroid Build Coastguard Worker     if (temp > max_mag_value) {
409*15dc779aSAndroid Build Coastguard Worker       max_mag_value = temp;
410*15dc779aSAndroid Build Coastguard Worker       max_trans_fac = tr;
411*15dc779aSAndroid Build Coastguard Worker       max_n1 = n1;
412*15dc779aSAndroid Build Coastguard Worker       max_n2 = n2;
413*15dc779aSAndroid Build Coastguard Worker     }
414*15dc779aSAndroid Build Coastguard Worker   }
415*15dc779aSAndroid Build Coastguard Worker 
416*15dc779aSAndroid Build Coastguard Worker   if (max_mag_value > mag_zero_band && max_n1 >= 0 &&
417*15dc779aSAndroid Build Coastguard Worker       max_n2 < NO_QMF_SYNTH_CHANNELS) {
418*15dc779aSAndroid Build Coastguard Worker     FLOAT32 vec_y_r[2], vec_y_i[2], vec_o_r[2], vec_o_i[2];
419*15dc779aSAndroid Build Coastguard Worker     FLOAT32 coeff_real[2], coeff_imag[2];
420*15dc779aSAndroid Build Coastguard Worker     FLOAT32 d1, d2;
421*15dc779aSAndroid Build Coastguard Worker     WORD32 mid_trans_fac, idx;
422*15dc779aSAndroid Build Coastguard Worker     FLOAT64 base = 1e-17;
423*15dc779aSAndroid Build Coastguard Worker     FLOAT32 mag_scaling_fac = 0;
424*15dc779aSAndroid Build Coastguard Worker     FLOAT32 x_zero_band_r;
425*15dc779aSAndroid Build Coastguard Worker     FLOAT32 x_zero_band_i;
426*15dc779aSAndroid Build Coastguard Worker 
427*15dc779aSAndroid Build Coastguard Worker     x_zero_band_r = 0;
428*15dc779aSAndroid Build Coastguard Worker     x_zero_band_i = 0;
429*15dc779aSAndroid Build Coastguard Worker     mid_trans_fac = 3 - max_trans_fac;
430*15dc779aSAndroid Build Coastguard Worker     if (max_trans_fac == 1) {
431*15dc779aSAndroid Build Coastguard Worker       WORD32 idx;
432*15dc779aSAndroid Build Coastguard Worker       d1 = 0;
433*15dc779aSAndroid Build Coastguard Worker       d2 = 1.5;
434*15dc779aSAndroid Build Coastguard Worker       x_zero_band_r = qmf_in_buf_ri[2 * max_n1];
435*15dc779aSAndroid Build Coastguard Worker       x_zero_band_i = qmf_in_buf_ri[2 * max_n1 + 1];
436*15dc779aSAndroid Build Coastguard Worker 
437*15dc779aSAndroid Build Coastguard Worker       idx = max_n2 & 3;
438*15dc779aSAndroid Build Coastguard Worker       idx = (idx + 1) & 3;
439*15dc779aSAndroid Build Coastguard Worker       coeff_real[0] = ixheaac_hbe_post_anal_proc_interp_coeff[idx][0];
440*15dc779aSAndroid Build Coastguard Worker       coeff_imag[0] = ixheaac_hbe_post_anal_proc_interp_coeff[idx][1];
441*15dc779aSAndroid Build Coastguard Worker 
442*15dc779aSAndroid Build Coastguard Worker       coeff_real[1] = coeff_real[0];
443*15dc779aSAndroid Build Coastguard Worker       coeff_imag[1] = -coeff_imag[0];
444*15dc779aSAndroid Build Coastguard Worker 
445*15dc779aSAndroid Build Coastguard Worker       vec_y_r[1] = qmf_in_buf_ri[2 * max_n2];
446*15dc779aSAndroid Build Coastguard Worker       vec_y_i[1] = qmf_in_buf_ri[2 * max_n2 + 1];
447*15dc779aSAndroid Build Coastguard Worker 
448*15dc779aSAndroid Build Coastguard Worker       addrshift = -2;
449*15dc779aSAndroid Build Coastguard Worker       temp_r = ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + addrshift +
450*15dc779aSAndroid Build Coastguard Worker                                            HBE_ZERO_BAND_IDX][2 * max_n2];
451*15dc779aSAndroid Build Coastguard Worker       temp_i = ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + addrshift +
452*15dc779aSAndroid Build Coastguard Worker                                            HBE_ZERO_BAND_IDX][2 * max_n2 + 1];
453*15dc779aSAndroid Build Coastguard Worker 
454*15dc779aSAndroid Build Coastguard Worker       vec_y_r[0] = coeff_real[1] * temp_r - coeff_imag[1] * temp_i;
455*15dc779aSAndroid Build Coastguard Worker       vec_y_i[0] = coeff_imag[1] * temp_r + coeff_real[1] * temp_i;
456*15dc779aSAndroid Build Coastguard Worker 
457*15dc779aSAndroid Build Coastguard Worker       temp_r = ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + addrshift + 1 +
458*15dc779aSAndroid Build Coastguard Worker                                            HBE_ZERO_BAND_IDX][2 * max_n2];
459*15dc779aSAndroid Build Coastguard Worker       temp_i = ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + addrshift + 1 +
460*15dc779aSAndroid Build Coastguard Worker                                            HBE_ZERO_BAND_IDX][2 * max_n2 + 1];
461*15dc779aSAndroid Build Coastguard Worker 
462*15dc779aSAndroid Build Coastguard Worker       vec_y_r[0] += coeff_real[0] * temp_r - coeff_imag[0] * temp_i;
463*15dc779aSAndroid Build Coastguard Worker       vec_y_i[0] += coeff_imag[0] * temp_r + coeff_real[0] * temp_i;
464*15dc779aSAndroid Build Coastguard Worker 
465*15dc779aSAndroid Build Coastguard Worker     } else {
466*15dc779aSAndroid Build Coastguard Worker       WORD32 idx;
467*15dc779aSAndroid Build Coastguard Worker       d1 = 1.5;
468*15dc779aSAndroid Build Coastguard Worker       d2 = 0;
469*15dc779aSAndroid Build Coastguard Worker       mid_trans_fac = max_trans_fac;
470*15dc779aSAndroid Build Coastguard Worker       max_trans_fac = 3 - max_trans_fac;
471*15dc779aSAndroid Build Coastguard Worker 
472*15dc779aSAndroid Build Coastguard Worker       x_zero_band_r = qmf_in_buf_ri[2 * max_n2];
473*15dc779aSAndroid Build Coastguard Worker       x_zero_band_i = qmf_in_buf_ri[2 * max_n2 + 1];
474*15dc779aSAndroid Build Coastguard Worker 
475*15dc779aSAndroid Build Coastguard Worker       idx = (max_n1 & 3);
476*15dc779aSAndroid Build Coastguard Worker       idx = (idx + 1) & 3;
477*15dc779aSAndroid Build Coastguard Worker       coeff_real[0] = ixheaac_hbe_post_anal_proc_interp_coeff[idx][0];
478*15dc779aSAndroid Build Coastguard Worker       coeff_imag[0] = ixheaac_hbe_post_anal_proc_interp_coeff[idx][1];
479*15dc779aSAndroid Build Coastguard Worker 
480*15dc779aSAndroid Build Coastguard Worker       coeff_real[1] = coeff_real[0];
481*15dc779aSAndroid Build Coastguard Worker       coeff_imag[1] = -coeff_imag[0];
482*15dc779aSAndroid Build Coastguard Worker 
483*15dc779aSAndroid Build Coastguard Worker       vec_y_r[1] = qmf_in_buf_ri[2 * max_n1];
484*15dc779aSAndroid Build Coastguard Worker       vec_y_i[1] = qmf_in_buf_ri[2 * max_n1 + 1];
485*15dc779aSAndroid Build Coastguard Worker 
486*15dc779aSAndroid Build Coastguard Worker       addrshift = -2;
487*15dc779aSAndroid Build Coastguard Worker 
488*15dc779aSAndroid Build Coastguard Worker       temp_r = ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + addrshift +
489*15dc779aSAndroid Build Coastguard Worker                                            HBE_ZERO_BAND_IDX][2 * max_n1];
490*15dc779aSAndroid Build Coastguard Worker       temp_i = ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + addrshift +
491*15dc779aSAndroid Build Coastguard Worker                                            HBE_ZERO_BAND_IDX][2 * max_n1 + 1];
492*15dc779aSAndroid Build Coastguard Worker 
493*15dc779aSAndroid Build Coastguard Worker       vec_y_r[0] = coeff_real[1] * temp_r - coeff_imag[1] * temp_i;
494*15dc779aSAndroid Build Coastguard Worker       vec_y_i[0] = coeff_imag[1] * temp_r + coeff_real[1] * temp_i;
495*15dc779aSAndroid Build Coastguard Worker 
496*15dc779aSAndroid Build Coastguard Worker       temp_r = ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + addrshift + 1 +
497*15dc779aSAndroid Build Coastguard Worker                                            HBE_ZERO_BAND_IDX][2 * max_n1];
498*15dc779aSAndroid Build Coastguard Worker       temp_i = ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + addrshift + 1 +
499*15dc779aSAndroid Build Coastguard Worker                                            HBE_ZERO_BAND_IDX][2 * max_n1 + 1];
500*15dc779aSAndroid Build Coastguard Worker 
501*15dc779aSAndroid Build Coastguard Worker       vec_y_r[0] += coeff_real[0] * temp_r - coeff_imag[0] * temp_i;
502*15dc779aSAndroid Build Coastguard Worker       vec_y_i[0] += coeff_imag[0] * temp_r + coeff_real[0] * temp_i;
503*15dc779aSAndroid Build Coastguard Worker     }
504*15dc779aSAndroid Build Coastguard Worker 
505*15dc779aSAndroid Build Coastguard Worker     base = 1e-17;
506*15dc779aSAndroid Build Coastguard Worker     base = base + x_zero_band_r * x_zero_band_r;
507*15dc779aSAndroid Build Coastguard Worker     base = base + x_zero_band_i * x_zero_band_i;
508*15dc779aSAndroid Build Coastguard Worker     mag_scaling_fac = (FLOAT32)(ixheaac_cbrt_calc((FLOAT32)base));
509*15dc779aSAndroid Build Coastguard Worker     x_zero_band_r *= mag_scaling_fac;
510*15dc779aSAndroid Build Coastguard Worker     x_zero_band_i *= mag_scaling_fac;
511*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < 2; k++) {
512*15dc779aSAndroid Build Coastguard Worker       base = 1e-17;
513*15dc779aSAndroid Build Coastguard Worker       base = base + vec_y_r[k] * vec_y_r[k];
514*15dc779aSAndroid Build Coastguard Worker       base = base + vec_y_i[k] * vec_y_i[k];
515*15dc779aSAndroid Build Coastguard Worker       mag_scaling_fac = (FLOAT32)(ixheaac_cbrt_calc((FLOAT32)base));
516*15dc779aSAndroid Build Coastguard Worker       vec_y_r[k] *= mag_scaling_fac;
517*15dc779aSAndroid Build Coastguard Worker       vec_y_i[k] *= mag_scaling_fac;
518*15dc779aSAndroid Build Coastguard Worker     }
519*15dc779aSAndroid Build Coastguard Worker 
520*15dc779aSAndroid Build Coastguard Worker     temp_r = x_zero_band_r;
521*15dc779aSAndroid Build Coastguard Worker     temp_i = x_zero_band_i;
522*15dc779aSAndroid Build Coastguard Worker     for (idx = 0; idx < mid_trans_fac - 1; idx++) {
523*15dc779aSAndroid Build Coastguard Worker       FLOAT32 tmp = x_zero_band_r;
524*15dc779aSAndroid Build Coastguard Worker       x_zero_band_r = x_zero_band_r * temp_r - x_zero_band_i * temp_i;
525*15dc779aSAndroid Build Coastguard Worker       x_zero_band_i = tmp * temp_i + x_zero_band_i * temp_r;
526*15dc779aSAndroid Build Coastguard Worker     }
527*15dc779aSAndroid Build Coastguard Worker 
528*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < 2; k++) {
529*15dc779aSAndroid Build Coastguard Worker       temp_r = vec_y_r[k];
530*15dc779aSAndroid Build Coastguard Worker       temp_i = vec_y_i[k];
531*15dc779aSAndroid Build Coastguard Worker       for (idx = 0; idx < max_trans_fac - 1; idx++) {
532*15dc779aSAndroid Build Coastguard Worker         FLOAT32 tmp = vec_y_r[k];
533*15dc779aSAndroid Build Coastguard Worker         vec_y_r[k] = vec_y_r[k] * temp_r - vec_y_i[k] * temp_i;
534*15dc779aSAndroid Build Coastguard Worker         vec_y_i[k] = tmp * temp_i + vec_y_i[k] * temp_r;
535*15dc779aSAndroid Build Coastguard Worker       }
536*15dc779aSAndroid Build Coastguard Worker     }
537*15dc779aSAndroid Build Coastguard Worker 
538*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < 2; k++) {
539*15dc779aSAndroid Build Coastguard Worker       vec_o_r[k] = vec_y_r[k] * x_zero_band_r - vec_y_i[k] * x_zero_band_i;
540*15dc779aSAndroid Build Coastguard Worker       vec_o_i[k] = vec_y_r[k] * x_zero_band_i + vec_y_i[k] * x_zero_band_r;
541*15dc779aSAndroid Build Coastguard Worker     }
542*15dc779aSAndroid Build Coastguard Worker 
543*15dc779aSAndroid Build Coastguard Worker     {
544*15dc779aSAndroid Build Coastguard Worker       FLOAT32 cos_theta =
545*15dc779aSAndroid Build Coastguard Worker           ixheaac_hbe_x_prod_cos_table_trans_3[(pitch_in_bins_idx << 1) + 0];
546*15dc779aSAndroid Build Coastguard Worker       FLOAT32 sin_theta =
547*15dc779aSAndroid Build Coastguard Worker           ixheaac_hbe_x_prod_cos_table_trans_3[(pitch_in_bins_idx << 1) + 1];
548*15dc779aSAndroid Build Coastguard Worker       if (d2 < d1) {
549*15dc779aSAndroid Build Coastguard Worker         sin_theta = -sin_theta;
550*15dc779aSAndroid Build Coastguard Worker       }
551*15dc779aSAndroid Build Coastguard Worker       temp_r = vec_o_r[0];
552*15dc779aSAndroid Build Coastguard Worker       temp_i = vec_o_i[0];
553*15dc779aSAndroid Build Coastguard Worker       vec_o_r[0] = (FLOAT32)(cos_theta * temp_r - sin_theta * temp_i);
554*15dc779aSAndroid Build Coastguard Worker       vec_o_i[0] = (FLOAT32)(cos_theta * temp_i + sin_theta * temp_r);
555*15dc779aSAndroid Build Coastguard Worker     }
556*15dc779aSAndroid Build Coastguard Worker 
557*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < 2; k++) {
558*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->qmf_out_buf[qmf_col_idx * 2 + (k + HBE_ZERO_BAND_IDX -
559*15dc779aSAndroid Build Coastguard Worker                                                       1)][2 * qmf_band_idx] +=
560*15dc779aSAndroid Build Coastguard Worker           (FLOAT32)(mag_cmplx_gain * vec_o_r[k]);
561*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer
562*15dc779aSAndroid Build Coastguard Worker           ->qmf_out_buf[qmf_col_idx * 2 + (k + HBE_ZERO_BAND_IDX - 1)]
563*15dc779aSAndroid Build Coastguard Worker                        [2 * qmf_band_idx + 1] +=
564*15dc779aSAndroid Build Coastguard Worker           (FLOAT32)(mag_cmplx_gain * vec_o_i[k]);
565*15dc779aSAndroid Build Coastguard Worker     }
566*15dc779aSAndroid Build Coastguard Worker   }
567*15dc779aSAndroid Build Coastguard Worker }
568*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_hbe_xprod_proc_4(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,WORD32 qmf_band_idx,WORD32 qmf_col_idx,FLOAT32 p,WORD32 pitch_in_bins_idx)569*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_xprod_proc_4(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
570*15dc779aSAndroid Build Coastguard Worker                                WORD32 qmf_band_idx, WORD32 qmf_col_idx,
571*15dc779aSAndroid Build Coastguard Worker                                FLOAT32 p, WORD32 pitch_in_bins_idx) {
572*15dc779aSAndroid Build Coastguard Worker   WORD32 k;
573*15dc779aSAndroid Build Coastguard Worker   WORD32 inp_band_idx = qmf_band_idx >> 1;
574*15dc779aSAndroid Build Coastguard Worker   WORD32 tr, n1, n2, max_trans_fac, max_n1, max_n2;
575*15dc779aSAndroid Build Coastguard Worker 
576*15dc779aSAndroid Build Coastguard Worker   FLOAT64 temp_fac;
577*15dc779aSAndroid Build Coastguard Worker   FLOAT32 max_mag_value, mag_zero_band, mag_n1_band, mag_n2_band, temp;
578*15dc779aSAndroid Build Coastguard Worker   FLOAT32 temp_r, temp_i;
579*15dc779aSAndroid Build Coastguard Worker   FLOAT32 mag_cmplx_gain = 2.0f;
580*15dc779aSAndroid Build Coastguard Worker 
581*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *qmf_in_buf_ri =
582*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + HBE_ZERO_BAND_IDX];
583*15dc779aSAndroid Build Coastguard Worker 
584*15dc779aSAndroid Build Coastguard Worker   mag_zero_band =
585*15dc779aSAndroid Build Coastguard Worker       qmf_in_buf_ri[2 * inp_band_idx] * qmf_in_buf_ri[2 * inp_band_idx] +
586*15dc779aSAndroid Build Coastguard Worker       qmf_in_buf_ri[2 * inp_band_idx + 1] * qmf_in_buf_ri[2 * inp_band_idx + 1];
587*15dc779aSAndroid Build Coastguard Worker 
588*15dc779aSAndroid Build Coastguard Worker   max_mag_value = 0;
589*15dc779aSAndroid Build Coastguard Worker   max_n1 = max_n2 = max_trans_fac = 0;
590*15dc779aSAndroid Build Coastguard Worker 
591*15dc779aSAndroid Build Coastguard Worker   for (tr = 1; tr < 4; tr++) {
592*15dc779aSAndroid Build Coastguard Worker     temp_fac = (2.0 * qmf_band_idx + 1 - tr * p) * 0.25;
593*15dc779aSAndroid Build Coastguard Worker     n1 = ((WORD32)(temp_fac)) << 1;
594*15dc779aSAndroid Build Coastguard Worker     n2 = ((WORD32)(temp_fac + p)) << 1;
595*15dc779aSAndroid Build Coastguard Worker 
596*15dc779aSAndroid Build Coastguard Worker     mag_n1_band = qmf_in_buf_ri[n1] * qmf_in_buf_ri[n1] +
597*15dc779aSAndroid Build Coastguard Worker                   qmf_in_buf_ri[n1 + 1] * qmf_in_buf_ri[n1 + 1];
598*15dc779aSAndroid Build Coastguard Worker     mag_n2_band = qmf_in_buf_ri[n2] * qmf_in_buf_ri[n2] +
599*15dc779aSAndroid Build Coastguard Worker                   qmf_in_buf_ri[n2 + 1] * qmf_in_buf_ri[n2 + 1];
600*15dc779aSAndroid Build Coastguard Worker 
601*15dc779aSAndroid Build Coastguard Worker     temp = min(mag_n1_band, mag_n2_band);
602*15dc779aSAndroid Build Coastguard Worker 
603*15dc779aSAndroid Build Coastguard Worker     if (temp > max_mag_value) {
604*15dc779aSAndroid Build Coastguard Worker       max_mag_value = temp;
605*15dc779aSAndroid Build Coastguard Worker       max_trans_fac = tr;
606*15dc779aSAndroid Build Coastguard Worker       max_n1 = n1;
607*15dc779aSAndroid Build Coastguard Worker       max_n2 = n2;
608*15dc779aSAndroid Build Coastguard Worker     }
609*15dc779aSAndroid Build Coastguard Worker   }
610*15dc779aSAndroid Build Coastguard Worker   if (max_mag_value > mag_zero_band && max_n1 >= 0 &&
611*15dc779aSAndroid Build Coastguard Worker       max_n2 < TWICE_QMF_SYNTH_CHANNELS_NUM) {
612*15dc779aSAndroid Build Coastguard Worker     FLOAT32 vec_y_r[2], vec_y_i[2], vec_o_r[2], vec_o_i[2];
613*15dc779aSAndroid Build Coastguard Worker     FLOAT32 d1, d2;
614*15dc779aSAndroid Build Coastguard Worker     WORD32 mid_trans_fac, idx;
615*15dc779aSAndroid Build Coastguard Worker     FLOAT32 x_zero_band_r;
616*15dc779aSAndroid Build Coastguard Worker     FLOAT32 x_zero_band_i;
617*15dc779aSAndroid Build Coastguard Worker     FLOAT64 base = 1e-17;
618*15dc779aSAndroid Build Coastguard Worker     FLOAT32 mag_scaling_fac = 0.0f;
619*15dc779aSAndroid Build Coastguard Worker 
620*15dc779aSAndroid Build Coastguard Worker     x_zero_band_r = 0;
621*15dc779aSAndroid Build Coastguard Worker     x_zero_band_i = 0;
622*15dc779aSAndroid Build Coastguard Worker     mid_trans_fac = 4 - max_trans_fac;
623*15dc779aSAndroid Build Coastguard Worker 
624*15dc779aSAndroid Build Coastguard Worker     if (max_trans_fac == 1) {
625*15dc779aSAndroid Build Coastguard Worker       d1 = 0;
626*15dc779aSAndroid Build Coastguard Worker       d2 = 2;
627*15dc779aSAndroid Build Coastguard Worker       x_zero_band_r = qmf_in_buf_ri[max_n1];
628*15dc779aSAndroid Build Coastguard Worker       x_zero_band_i = qmf_in_buf_ri[max_n1 + 1];
629*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < 2; k++) {
630*15dc779aSAndroid Build Coastguard Worker         vec_y_r[k] =
631*15dc779aSAndroid Build Coastguard Worker             ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + HBE_ZERO_BAND_IDX +
632*15dc779aSAndroid Build Coastguard Worker                                         2 * (k - 1)][max_n2];
633*15dc779aSAndroid Build Coastguard Worker         vec_y_i[k] =
634*15dc779aSAndroid Build Coastguard Worker             ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + HBE_ZERO_BAND_IDX +
635*15dc779aSAndroid Build Coastguard Worker                                         2 * (k - 1)][max_n2 + 1];
636*15dc779aSAndroid Build Coastguard Worker       }
637*15dc779aSAndroid Build Coastguard Worker     } else if (max_trans_fac == 2) {
638*15dc779aSAndroid Build Coastguard Worker       d1 = 0;
639*15dc779aSAndroid Build Coastguard Worker       d2 = 1;
640*15dc779aSAndroid Build Coastguard Worker       x_zero_band_r = qmf_in_buf_ri[max_n1];
641*15dc779aSAndroid Build Coastguard Worker       x_zero_band_i = qmf_in_buf_ri[max_n1 + 1];
642*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < 2; k++) {
643*15dc779aSAndroid Build Coastguard Worker         vec_y_r[k] =
644*15dc779aSAndroid Build Coastguard Worker             ptr_hbe_txposer
645*15dc779aSAndroid Build Coastguard Worker                 ->qmf_in_buf[qmf_col_idx + HBE_ZERO_BAND_IDX + (k - 1)][max_n2];
646*15dc779aSAndroid Build Coastguard Worker         vec_y_i[k] =
647*15dc779aSAndroid Build Coastguard Worker             ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + HBE_ZERO_BAND_IDX +
648*15dc779aSAndroid Build Coastguard Worker                                         (k - 1)][max_n2 + 1];
649*15dc779aSAndroid Build Coastguard Worker       }
650*15dc779aSAndroid Build Coastguard Worker     } else {
651*15dc779aSAndroid Build Coastguard Worker       d1 = 2;
652*15dc779aSAndroid Build Coastguard Worker       d2 = 0;
653*15dc779aSAndroid Build Coastguard Worker       mid_trans_fac = max_trans_fac;
654*15dc779aSAndroid Build Coastguard Worker       max_trans_fac = 4 - max_trans_fac;
655*15dc779aSAndroid Build Coastguard Worker       x_zero_band_r = qmf_in_buf_ri[max_n2];
656*15dc779aSAndroid Build Coastguard Worker       x_zero_band_i = qmf_in_buf_ri[max_n2 + 1];
657*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < 2; k++) {
658*15dc779aSAndroid Build Coastguard Worker         vec_y_r[k] =
659*15dc779aSAndroid Build Coastguard Worker             ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + HBE_ZERO_BAND_IDX +
660*15dc779aSAndroid Build Coastguard Worker                                         2 * (k - 1)][max_n1];
661*15dc779aSAndroid Build Coastguard Worker         vec_y_i[k] =
662*15dc779aSAndroid Build Coastguard Worker             ptr_hbe_txposer->qmf_in_buf[qmf_col_idx + HBE_ZERO_BAND_IDX +
663*15dc779aSAndroid Build Coastguard Worker                                         2 * (k - 1)][max_n1 + 1];
664*15dc779aSAndroid Build Coastguard Worker       }
665*15dc779aSAndroid Build Coastguard Worker     }
666*15dc779aSAndroid Build Coastguard Worker 
667*15dc779aSAndroid Build Coastguard Worker     base = 1e-17;
668*15dc779aSAndroid Build Coastguard Worker     base = base + x_zero_band_r * x_zero_band_r;
669*15dc779aSAndroid Build Coastguard Worker     base = base + x_zero_band_i * x_zero_band_i;
670*15dc779aSAndroid Build Coastguard Worker     {
671*15dc779aSAndroid Build Coastguard Worker       temp = (FLOAT32)sqrt(sqrt(base));
672*15dc779aSAndroid Build Coastguard Worker       mag_scaling_fac = temp * (FLOAT32)(sqrt(temp));
673*15dc779aSAndroid Build Coastguard Worker       mag_scaling_fac = 1 / mag_scaling_fac;
674*15dc779aSAndroid Build Coastguard Worker     }
675*15dc779aSAndroid Build Coastguard Worker 
676*15dc779aSAndroid Build Coastguard Worker     x_zero_band_r *= mag_scaling_fac;
677*15dc779aSAndroid Build Coastguard Worker     x_zero_band_i *= mag_scaling_fac;
678*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < 2; k++) {
679*15dc779aSAndroid Build Coastguard Worker       base = 1e-17;
680*15dc779aSAndroid Build Coastguard Worker       base = base + vec_y_r[k] * vec_y_r[k];
681*15dc779aSAndroid Build Coastguard Worker       base = base + vec_y_i[k] * vec_y_i[k];
682*15dc779aSAndroid Build Coastguard Worker       {
683*15dc779aSAndroid Build Coastguard Worker         temp = (FLOAT32)sqrt(sqrt(base));
684*15dc779aSAndroid Build Coastguard Worker         mag_scaling_fac = temp * (FLOAT32)(sqrt(temp));
685*15dc779aSAndroid Build Coastguard Worker 
686*15dc779aSAndroid Build Coastguard Worker         mag_scaling_fac = 1 / mag_scaling_fac;
687*15dc779aSAndroid Build Coastguard Worker       }
688*15dc779aSAndroid Build Coastguard Worker       vec_y_r[k] *= mag_scaling_fac;
689*15dc779aSAndroid Build Coastguard Worker       vec_y_i[k] *= mag_scaling_fac;
690*15dc779aSAndroid Build Coastguard Worker     }
691*15dc779aSAndroid Build Coastguard Worker 
692*15dc779aSAndroid Build Coastguard Worker     temp_r = x_zero_band_r;
693*15dc779aSAndroid Build Coastguard Worker     temp_i = x_zero_band_i;
694*15dc779aSAndroid Build Coastguard Worker     for (idx = 0; idx < mid_trans_fac - 1; idx++) {
695*15dc779aSAndroid Build Coastguard Worker       FLOAT32 tmp = x_zero_band_r;
696*15dc779aSAndroid Build Coastguard Worker       x_zero_band_r = x_zero_band_r * temp_r - x_zero_band_i * temp_i;
697*15dc779aSAndroid Build Coastguard Worker       x_zero_band_i = tmp * temp_i + x_zero_band_i * temp_r;
698*15dc779aSAndroid Build Coastguard Worker     }
699*15dc779aSAndroid Build Coastguard Worker 
700*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < 2; k++) {
701*15dc779aSAndroid Build Coastguard Worker       temp_r = vec_y_r[k];
702*15dc779aSAndroid Build Coastguard Worker       temp_i = vec_y_i[k];
703*15dc779aSAndroid Build Coastguard Worker       for (idx = 0; idx < max_trans_fac - 1; idx++) {
704*15dc779aSAndroid Build Coastguard Worker         FLOAT32 tmp = vec_y_r[k];
705*15dc779aSAndroid Build Coastguard Worker         vec_y_r[k] = vec_y_r[k] * temp_r - vec_y_i[k] * temp_i;
706*15dc779aSAndroid Build Coastguard Worker         vec_y_i[k] = tmp * temp_i + vec_y_i[k] * temp_r;
707*15dc779aSAndroid Build Coastguard Worker       }
708*15dc779aSAndroid Build Coastguard Worker     }
709*15dc779aSAndroid Build Coastguard Worker 
710*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < 2; k++) {
711*15dc779aSAndroid Build Coastguard Worker       vec_o_r[k] = vec_y_r[k] * x_zero_band_r - vec_y_i[k] * x_zero_band_i;
712*15dc779aSAndroid Build Coastguard Worker       vec_o_i[k] = vec_y_r[k] * x_zero_band_i + vec_y_i[k] * x_zero_band_r;
713*15dc779aSAndroid Build Coastguard Worker     }
714*15dc779aSAndroid Build Coastguard Worker 
715*15dc779aSAndroid Build Coastguard Worker     {
716*15dc779aSAndroid Build Coastguard Worker       FLOAT32 cos_theta;
717*15dc779aSAndroid Build Coastguard Worker       FLOAT32 sin_theta;
718*15dc779aSAndroid Build Coastguard Worker 
719*15dc779aSAndroid Build Coastguard Worker       if (d2 == 1) {
720*15dc779aSAndroid Build Coastguard Worker         cos_theta =
721*15dc779aSAndroid Build Coastguard Worker             ixheaac_hbe_x_prod_cos_table_trans_4_1[(pitch_in_bins_idx << 1) +
722*15dc779aSAndroid Build Coastguard Worker                                                     0];
723*15dc779aSAndroid Build Coastguard Worker         sin_theta =
724*15dc779aSAndroid Build Coastguard Worker             ixheaac_hbe_x_prod_cos_table_trans_4_1[(pitch_in_bins_idx << 1) +
725*15dc779aSAndroid Build Coastguard Worker                                                     1];
726*15dc779aSAndroid Build Coastguard Worker       } else {
727*15dc779aSAndroid Build Coastguard Worker         cos_theta =
728*15dc779aSAndroid Build Coastguard Worker             ixheaac_hbe_x_prod_cos_table_trans_4[(pitch_in_bins_idx << 1) + 0];
729*15dc779aSAndroid Build Coastguard Worker         sin_theta =
730*15dc779aSAndroid Build Coastguard Worker             ixheaac_hbe_x_prod_cos_table_trans_4[(pitch_in_bins_idx << 1) + 1];
731*15dc779aSAndroid Build Coastguard Worker         if (d2 < d1) {
732*15dc779aSAndroid Build Coastguard Worker           sin_theta = -sin_theta;
733*15dc779aSAndroid Build Coastguard Worker         }
734*15dc779aSAndroid Build Coastguard Worker       }
735*15dc779aSAndroid Build Coastguard Worker       temp_r = vec_o_r[0];
736*15dc779aSAndroid Build Coastguard Worker       temp_i = vec_o_i[0];
737*15dc779aSAndroid Build Coastguard Worker       vec_o_r[0] = (FLOAT32)(cos_theta * temp_r - sin_theta * temp_i);
738*15dc779aSAndroid Build Coastguard Worker       vec_o_i[0] = (FLOAT32)(cos_theta * temp_i + sin_theta * temp_r);
739*15dc779aSAndroid Build Coastguard Worker     }
740*15dc779aSAndroid Build Coastguard Worker 
741*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < 2; k++) {
742*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer->qmf_out_buf[qmf_col_idx * 2 + (k + HBE_ZERO_BAND_IDX -
743*15dc779aSAndroid Build Coastguard Worker                                                       1)][2 * qmf_band_idx] +=
744*15dc779aSAndroid Build Coastguard Worker           (FLOAT32)(mag_cmplx_gain * vec_o_r[k]);
745*15dc779aSAndroid Build Coastguard Worker       ptr_hbe_txposer
746*15dc779aSAndroid Build Coastguard Worker           ->qmf_out_buf[qmf_col_idx * 2 + (k + HBE_ZERO_BAND_IDX - 1)]
747*15dc779aSAndroid Build Coastguard Worker                        [2 * qmf_band_idx + 1] +=
748*15dc779aSAndroid Build Coastguard Worker           (FLOAT32)(mag_cmplx_gain * vec_o_i[k]);
749*15dc779aSAndroid Build Coastguard Worker     }
750*15dc779aSAndroid Build Coastguard Worker   }
751*15dc779aSAndroid Build Coastguard Worker }
752*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_hbe_post_anal_prod2(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,WORD32 qmf_voc_columns,WORD32 qmf_band_idx)753*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_post_anal_prod2(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
754*15dc779aSAndroid Build Coastguard Worker                                   WORD32 qmf_voc_columns, WORD32 qmf_band_idx) {
755*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
756*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *norm_ptr = &ptr_hbe_txposer->norm_qmf_in_buf[1][2 * qmf_band_idx];
757*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *out_ptr = &ptr_hbe_txposer->qmf_out_buf[1][2 * qmf_band_idx];
758*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *x_norm_ptr =
759*15dc779aSAndroid Build Coastguard Worker       &ptr_hbe_txposer->norm_qmf_in_buf[HBE_ZERO_BAND_IDX][2 * qmf_band_idx];
760*15dc779aSAndroid Build Coastguard Worker 
761*15dc779aSAndroid Build Coastguard Worker   ixheaacd_norm_qmf_in_buf_2(ptr_hbe_txposer, qmf_band_idx);
762*15dc779aSAndroid Build Coastguard Worker 
763*15dc779aSAndroid Build Coastguard Worker   for (; qmf_band_idx < ptr_hbe_txposer->x_over_qmf[1]; qmf_band_idx++) {
764*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < qmf_voc_columns; i++) {
765*15dc779aSAndroid Build Coastguard Worker       WORD32 k;
766*15dc779aSAndroid Build Coastguard Worker       FLOAT32 x_zero_band_r, x_zero_band_i;
767*15dc779aSAndroid Build Coastguard Worker 
768*15dc779aSAndroid Build Coastguard Worker       x_zero_band_r = *x_norm_ptr++;
769*15dc779aSAndroid Build Coastguard Worker       x_zero_band_i = *x_norm_ptr++;
770*15dc779aSAndroid Build Coastguard Worker 
771*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < HBE_OPER_BLK_LEN_2; k++) {
772*15dc779aSAndroid Build Coastguard Worker         register FLOAT32 tmp_r, tmp_i;
773*15dc779aSAndroid Build Coastguard Worker         tmp_r = *norm_ptr++;
774*15dc779aSAndroid Build Coastguard Worker         tmp_i = *norm_ptr++;
775*15dc779aSAndroid Build Coastguard Worker 
776*15dc779aSAndroid Build Coastguard Worker         *out_ptr++ +=
777*15dc779aSAndroid Build Coastguard Worker             ((tmp_r * x_zero_band_r - tmp_i * x_zero_band_i) * 0.3333333f);
778*15dc779aSAndroid Build Coastguard Worker 
779*15dc779aSAndroid Build Coastguard Worker         *out_ptr++ +=
780*15dc779aSAndroid Build Coastguard Worker             ((tmp_r * x_zero_band_i + tmp_i * x_zero_band_r) * 0.3333333f);
781*15dc779aSAndroid Build Coastguard Worker 
782*15dc779aSAndroid Build Coastguard Worker         norm_ptr += 126;
783*15dc779aSAndroid Build Coastguard Worker         out_ptr += 126;
784*15dc779aSAndroid Build Coastguard Worker       }
785*15dc779aSAndroid Build Coastguard Worker 
786*15dc779aSAndroid Build Coastguard Worker       norm_ptr -= 128 * 9;
787*15dc779aSAndroid Build Coastguard Worker       out_ptr -= 128 * 8;
788*15dc779aSAndroid Build Coastguard Worker       x_norm_ptr += 126;
789*15dc779aSAndroid Build Coastguard Worker     }
790*15dc779aSAndroid Build Coastguard Worker     out_ptr -= (128 * 2 * qmf_voc_columns) - 2;
791*15dc779aSAndroid Build Coastguard Worker     norm_ptr -= (128 * qmf_voc_columns) - 2;
792*15dc779aSAndroid Build Coastguard Worker     x_norm_ptr -= (128 * qmf_voc_columns) - 2;
793*15dc779aSAndroid Build Coastguard Worker   }
794*15dc779aSAndroid Build Coastguard Worker }
795*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_hbe_post_anal_prod3(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,WORD32 qmf_voc_columns,WORD32 qmf_band_idx)796*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_post_anal_prod3(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
797*15dc779aSAndroid Build Coastguard Worker                                   WORD32 qmf_voc_columns, WORD32 qmf_band_idx) {
798*15dc779aSAndroid Build Coastguard Worker   WORD32 i, inp_band_idx, rem;
799*15dc779aSAndroid Build Coastguard Worker 
800*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *out_buf = &ptr_hbe_txposer->qmf_out_buf[2][2 * qmf_band_idx];
801*15dc779aSAndroid Build Coastguard Worker 
802*15dc779aSAndroid Build Coastguard Worker   for (; qmf_band_idx < ptr_hbe_txposer->x_over_qmf[2]; qmf_band_idx++) {
803*15dc779aSAndroid Build Coastguard Worker     FLOAT32 temp_r, temp_i;
804*15dc779aSAndroid Build Coastguard Worker     FLOAT32 temp_r1, temp_i1;
805*15dc779aSAndroid Build Coastguard Worker     const FLOAT32 *ptr_sel, *ptr_sel1;
806*15dc779aSAndroid Build Coastguard Worker 
807*15dc779aSAndroid Build Coastguard Worker     inp_band_idx = (2 * qmf_band_idx) / 3;
808*15dc779aSAndroid Build Coastguard Worker     ptr_sel = &ixheaac_sel_case[(inp_band_idx + 1) & 3][0];
809*15dc779aSAndroid Build Coastguard Worker     ptr_sel1 = &ixheaac_sel_case[((inp_band_idx + 1) & 3) + 1][0];
810*15dc779aSAndroid Build Coastguard Worker     rem = 2 * qmf_band_idx - 3 * inp_band_idx;
811*15dc779aSAndroid Build Coastguard Worker 
812*15dc779aSAndroid Build Coastguard Worker     if (rem == 0 || rem == 1) {
813*15dc779aSAndroid Build Coastguard Worker       FLOAT32 *in_buf = &ptr_hbe_txposer->qmf_in_buf[0][2 * inp_band_idx];
814*15dc779aSAndroid Build Coastguard Worker 
815*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < qmf_voc_columns; i += 1) {
816*15dc779aSAndroid Build Coastguard Worker         WORD32 k;
817*15dc779aSAndroid Build Coastguard Worker         FLOAT32 vec_x[2 * HBE_OPER_WIN_LEN];
818*15dc779aSAndroid Build Coastguard Worker         FLOAT32 *ptr_vec_x = &vec_x[0];
819*15dc779aSAndroid Build Coastguard Worker         FLOAT32 x_zero_band_r, x_zero_band_i;
820*15dc779aSAndroid Build Coastguard Worker 
821*15dc779aSAndroid Build Coastguard Worker         FLOAT32 mag_scaling_fac;
822*15dc779aSAndroid Build Coastguard Worker 
823*15dc779aSAndroid Build Coastguard Worker         for (k = 0; k < (HBE_OPER_BLK_LEN_3); k += 2) {
824*15dc779aSAndroid Build Coastguard Worker           FLOAT64 base1;
825*15dc779aSAndroid Build Coastguard Worker           FLOAT64 base = 1e-17;
826*15dc779aSAndroid Build Coastguard Worker 
827*15dc779aSAndroid Build Coastguard Worker           temp_r = in_buf[0];
828*15dc779aSAndroid Build Coastguard Worker           temp_i = in_buf[1];
829*15dc779aSAndroid Build Coastguard Worker 
830*15dc779aSAndroid Build Coastguard Worker           in_buf += 256;
831*15dc779aSAndroid Build Coastguard Worker 
832*15dc779aSAndroid Build Coastguard Worker           base1 = base + temp_r * temp_r;
833*15dc779aSAndroid Build Coastguard Worker           base1 = base1 + temp_i * temp_i;
834*15dc779aSAndroid Build Coastguard Worker 
835*15dc779aSAndroid Build Coastguard Worker           mag_scaling_fac = (FLOAT32)(ixheaac_cbrt_calc((FLOAT32)base1));
836*15dc779aSAndroid Build Coastguard Worker 
837*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x[0] = temp_r * mag_scaling_fac;
838*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x[1] = temp_i * mag_scaling_fac;
839*15dc779aSAndroid Build Coastguard Worker 
840*15dc779aSAndroid Build Coastguard Worker           temp_r = in_buf[0];
841*15dc779aSAndroid Build Coastguard Worker           temp_i = in_buf[1];
842*15dc779aSAndroid Build Coastguard Worker 
843*15dc779aSAndroid Build Coastguard Worker           in_buf -= 128;
844*15dc779aSAndroid Build Coastguard Worker 
845*15dc779aSAndroid Build Coastguard Worker           temp_r1 = ptr_sel[0] * temp_r + ptr_sel[1] * temp_i;
846*15dc779aSAndroid Build Coastguard Worker           temp_i1 = ptr_sel[2] * temp_r + ptr_sel[3] * temp_i;
847*15dc779aSAndroid Build Coastguard Worker 
848*15dc779aSAndroid Build Coastguard Worker           temp_r = in_buf[0];
849*15dc779aSAndroid Build Coastguard Worker           temp_i = in_buf[1];
850*15dc779aSAndroid Build Coastguard Worker 
851*15dc779aSAndroid Build Coastguard Worker           temp_r1 += ptr_sel[4] * temp_r + ptr_sel[5] * temp_i;
852*15dc779aSAndroid Build Coastguard Worker           temp_i1 += ptr_sel[6] * temp_r + ptr_sel[7] * temp_i;
853*15dc779aSAndroid Build Coastguard Worker 
854*15dc779aSAndroid Build Coastguard Worker           temp_r1 *= 0.3984033437f;
855*15dc779aSAndroid Build Coastguard Worker           temp_i1 *= 0.3984033437f;
856*15dc779aSAndroid Build Coastguard Worker 
857*15dc779aSAndroid Build Coastguard Worker           base1 = base + temp_r1 * temp_r1;
858*15dc779aSAndroid Build Coastguard Worker           base1 = base1 + temp_i1 * temp_i1;
859*15dc779aSAndroid Build Coastguard Worker           mag_scaling_fac = (FLOAT32)(ixheaac_cbrt_calc((FLOAT32)base1));
860*15dc779aSAndroid Build Coastguard Worker 
861*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x[2] = temp_r1 * mag_scaling_fac;
862*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x[3] = temp_i1 * mag_scaling_fac;
863*15dc779aSAndroid Build Coastguard Worker 
864*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x += 4;
865*15dc779aSAndroid Build Coastguard Worker           in_buf += 256;
866*15dc779aSAndroid Build Coastguard Worker         }
867*15dc779aSAndroid Build Coastguard Worker         ptr_vec_x = &vec_x[0];
868*15dc779aSAndroid Build Coastguard Worker         temp_r = vec_x[2 * (HBE_ZERO_BAND_IDX - 2)];
869*15dc779aSAndroid Build Coastguard Worker         temp_i = vec_x[(2 * (HBE_ZERO_BAND_IDX - 2)) + 1];
870*15dc779aSAndroid Build Coastguard Worker 
871*15dc779aSAndroid Build Coastguard Worker         x_zero_band_r = temp_r * temp_r - temp_i * temp_i;
872*15dc779aSAndroid Build Coastguard Worker         x_zero_band_i = temp_r * temp_i + temp_i * temp_r;
873*15dc779aSAndroid Build Coastguard Worker 
874*15dc779aSAndroid Build Coastguard Worker         for (k = 0; k < (HBE_OPER_BLK_LEN_3); k++) {
875*15dc779aSAndroid Build Coastguard Worker           temp_r = ptr_vec_x[0] * x_zero_band_r - ptr_vec_x[1] * x_zero_band_i;
876*15dc779aSAndroid Build Coastguard Worker           temp_i = ptr_vec_x[0] * x_zero_band_i + ptr_vec_x[1] * x_zero_band_r;
877*15dc779aSAndroid Build Coastguard Worker 
878*15dc779aSAndroid Build Coastguard Worker           out_buf[0] += (temp_r * 0.4714045f);
879*15dc779aSAndroid Build Coastguard Worker           out_buf[1] += (temp_i * 0.4714045f);
880*15dc779aSAndroid Build Coastguard Worker 
881*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x += 2;
882*15dc779aSAndroid Build Coastguard Worker           out_buf += 128;
883*15dc779aSAndroid Build Coastguard Worker         }
884*15dc779aSAndroid Build Coastguard Worker 
885*15dc779aSAndroid Build Coastguard Worker         in_buf -= 128 * 11;
886*15dc779aSAndroid Build Coastguard Worker         out_buf -= 128 * 6;
887*15dc779aSAndroid Build Coastguard Worker       }
888*15dc779aSAndroid Build Coastguard Worker     } else {
889*15dc779aSAndroid Build Coastguard Worker       FLOAT32 *in_buf = &ptr_hbe_txposer->qmf_in_buf[0][2 * inp_band_idx];
890*15dc779aSAndroid Build Coastguard Worker       FLOAT32 *in_buf1 =
891*15dc779aSAndroid Build Coastguard Worker           &ptr_hbe_txposer->qmf_in_buf[0][2 * (inp_band_idx + 1)];
892*15dc779aSAndroid Build Coastguard Worker 
893*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < qmf_voc_columns; i++) {
894*15dc779aSAndroid Build Coastguard Worker         WORD32 k;
895*15dc779aSAndroid Build Coastguard Worker         FLOAT32 vec_x[2 * HBE_OPER_WIN_LEN];
896*15dc779aSAndroid Build Coastguard Worker         FLOAT32 vec_x_cap[2 * HBE_OPER_WIN_LEN];
897*15dc779aSAndroid Build Coastguard Worker 
898*15dc779aSAndroid Build Coastguard Worker         FLOAT32 x_zero_band_r, x_zero_band_i;
899*15dc779aSAndroid Build Coastguard Worker         FLOAT32 *ptr_vec_x = &vec_x[0];
900*15dc779aSAndroid Build Coastguard Worker         FLOAT32 *ptr_vec_x_cap = &vec_x_cap[0];
901*15dc779aSAndroid Build Coastguard Worker 
902*15dc779aSAndroid Build Coastguard Worker         FLOAT32 mag_scaling_fac;
903*15dc779aSAndroid Build Coastguard Worker 
904*15dc779aSAndroid Build Coastguard Worker         for (k = 0; k < (HBE_OPER_BLK_LEN_3); k += 2) {
905*15dc779aSAndroid Build Coastguard Worker           FLOAT32 tmp_vr, tmp_vi;
906*15dc779aSAndroid Build Coastguard Worker           FLOAT32 tmp_cr, tmp_ci;
907*15dc779aSAndroid Build Coastguard Worker           FLOAT64 base1;
908*15dc779aSAndroid Build Coastguard Worker           FLOAT64 base = 1e-17;
909*15dc779aSAndroid Build Coastguard Worker 
910*15dc779aSAndroid Build Coastguard Worker           temp_r1 = in_buf[0];
911*15dc779aSAndroid Build Coastguard Worker           temp_i1 = in_buf[1];
912*15dc779aSAndroid Build Coastguard Worker           temp_r = in_buf1[0];
913*15dc779aSAndroid Build Coastguard Worker           temp_i = in_buf1[1];
914*15dc779aSAndroid Build Coastguard Worker 
915*15dc779aSAndroid Build Coastguard Worker           base1 = base + temp_r * temp_r;
916*15dc779aSAndroid Build Coastguard Worker           base1 = base1 + temp_i * temp_i;
917*15dc779aSAndroid Build Coastguard Worker 
918*15dc779aSAndroid Build Coastguard Worker           mag_scaling_fac = (FLOAT32)(ixheaac_cbrt_calc((FLOAT32)base1));
919*15dc779aSAndroid Build Coastguard Worker 
920*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x[0] = temp_r * mag_scaling_fac;
921*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x[1] = temp_i * mag_scaling_fac;
922*15dc779aSAndroid Build Coastguard Worker 
923*15dc779aSAndroid Build Coastguard Worker           base1 = base + temp_r1 * temp_r1;
924*15dc779aSAndroid Build Coastguard Worker           base1 = base1 + temp_i1 * temp_i1;
925*15dc779aSAndroid Build Coastguard Worker 
926*15dc779aSAndroid Build Coastguard Worker           mag_scaling_fac = (FLOAT32)(ixheaac_cbrt_calc((FLOAT32)base1));
927*15dc779aSAndroid Build Coastguard Worker 
928*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x_cap[0] = temp_r1 * mag_scaling_fac;
929*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x_cap[1] = temp_i1 * mag_scaling_fac;
930*15dc779aSAndroid Build Coastguard Worker 
931*15dc779aSAndroid Build Coastguard Worker           in_buf += 256;
932*15dc779aSAndroid Build Coastguard Worker 
933*15dc779aSAndroid Build Coastguard Worker           temp_r = in_buf[0];
934*15dc779aSAndroid Build Coastguard Worker           temp_i = in_buf[1];
935*15dc779aSAndroid Build Coastguard Worker 
936*15dc779aSAndroid Build Coastguard Worker           temp_r1 = ptr_sel[0] * temp_r + ptr_sel[1] * temp_i;
937*15dc779aSAndroid Build Coastguard Worker           temp_i1 = ptr_sel[2] * temp_r + ptr_sel[3] * temp_i;
938*15dc779aSAndroid Build Coastguard Worker 
939*15dc779aSAndroid Build Coastguard Worker           in_buf -= 128;
940*15dc779aSAndroid Build Coastguard Worker 
941*15dc779aSAndroid Build Coastguard Worker           temp_r = in_buf[0];
942*15dc779aSAndroid Build Coastguard Worker           temp_i = in_buf[1];
943*15dc779aSAndroid Build Coastguard Worker 
944*15dc779aSAndroid Build Coastguard Worker           tmp_cr = temp_r1 + ptr_sel[4] * temp_r + ptr_sel[5] * temp_i;
945*15dc779aSAndroid Build Coastguard Worker           tmp_ci = temp_i1 + ptr_sel[6] * temp_r + ptr_sel[7] * temp_i;
946*15dc779aSAndroid Build Coastguard Worker 
947*15dc779aSAndroid Build Coastguard Worker           in_buf1 += 256;
948*15dc779aSAndroid Build Coastguard Worker 
949*15dc779aSAndroid Build Coastguard Worker           temp_r = in_buf1[0];
950*15dc779aSAndroid Build Coastguard Worker           temp_i = in_buf1[1];
951*15dc779aSAndroid Build Coastguard Worker 
952*15dc779aSAndroid Build Coastguard Worker           temp_r1 = ptr_sel1[0] * temp_r + ptr_sel1[1] * temp_i;
953*15dc779aSAndroid Build Coastguard Worker           temp_i1 = ptr_sel1[2] * temp_r + ptr_sel1[3] * temp_i;
954*15dc779aSAndroid Build Coastguard Worker 
955*15dc779aSAndroid Build Coastguard Worker           in_buf1 -= 128;
956*15dc779aSAndroid Build Coastguard Worker 
957*15dc779aSAndroid Build Coastguard Worker           temp_r = in_buf1[0];
958*15dc779aSAndroid Build Coastguard Worker           temp_i = in_buf1[1];
959*15dc779aSAndroid Build Coastguard Worker 
960*15dc779aSAndroid Build Coastguard Worker           tmp_vr = temp_r1 + ptr_sel1[4] * temp_r + ptr_sel1[5] * temp_i;
961*15dc779aSAndroid Build Coastguard Worker           tmp_vi = temp_i1 + ptr_sel1[6] * temp_r + ptr_sel1[7] * temp_i;
962*15dc779aSAndroid Build Coastguard Worker 
963*15dc779aSAndroid Build Coastguard Worker           tmp_cr *= 0.3984033437f;
964*15dc779aSAndroid Build Coastguard Worker           tmp_ci *= 0.3984033437f;
965*15dc779aSAndroid Build Coastguard Worker 
966*15dc779aSAndroid Build Coastguard Worker           tmp_vr *= 0.3984033437f;
967*15dc779aSAndroid Build Coastguard Worker           tmp_vi *= 0.3984033437f;
968*15dc779aSAndroid Build Coastguard Worker 
969*15dc779aSAndroid Build Coastguard Worker           base1 = base + tmp_vr * tmp_vr;
970*15dc779aSAndroid Build Coastguard Worker           base1 = base1 + tmp_vi * tmp_vi;
971*15dc779aSAndroid Build Coastguard Worker 
972*15dc779aSAndroid Build Coastguard Worker           mag_scaling_fac = (FLOAT32)(ixheaac_cbrt_calc((FLOAT32)base1));
973*15dc779aSAndroid Build Coastguard Worker 
974*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x[2] = tmp_vr * mag_scaling_fac;
975*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x[3] = tmp_vi * mag_scaling_fac;
976*15dc779aSAndroid Build Coastguard Worker 
977*15dc779aSAndroid Build Coastguard Worker           base1 = base + tmp_cr * tmp_cr;
978*15dc779aSAndroid Build Coastguard Worker           base1 = base1 + tmp_ci * tmp_ci;
979*15dc779aSAndroid Build Coastguard Worker 
980*15dc779aSAndroid Build Coastguard Worker           mag_scaling_fac = (FLOAT32)(ixheaac_cbrt_calc((FLOAT32)base1));
981*15dc779aSAndroid Build Coastguard Worker 
982*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x_cap[2] = tmp_cr * mag_scaling_fac;
983*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x_cap[3] = tmp_ci * mag_scaling_fac;
984*15dc779aSAndroid Build Coastguard Worker 
985*15dc779aSAndroid Build Coastguard Worker           in_buf += 256;
986*15dc779aSAndroid Build Coastguard Worker           in_buf1 += 256;
987*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x += 4;
988*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x_cap += 4;
989*15dc779aSAndroid Build Coastguard Worker         }
990*15dc779aSAndroid Build Coastguard Worker         ptr_vec_x = &vec_x[0];
991*15dc779aSAndroid Build Coastguard Worker         ptr_vec_x_cap = &vec_x_cap[0];
992*15dc779aSAndroid Build Coastguard Worker 
993*15dc779aSAndroid Build Coastguard Worker         temp_r = vec_x_cap[2 * (HBE_ZERO_BAND_IDX - 2)];
994*15dc779aSAndroid Build Coastguard Worker         temp_i = vec_x_cap[2 * (HBE_ZERO_BAND_IDX - 2) + 1];
995*15dc779aSAndroid Build Coastguard Worker         temp_r1 = vec_x[2 * (HBE_ZERO_BAND_IDX - 2)];
996*15dc779aSAndroid Build Coastguard Worker         temp_i1 = vec_x[2 * (HBE_ZERO_BAND_IDX - 2) + 1];
997*15dc779aSAndroid Build Coastguard Worker 
998*15dc779aSAndroid Build Coastguard Worker         x_zero_band_r = temp_r * temp_r - temp_i * temp_i;
999*15dc779aSAndroid Build Coastguard Worker         x_zero_band_i = temp_r * temp_i + temp_i * temp_r;
1000*15dc779aSAndroid Build Coastguard Worker 
1001*15dc779aSAndroid Build Coastguard Worker         temp_r = temp_r1 * temp_r1 - temp_i1 * temp_i1;
1002*15dc779aSAndroid Build Coastguard Worker         temp_i = temp_r1 * temp_i1 + temp_i1 * temp_r1;
1003*15dc779aSAndroid Build Coastguard Worker 
1004*15dc779aSAndroid Build Coastguard Worker         for (k = 0; k < (HBE_OPER_BLK_LEN_3); k++) {
1005*15dc779aSAndroid Build Coastguard Worker           temp_r1 = ptr_vec_x[0] * x_zero_band_r - ptr_vec_x[1] * x_zero_band_i;
1006*15dc779aSAndroid Build Coastguard Worker           temp_i1 = ptr_vec_x[0] * x_zero_band_i + ptr_vec_x[1] * x_zero_band_r;
1007*15dc779aSAndroid Build Coastguard Worker 
1008*15dc779aSAndroid Build Coastguard Worker           temp_r1 += ptr_vec_x_cap[0] * temp_r - ptr_vec_x_cap[1] * temp_i;
1009*15dc779aSAndroid Build Coastguard Worker           temp_i1 += ptr_vec_x_cap[0] * temp_i + ptr_vec_x_cap[1] * temp_r;
1010*15dc779aSAndroid Build Coastguard Worker 
1011*15dc779aSAndroid Build Coastguard Worker           out_buf[0] += (temp_r1 * 0.23570225f);
1012*15dc779aSAndroid Build Coastguard Worker           out_buf[1] += (temp_i1 * 0.23570225f);
1013*15dc779aSAndroid Build Coastguard Worker 
1014*15dc779aSAndroid Build Coastguard Worker           out_buf += 128;
1015*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x += 2;
1016*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x_cap += 2;
1017*15dc779aSAndroid Build Coastguard Worker         }
1018*15dc779aSAndroid Build Coastguard Worker 
1019*15dc779aSAndroid Build Coastguard Worker         in_buf -= 128 * 11;
1020*15dc779aSAndroid Build Coastguard Worker         in_buf1 -= 128 * 11;
1021*15dc779aSAndroid Build Coastguard Worker         out_buf -= 128 * 6;
1022*15dc779aSAndroid Build Coastguard Worker       }
1023*15dc779aSAndroid Build Coastguard Worker     }
1024*15dc779aSAndroid Build Coastguard Worker 
1025*15dc779aSAndroid Build Coastguard Worker     out_buf -= (256 * qmf_voc_columns) - 2;
1026*15dc779aSAndroid Build Coastguard Worker   }
1027*15dc779aSAndroid Build Coastguard Worker }
1028*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_hbe_post_anal_prod4(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,WORD32 qmf_voc_columns,WORD32 qmf_band_idx)1029*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_post_anal_prod4(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
1030*15dc779aSAndroid Build Coastguard Worker                                   WORD32 qmf_voc_columns, WORD32 qmf_band_idx) {
1031*15dc779aSAndroid Build Coastguard Worker   WORD32 i, inp_band_idx;
1032*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *out_ptr = &ptr_hbe_txposer->qmf_out_buf[3][2 * qmf_band_idx];
1033*15dc779aSAndroid Build Coastguard Worker 
1034*15dc779aSAndroid Build Coastguard Worker   ixheaacd_norm_qmf_in_buf_4(ptr_hbe_txposer, ((qmf_band_idx >> 1) - 1));
1035*15dc779aSAndroid Build Coastguard Worker 
1036*15dc779aSAndroid Build Coastguard Worker   for (; qmf_band_idx < ptr_hbe_txposer->x_over_qmf[3]; qmf_band_idx++) {
1037*15dc779aSAndroid Build Coastguard Worker     WORD32 ip_idx;
1038*15dc779aSAndroid Build Coastguard Worker     FLOAT32 temp, temp_r, temp_i;
1039*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *norm_ptr, *x_norm_ptr;
1040*15dc779aSAndroid Build Coastguard Worker     inp_band_idx = qmf_band_idx >> 1;
1041*15dc779aSAndroid Build Coastguard Worker     ip_idx = (qmf_band_idx & 1) ? (inp_band_idx + 1) : (inp_band_idx - 1);
1042*15dc779aSAndroid Build Coastguard Worker 
1043*15dc779aSAndroid Build Coastguard Worker     norm_ptr = &ptr_hbe_txposer->norm_qmf_in_buf[0][2 * ip_idx];
1044*15dc779aSAndroid Build Coastguard Worker     x_norm_ptr =
1045*15dc779aSAndroid Build Coastguard Worker         &ptr_hbe_txposer->norm_qmf_in_buf[HBE_ZERO_BAND_IDX][2 * inp_band_idx];
1046*15dc779aSAndroid Build Coastguard Worker 
1047*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < qmf_voc_columns; i++) {
1048*15dc779aSAndroid Build Coastguard Worker       WORD32 k;
1049*15dc779aSAndroid Build Coastguard Worker       FLOAT32 x_zero_band_r, x_zero_band_i;
1050*15dc779aSAndroid Build Coastguard Worker 
1051*15dc779aSAndroid Build Coastguard Worker       temp_r = x_zero_band_r = *x_norm_ptr++;
1052*15dc779aSAndroid Build Coastguard Worker       temp_i = x_zero_band_i = *x_norm_ptr++;
1053*15dc779aSAndroid Build Coastguard Worker 
1054*15dc779aSAndroid Build Coastguard Worker       temp = x_zero_band_r * x_zero_band_r - x_zero_band_i * x_zero_band_i;
1055*15dc779aSAndroid Build Coastguard Worker       x_zero_band_i =
1056*15dc779aSAndroid Build Coastguard Worker           x_zero_band_r * x_zero_band_i + x_zero_band_i * x_zero_band_r;
1057*15dc779aSAndroid Build Coastguard Worker 
1058*15dc779aSAndroid Build Coastguard Worker       x_zero_band_r = temp_r * temp - temp_i * x_zero_band_i;
1059*15dc779aSAndroid Build Coastguard Worker       x_zero_band_i = temp_r * x_zero_band_i + temp_i * temp;
1060*15dc779aSAndroid Build Coastguard Worker 
1061*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < HBE_OPER_BLK_LEN_4; k++) {
1062*15dc779aSAndroid Build Coastguard Worker         temp = *norm_ptr++;
1063*15dc779aSAndroid Build Coastguard Worker         temp_i = *norm_ptr++;
1064*15dc779aSAndroid Build Coastguard Worker 
1065*15dc779aSAndroid Build Coastguard Worker         temp_r = temp * x_zero_band_r - temp_i * x_zero_band_i;
1066*15dc779aSAndroid Build Coastguard Worker         temp_i = temp * x_zero_band_i + temp_i * x_zero_band_r;
1067*15dc779aSAndroid Build Coastguard Worker 
1068*15dc779aSAndroid Build Coastguard Worker         *out_ptr++ += (temp_r * 0.6666667f);
1069*15dc779aSAndroid Build Coastguard Worker         *out_ptr++ += (temp_i * 0.6666667f);
1070*15dc779aSAndroid Build Coastguard Worker 
1071*15dc779aSAndroid Build Coastguard Worker         norm_ptr += 254;
1072*15dc779aSAndroid Build Coastguard Worker         out_ptr += 126;
1073*15dc779aSAndroid Build Coastguard Worker       }
1074*15dc779aSAndroid Build Coastguard Worker 
1075*15dc779aSAndroid Build Coastguard Worker       norm_ptr -= 128 * 11;
1076*15dc779aSAndroid Build Coastguard Worker       out_ptr -= 128 * 4;
1077*15dc779aSAndroid Build Coastguard Worker       x_norm_ptr += 126;
1078*15dc779aSAndroid Build Coastguard Worker     }
1079*15dc779aSAndroid Build Coastguard Worker 
1080*15dc779aSAndroid Build Coastguard Worker     out_ptr -= (128 * 2 * qmf_voc_columns) - 2;
1081*15dc779aSAndroid Build Coastguard Worker   }
1082*15dc779aSAndroid Build Coastguard Worker }
1083*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_hbe_post_anal_xprod2(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,WORD32 qmf_voc_columns,WORD32 qmf_band_idx,FLOAT32 p,FLOAT32 * cos_sin_theta)1084*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_post_anal_xprod2(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
1085*15dc779aSAndroid Build Coastguard Worker                                    WORD32 qmf_voc_columns, WORD32 qmf_band_idx,
1086*15dc779aSAndroid Build Coastguard Worker                                    FLOAT32 p, FLOAT32 *cos_sin_theta) {
1087*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
1088*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *norm_ptr = &ptr_hbe_txposer->norm_qmf_in_buf[1][2 * qmf_band_idx];
1089*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *out_ptr = &ptr_hbe_txposer->qmf_out_buf[1][2 * qmf_band_idx];
1090*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *x_norm_ptr =
1091*15dc779aSAndroid Build Coastguard Worker       &ptr_hbe_txposer->norm_qmf_in_buf[HBE_ZERO_BAND_IDX][2 * qmf_band_idx];
1092*15dc779aSAndroid Build Coastguard Worker 
1093*15dc779aSAndroid Build Coastguard Worker   ixheaacd_norm_qmf_in_buf_2(ptr_hbe_txposer, qmf_band_idx);
1094*15dc779aSAndroid Build Coastguard Worker 
1095*15dc779aSAndroid Build Coastguard Worker   for (; qmf_band_idx < ptr_hbe_txposer->x_over_qmf[1]; qmf_band_idx++) {
1096*15dc779aSAndroid Build Coastguard Worker     WORD32 n1, n2;
1097*15dc779aSAndroid Build Coastguard Worker     FLOAT64 temp_fac;
1098*15dc779aSAndroid Build Coastguard Worker     FLOAT32 mag_cmplx_gain = 1.666666667f;
1099*15dc779aSAndroid Build Coastguard Worker     temp_fac = (2.0 * qmf_band_idx + 1 - p) * 0.5;
1100*15dc779aSAndroid Build Coastguard Worker     n1 = ((WORD32)(temp_fac)) << 1;
1101*15dc779aSAndroid Build Coastguard Worker     n2 = ((WORD32)(temp_fac + p)) << 1;
1102*15dc779aSAndroid Build Coastguard Worker 
1103*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < qmf_voc_columns; i++) {
1104*15dc779aSAndroid Build Coastguard Worker       WORD32 k;
1105*15dc779aSAndroid Build Coastguard Worker       FLOAT32 x_zero_band_r, x_zero_band_i;
1106*15dc779aSAndroid Build Coastguard Worker 
1107*15dc779aSAndroid Build Coastguard Worker       x_zero_band_r = *x_norm_ptr++;
1108*15dc779aSAndroid Build Coastguard Worker       x_zero_band_i = *x_norm_ptr++;
1109*15dc779aSAndroid Build Coastguard Worker 
1110*15dc779aSAndroid Build Coastguard Worker       for (k = 1; k < (HBE_OPER_BLK_LEN_2 + 1); k++) {
1111*15dc779aSAndroid Build Coastguard Worker         register FLOAT32 tmp_r, tmp_i;
1112*15dc779aSAndroid Build Coastguard Worker         tmp_r = *norm_ptr++;
1113*15dc779aSAndroid Build Coastguard Worker         tmp_i = *norm_ptr++;
1114*15dc779aSAndroid Build Coastguard Worker 
1115*15dc779aSAndroid Build Coastguard Worker         *out_ptr++ +=
1116*15dc779aSAndroid Build Coastguard Worker             ((tmp_r * x_zero_band_r - tmp_i * x_zero_band_i) * 0.3333333f);
1117*15dc779aSAndroid Build Coastguard Worker 
1118*15dc779aSAndroid Build Coastguard Worker         *out_ptr++ +=
1119*15dc779aSAndroid Build Coastguard Worker             ((tmp_r * x_zero_band_i + tmp_i * x_zero_band_r) * 0.3333333f);
1120*15dc779aSAndroid Build Coastguard Worker 
1121*15dc779aSAndroid Build Coastguard Worker         norm_ptr += 126;
1122*15dc779aSAndroid Build Coastguard Worker         out_ptr += 126;
1123*15dc779aSAndroid Build Coastguard Worker       }
1124*15dc779aSAndroid Build Coastguard Worker       norm_ptr -= 128 * 9;
1125*15dc779aSAndroid Build Coastguard Worker       out_ptr -= 128 * 8;
1126*15dc779aSAndroid Build Coastguard Worker       x_norm_ptr += 126;
1127*15dc779aSAndroid Build Coastguard Worker 
1128*15dc779aSAndroid Build Coastguard Worker       {
1129*15dc779aSAndroid Build Coastguard Worker         WORD32 max_trans_fac, max_n1, max_n2;
1130*15dc779aSAndroid Build Coastguard Worker         FLOAT32 max_mag_value;
1131*15dc779aSAndroid Build Coastguard Worker         FLOAT32 mag_zero_band, mag_n1_band, mag_n2_band, temp;
1132*15dc779aSAndroid Build Coastguard Worker 
1133*15dc779aSAndroid Build Coastguard Worker         FLOAT32 *qmf_in_buf_ri =
1134*15dc779aSAndroid Build Coastguard Worker             ptr_hbe_txposer->qmf_in_buf[i + HBE_ZERO_BAND_IDX];
1135*15dc779aSAndroid Build Coastguard Worker 
1136*15dc779aSAndroid Build Coastguard Worker         mag_zero_band =
1137*15dc779aSAndroid Build Coastguard Worker             qmf_in_buf_ri[2 * qmf_band_idx] * qmf_in_buf_ri[2 * qmf_band_idx] +
1138*15dc779aSAndroid Build Coastguard Worker             qmf_in_buf_ri[2 * qmf_band_idx + 1] *
1139*15dc779aSAndroid Build Coastguard Worker                 qmf_in_buf_ri[2 * qmf_band_idx + 1];
1140*15dc779aSAndroid Build Coastguard Worker 
1141*15dc779aSAndroid Build Coastguard Worker         mag_n1_band = qmf_in_buf_ri[n1] * qmf_in_buf_ri[n1] +
1142*15dc779aSAndroid Build Coastguard Worker                       qmf_in_buf_ri[n1 + 1] * qmf_in_buf_ri[n1 + 1];
1143*15dc779aSAndroid Build Coastguard Worker         mag_n2_band = qmf_in_buf_ri[n2] * qmf_in_buf_ri[n2] +
1144*15dc779aSAndroid Build Coastguard Worker                       qmf_in_buf_ri[n2 + 1] * qmf_in_buf_ri[n2 + 1];
1145*15dc779aSAndroid Build Coastguard Worker 
1146*15dc779aSAndroid Build Coastguard Worker         temp = min(mag_n1_band, mag_n2_band);
1147*15dc779aSAndroid Build Coastguard Worker 
1148*15dc779aSAndroid Build Coastguard Worker         max_mag_value = 0;
1149*15dc779aSAndroid Build Coastguard Worker         max_trans_fac = 0;
1150*15dc779aSAndroid Build Coastguard Worker         max_n1 = 0;
1151*15dc779aSAndroid Build Coastguard Worker         max_n2 = 0;
1152*15dc779aSAndroid Build Coastguard Worker 
1153*15dc779aSAndroid Build Coastguard Worker         if (temp > 0) {
1154*15dc779aSAndroid Build Coastguard Worker           max_mag_value = temp;
1155*15dc779aSAndroid Build Coastguard Worker           max_trans_fac = 1;
1156*15dc779aSAndroid Build Coastguard Worker           max_n1 = n1;
1157*15dc779aSAndroid Build Coastguard Worker           max_n2 = n2;
1158*15dc779aSAndroid Build Coastguard Worker         }
1159*15dc779aSAndroid Build Coastguard Worker 
1160*15dc779aSAndroid Build Coastguard Worker         if (max_mag_value > mag_zero_band && max_n1 >= 0 &&
1161*15dc779aSAndroid Build Coastguard Worker             max_n2 < TWICE_QMF_SYNTH_CHANNELS_NUM) {
1162*15dc779aSAndroid Build Coastguard Worker           FLOAT32 vec_y_r[2], vec_y_i[2];
1163*15dc779aSAndroid Build Coastguard Worker           FLOAT32 temp_r, temp_i, tmp_r1;
1164*15dc779aSAndroid Build Coastguard Worker           WORD32 mid_trans_fac, idx;
1165*15dc779aSAndroid Build Coastguard Worker           FLOAT64 base;
1166*15dc779aSAndroid Build Coastguard Worker           WORD32 k;
1167*15dc779aSAndroid Build Coastguard Worker           FLOAT32 mag_scaling_fac = 0.0f;
1168*15dc779aSAndroid Build Coastguard Worker           FLOAT32 x_zero_band_r = 0;
1169*15dc779aSAndroid Build Coastguard Worker           FLOAT32 x_zero_band_i = 0;
1170*15dc779aSAndroid Build Coastguard Worker 
1171*15dc779aSAndroid Build Coastguard Worker           mid_trans_fac = 2 - max_trans_fac;
1172*15dc779aSAndroid Build Coastguard Worker 
1173*15dc779aSAndroid Build Coastguard Worker           x_zero_band_r = qmf_in_buf_ri[max_n1];
1174*15dc779aSAndroid Build Coastguard Worker           x_zero_band_i = qmf_in_buf_ri[max_n1 + 1];
1175*15dc779aSAndroid Build Coastguard Worker           base = 1e-17;
1176*15dc779aSAndroid Build Coastguard Worker           base = base + x_zero_band_r * x_zero_band_r;
1177*15dc779aSAndroid Build Coastguard Worker           base = base + x_zero_band_i * x_zero_band_i;
1178*15dc779aSAndroid Build Coastguard Worker 
1179*15dc779aSAndroid Build Coastguard Worker           mag_scaling_fac = (FLOAT32)(1.0f / base);
1180*15dc779aSAndroid Build Coastguard Worker           mag_scaling_fac = (FLOAT32)sqrt(sqrt(mag_scaling_fac));
1181*15dc779aSAndroid Build Coastguard Worker 
1182*15dc779aSAndroid Build Coastguard Worker           x_zero_band_r *= mag_scaling_fac;
1183*15dc779aSAndroid Build Coastguard Worker           x_zero_band_i *= mag_scaling_fac;
1184*15dc779aSAndroid Build Coastguard Worker 
1185*15dc779aSAndroid Build Coastguard Worker           temp_r = x_zero_band_r;
1186*15dc779aSAndroid Build Coastguard Worker           temp_i = x_zero_band_i;
1187*15dc779aSAndroid Build Coastguard Worker           for (idx = 0; idx < mid_trans_fac - 1; idx++) {
1188*15dc779aSAndroid Build Coastguard Worker             FLOAT32 tmp = x_zero_band_r;
1189*15dc779aSAndroid Build Coastguard Worker             x_zero_band_r = x_zero_band_r * temp_r - x_zero_band_i * temp_i;
1190*15dc779aSAndroid Build Coastguard Worker             x_zero_band_i = tmp * temp_i + x_zero_band_i * temp_r;
1191*15dc779aSAndroid Build Coastguard Worker           }
1192*15dc779aSAndroid Build Coastguard Worker 
1193*15dc779aSAndroid Build Coastguard Worker           for (k = 0; k < 2; k++) {
1194*15dc779aSAndroid Build Coastguard Worker             temp_r = ptr_hbe_txposer
1195*15dc779aSAndroid Build Coastguard Worker                          ->qmf_in_buf[i + HBE_ZERO_BAND_IDX - 1 + k][max_n2];
1196*15dc779aSAndroid Build Coastguard Worker             temp_i =
1197*15dc779aSAndroid Build Coastguard Worker                 ptr_hbe_txposer
1198*15dc779aSAndroid Build Coastguard Worker                     ->qmf_in_buf[i + HBE_ZERO_BAND_IDX - 1 + k][max_n2 + 1];
1199*15dc779aSAndroid Build Coastguard Worker 
1200*15dc779aSAndroid Build Coastguard Worker             base = 1e-17;
1201*15dc779aSAndroid Build Coastguard Worker             base = base + temp_r * temp_r;
1202*15dc779aSAndroid Build Coastguard Worker             base = base + temp_i * temp_i;
1203*15dc779aSAndroid Build Coastguard Worker 
1204*15dc779aSAndroid Build Coastguard Worker             mag_scaling_fac = (FLOAT32)(1.0f / base);
1205*15dc779aSAndroid Build Coastguard Worker             mag_scaling_fac = (FLOAT32)sqrt(sqrt(mag_scaling_fac));
1206*15dc779aSAndroid Build Coastguard Worker 
1207*15dc779aSAndroid Build Coastguard Worker             temp_r *= mag_scaling_fac;
1208*15dc779aSAndroid Build Coastguard Worker             temp_i *= mag_scaling_fac;
1209*15dc779aSAndroid Build Coastguard Worker 
1210*15dc779aSAndroid Build Coastguard Worker             vec_y_r[k] = temp_r;
1211*15dc779aSAndroid Build Coastguard Worker             vec_y_i[k] = temp_i;
1212*15dc779aSAndroid Build Coastguard Worker           }
1213*15dc779aSAndroid Build Coastguard Worker 
1214*15dc779aSAndroid Build Coastguard Worker           temp_r = vec_y_r[0] * x_zero_band_r - vec_y_i[0] * x_zero_band_i;
1215*15dc779aSAndroid Build Coastguard Worker           temp_i = vec_y_r[0] * x_zero_band_i + vec_y_i[0] * x_zero_band_r;
1216*15dc779aSAndroid Build Coastguard Worker 
1217*15dc779aSAndroid Build Coastguard Worker           tmp_r1 =
1218*15dc779aSAndroid Build Coastguard Worker               (FLOAT32)(cos_sin_theta[0] * temp_r - cos_sin_theta[1] * temp_i);
1219*15dc779aSAndroid Build Coastguard Worker           temp_i =
1220*15dc779aSAndroid Build Coastguard Worker               (FLOAT32)(cos_sin_theta[0] * temp_i + cos_sin_theta[1] * temp_r);
1221*15dc779aSAndroid Build Coastguard Worker 
1222*15dc779aSAndroid Build Coastguard Worker           ptr_hbe_txposer->qmf_out_buf[i * 2 + (HBE_ZERO_BAND_IDX - 1)]
1223*15dc779aSAndroid Build Coastguard Worker                                       [2 * qmf_band_idx] +=
1224*15dc779aSAndroid Build Coastguard Worker               (FLOAT32)(mag_cmplx_gain * tmp_r1);
1225*15dc779aSAndroid Build Coastguard Worker 
1226*15dc779aSAndroid Build Coastguard Worker           ptr_hbe_txposer->qmf_out_buf[i * 2 + (HBE_ZERO_BAND_IDX - 1)]
1227*15dc779aSAndroid Build Coastguard Worker                                       [2 * qmf_band_idx + 1] +=
1228*15dc779aSAndroid Build Coastguard Worker               (FLOAT32)(mag_cmplx_gain * temp_i);
1229*15dc779aSAndroid Build Coastguard Worker 
1230*15dc779aSAndroid Build Coastguard Worker           temp_r = vec_y_r[1] * x_zero_band_r - vec_y_i[1] * x_zero_band_i;
1231*15dc779aSAndroid Build Coastguard Worker           temp_i = vec_y_r[1] * x_zero_band_i + vec_y_i[1] * x_zero_band_r;
1232*15dc779aSAndroid Build Coastguard Worker 
1233*15dc779aSAndroid Build Coastguard Worker           ptr_hbe_txposer->qmf_out_buf[i * 2 + (1 + HBE_ZERO_BAND_IDX - 1)]
1234*15dc779aSAndroid Build Coastguard Worker                                       [2 * qmf_band_idx] +=
1235*15dc779aSAndroid Build Coastguard Worker               (FLOAT32)(mag_cmplx_gain * temp_r);
1236*15dc779aSAndroid Build Coastguard Worker 
1237*15dc779aSAndroid Build Coastguard Worker           ptr_hbe_txposer->qmf_out_buf[i * 2 + (1 + HBE_ZERO_BAND_IDX - 1)]
1238*15dc779aSAndroid Build Coastguard Worker                                       [2 * qmf_band_idx + 1] +=
1239*15dc779aSAndroid Build Coastguard Worker               (FLOAT32)(mag_cmplx_gain * temp_i);
1240*15dc779aSAndroid Build Coastguard Worker         }
1241*15dc779aSAndroid Build Coastguard Worker       }
1242*15dc779aSAndroid Build Coastguard Worker     }
1243*15dc779aSAndroid Build Coastguard Worker 
1244*15dc779aSAndroid Build Coastguard Worker     out_ptr -= (128 * 2 * qmf_voc_columns) - 2;
1245*15dc779aSAndroid Build Coastguard Worker     norm_ptr -= (128 * qmf_voc_columns) - 2;
1246*15dc779aSAndroid Build Coastguard Worker     x_norm_ptr -= (128 * qmf_voc_columns) - 2;
1247*15dc779aSAndroid Build Coastguard Worker   }
1248*15dc779aSAndroid Build Coastguard Worker }
1249*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_hbe_post_anal_xprod3(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,WORD32 qmf_voc_columns,WORD32 qmf_band_idx,FLOAT32 p,WORD32 pitch_in_bins_idx)1250*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_post_anal_xprod3(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
1251*15dc779aSAndroid Build Coastguard Worker                                    WORD32 qmf_voc_columns, WORD32 qmf_band_idx,
1252*15dc779aSAndroid Build Coastguard Worker                                    FLOAT32 p, WORD32 pitch_in_bins_idx) {
1253*15dc779aSAndroid Build Coastguard Worker   WORD32 i, inp_band_idx, rem;
1254*15dc779aSAndroid Build Coastguard Worker 
1255*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *out_buf = &ptr_hbe_txposer->qmf_out_buf[2][2 * qmf_band_idx];
1256*15dc779aSAndroid Build Coastguard Worker 
1257*15dc779aSAndroid Build Coastguard Worker   for (; qmf_band_idx < ptr_hbe_txposer->x_over_qmf[2]; qmf_band_idx++) {
1258*15dc779aSAndroid Build Coastguard Worker     FLOAT32 temp_r, temp_i;
1259*15dc779aSAndroid Build Coastguard Worker     FLOAT32 temp_r1, temp_i1;
1260*15dc779aSAndroid Build Coastguard Worker     const FLOAT32 *ptr_sel, *ptr_sel1;
1261*15dc779aSAndroid Build Coastguard Worker 
1262*15dc779aSAndroid Build Coastguard Worker     inp_band_idx = (2 * qmf_band_idx) / 3;
1263*15dc779aSAndroid Build Coastguard Worker     ptr_sel = &ixheaac_sel_case[(inp_band_idx + 1) & 3][0];
1264*15dc779aSAndroid Build Coastguard Worker     ptr_sel1 = &ixheaac_sel_case[((inp_band_idx + 1) & 3) + 1][0];
1265*15dc779aSAndroid Build Coastguard Worker     rem = 2 * qmf_band_idx - 3 * inp_band_idx;
1266*15dc779aSAndroid Build Coastguard Worker 
1267*15dc779aSAndroid Build Coastguard Worker     if (rem == 0 || rem == 1) {
1268*15dc779aSAndroid Build Coastguard Worker       FLOAT32 *in_buf = &ptr_hbe_txposer->qmf_in_buf[0][2 * inp_band_idx];
1269*15dc779aSAndroid Build Coastguard Worker 
1270*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < qmf_voc_columns; i += 1) {
1271*15dc779aSAndroid Build Coastguard Worker         WORD32 k;
1272*15dc779aSAndroid Build Coastguard Worker         FLOAT32 vec_x[2 * HBE_OPER_WIN_LEN];
1273*15dc779aSAndroid Build Coastguard Worker         FLOAT32 *ptr_vec_x = &vec_x[0];
1274*15dc779aSAndroid Build Coastguard Worker         FLOAT32 x_zero_band_r, x_zero_band_i;
1275*15dc779aSAndroid Build Coastguard Worker 
1276*15dc779aSAndroid Build Coastguard Worker         FLOAT32 mag_scaling_fac;
1277*15dc779aSAndroid Build Coastguard Worker 
1278*15dc779aSAndroid Build Coastguard Worker         for (k = 0; k < (HBE_OPER_BLK_LEN_3); k += 2) {
1279*15dc779aSAndroid Build Coastguard Worker           FLOAT64 base1;
1280*15dc779aSAndroid Build Coastguard Worker           FLOAT64 base = 1e-17;
1281*15dc779aSAndroid Build Coastguard Worker 
1282*15dc779aSAndroid Build Coastguard Worker           temp_r = in_buf[0];
1283*15dc779aSAndroid Build Coastguard Worker           temp_i = in_buf[1];
1284*15dc779aSAndroid Build Coastguard Worker 
1285*15dc779aSAndroid Build Coastguard Worker           in_buf += 256;
1286*15dc779aSAndroid Build Coastguard Worker 
1287*15dc779aSAndroid Build Coastguard Worker           base1 = base + temp_r * temp_r;
1288*15dc779aSAndroid Build Coastguard Worker           base1 = base1 + temp_i * temp_i;
1289*15dc779aSAndroid Build Coastguard Worker 
1290*15dc779aSAndroid Build Coastguard Worker           mag_scaling_fac = (FLOAT32)(ixheaac_cbrt_calc((FLOAT32)base1));
1291*15dc779aSAndroid Build Coastguard Worker 
1292*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x[0] = temp_r * mag_scaling_fac;
1293*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x[1] = temp_i * mag_scaling_fac;
1294*15dc779aSAndroid Build Coastguard Worker 
1295*15dc779aSAndroid Build Coastguard Worker           temp_r = in_buf[0];
1296*15dc779aSAndroid Build Coastguard Worker           temp_i = in_buf[1];
1297*15dc779aSAndroid Build Coastguard Worker 
1298*15dc779aSAndroid Build Coastguard Worker           in_buf -= 128;
1299*15dc779aSAndroid Build Coastguard Worker 
1300*15dc779aSAndroid Build Coastguard Worker           temp_r1 = ptr_sel[0] * temp_r + ptr_sel[1] * temp_i;
1301*15dc779aSAndroid Build Coastguard Worker           temp_i1 = ptr_sel[2] * temp_r + ptr_sel[3] * temp_i;
1302*15dc779aSAndroid Build Coastguard Worker 
1303*15dc779aSAndroid Build Coastguard Worker           temp_r = in_buf[0];
1304*15dc779aSAndroid Build Coastguard Worker           temp_i = in_buf[1];
1305*15dc779aSAndroid Build Coastguard Worker 
1306*15dc779aSAndroid Build Coastguard Worker           temp_r1 += ptr_sel[4] * temp_r + ptr_sel[5] * temp_i;
1307*15dc779aSAndroid Build Coastguard Worker           temp_i1 += ptr_sel[6] * temp_r + ptr_sel[7] * temp_i;
1308*15dc779aSAndroid Build Coastguard Worker 
1309*15dc779aSAndroid Build Coastguard Worker           temp_r1 *= 0.3984033437f;
1310*15dc779aSAndroid Build Coastguard Worker           temp_i1 *= 0.3984033437f;
1311*15dc779aSAndroid Build Coastguard Worker 
1312*15dc779aSAndroid Build Coastguard Worker           base1 = base + temp_r1 * temp_r1;
1313*15dc779aSAndroid Build Coastguard Worker           base1 = base1 + temp_i1 * temp_i1;
1314*15dc779aSAndroid Build Coastguard Worker           mag_scaling_fac = (FLOAT32)(ixheaac_cbrt_calc((FLOAT32)base1));
1315*15dc779aSAndroid Build Coastguard Worker 
1316*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x[2] = temp_r1 * mag_scaling_fac;
1317*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x[3] = temp_i1 * mag_scaling_fac;
1318*15dc779aSAndroid Build Coastguard Worker 
1319*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x += 4;
1320*15dc779aSAndroid Build Coastguard Worker           in_buf += 256;
1321*15dc779aSAndroid Build Coastguard Worker         }
1322*15dc779aSAndroid Build Coastguard Worker         ptr_vec_x = &vec_x[0];
1323*15dc779aSAndroid Build Coastguard Worker         temp_r = vec_x[2 * (HBE_ZERO_BAND_IDX - 2)];
1324*15dc779aSAndroid Build Coastguard Worker         temp_i = vec_x[(2 * (HBE_ZERO_BAND_IDX - 2)) + 1];
1325*15dc779aSAndroid Build Coastguard Worker 
1326*15dc779aSAndroid Build Coastguard Worker         x_zero_band_r = temp_r * temp_r - temp_i * temp_i;
1327*15dc779aSAndroid Build Coastguard Worker         x_zero_band_i = temp_r * temp_i + temp_i * temp_r;
1328*15dc779aSAndroid Build Coastguard Worker 
1329*15dc779aSAndroid Build Coastguard Worker         for (k = 0; k < (HBE_OPER_BLK_LEN_3); k++) {
1330*15dc779aSAndroid Build Coastguard Worker           temp_r = ptr_vec_x[0] * x_zero_band_r - ptr_vec_x[1] * x_zero_band_i;
1331*15dc779aSAndroid Build Coastguard Worker           temp_i = ptr_vec_x[0] * x_zero_band_i + ptr_vec_x[1] * x_zero_band_r;
1332*15dc779aSAndroid Build Coastguard Worker 
1333*15dc779aSAndroid Build Coastguard Worker           out_buf[0] += (temp_r * 0.4714045f);
1334*15dc779aSAndroid Build Coastguard Worker           out_buf[1] += (temp_i * 0.4714045f);
1335*15dc779aSAndroid Build Coastguard Worker 
1336*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x += 2;
1337*15dc779aSAndroid Build Coastguard Worker           out_buf += 128;
1338*15dc779aSAndroid Build Coastguard Worker         }
1339*15dc779aSAndroid Build Coastguard Worker 
1340*15dc779aSAndroid Build Coastguard Worker         ixheaacd_hbe_xprod_proc_3(ptr_hbe_txposer, qmf_band_idx, i, p,
1341*15dc779aSAndroid Build Coastguard Worker                                   pitch_in_bins_idx);
1342*15dc779aSAndroid Build Coastguard Worker 
1343*15dc779aSAndroid Build Coastguard Worker         in_buf -= 128 * 11;
1344*15dc779aSAndroid Build Coastguard Worker         out_buf -= 128 * 6;
1345*15dc779aSAndroid Build Coastguard Worker       }
1346*15dc779aSAndroid Build Coastguard Worker     } else {
1347*15dc779aSAndroid Build Coastguard Worker       FLOAT32 *in_buf = &ptr_hbe_txposer->qmf_in_buf[0][2 * inp_band_idx];
1348*15dc779aSAndroid Build Coastguard Worker       FLOAT32 *in_buf1 =
1349*15dc779aSAndroid Build Coastguard Worker           &ptr_hbe_txposer->qmf_in_buf[0][2 * (inp_band_idx + 1)];
1350*15dc779aSAndroid Build Coastguard Worker 
1351*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < qmf_voc_columns; i++) {
1352*15dc779aSAndroid Build Coastguard Worker         WORD32 k;
1353*15dc779aSAndroid Build Coastguard Worker         FLOAT32 vec_x[2 * HBE_OPER_WIN_LEN];
1354*15dc779aSAndroid Build Coastguard Worker         FLOAT32 vec_x_cap[2 * HBE_OPER_WIN_LEN];
1355*15dc779aSAndroid Build Coastguard Worker 
1356*15dc779aSAndroid Build Coastguard Worker         FLOAT32 x_zero_band_r, x_zero_band_i;
1357*15dc779aSAndroid Build Coastguard Worker         FLOAT32 *ptr_vec_x = &vec_x[0];
1358*15dc779aSAndroid Build Coastguard Worker         FLOAT32 *ptr_vec_x_cap = &vec_x_cap[0];
1359*15dc779aSAndroid Build Coastguard Worker 
1360*15dc779aSAndroid Build Coastguard Worker         FLOAT32 mag_scaling_fac;
1361*15dc779aSAndroid Build Coastguard Worker 
1362*15dc779aSAndroid Build Coastguard Worker         for (k = 0; k < (HBE_OPER_BLK_LEN_3); k += 2) {
1363*15dc779aSAndroid Build Coastguard Worker           FLOAT32 tmp_vr, tmp_vi;
1364*15dc779aSAndroid Build Coastguard Worker           FLOAT32 tmp_cr, tmp_ci;
1365*15dc779aSAndroid Build Coastguard Worker           FLOAT64 base1;
1366*15dc779aSAndroid Build Coastguard Worker           FLOAT64 base = 1e-17;
1367*15dc779aSAndroid Build Coastguard Worker 
1368*15dc779aSAndroid Build Coastguard Worker           temp_r1 = in_buf[0];
1369*15dc779aSAndroid Build Coastguard Worker           temp_i1 = in_buf[1];
1370*15dc779aSAndroid Build Coastguard Worker           temp_r = in_buf1[0];
1371*15dc779aSAndroid Build Coastguard Worker           temp_i = in_buf1[1];
1372*15dc779aSAndroid Build Coastguard Worker 
1373*15dc779aSAndroid Build Coastguard Worker           base1 = base + temp_r * temp_r;
1374*15dc779aSAndroid Build Coastguard Worker           base1 = base1 + temp_i * temp_i;
1375*15dc779aSAndroid Build Coastguard Worker 
1376*15dc779aSAndroid Build Coastguard Worker           mag_scaling_fac = (FLOAT32)(ixheaac_cbrt_calc((FLOAT32)base1));
1377*15dc779aSAndroid Build Coastguard Worker 
1378*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x[0] = temp_r * mag_scaling_fac;
1379*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x[1] = temp_i * mag_scaling_fac;
1380*15dc779aSAndroid Build Coastguard Worker 
1381*15dc779aSAndroid Build Coastguard Worker           base1 = base + temp_r1 * temp_r1;
1382*15dc779aSAndroid Build Coastguard Worker           base1 = base1 + temp_i1 * temp_i1;
1383*15dc779aSAndroid Build Coastguard Worker 
1384*15dc779aSAndroid Build Coastguard Worker           mag_scaling_fac = (FLOAT32)(ixheaac_cbrt_calc((FLOAT32)base1));
1385*15dc779aSAndroid Build Coastguard Worker 
1386*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x_cap[0] = temp_r1 * mag_scaling_fac;
1387*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x_cap[1] = temp_i1 * mag_scaling_fac;
1388*15dc779aSAndroid Build Coastguard Worker 
1389*15dc779aSAndroid Build Coastguard Worker           in_buf += 256;
1390*15dc779aSAndroid Build Coastguard Worker 
1391*15dc779aSAndroid Build Coastguard Worker           temp_r = in_buf[0];
1392*15dc779aSAndroid Build Coastguard Worker           temp_i = in_buf[1];
1393*15dc779aSAndroid Build Coastguard Worker 
1394*15dc779aSAndroid Build Coastguard Worker           temp_r1 = ptr_sel[0] * temp_r + ptr_sel[1] * temp_i;
1395*15dc779aSAndroid Build Coastguard Worker           temp_i1 = ptr_sel[2] * temp_r + ptr_sel[3] * temp_i;
1396*15dc779aSAndroid Build Coastguard Worker 
1397*15dc779aSAndroid Build Coastguard Worker           in_buf -= 128;
1398*15dc779aSAndroid Build Coastguard Worker 
1399*15dc779aSAndroid Build Coastguard Worker           temp_r = in_buf[0];
1400*15dc779aSAndroid Build Coastguard Worker           temp_i = in_buf[1];
1401*15dc779aSAndroid Build Coastguard Worker 
1402*15dc779aSAndroid Build Coastguard Worker           tmp_cr = temp_r1 + ptr_sel[4] * temp_r + ptr_sel[5] * temp_i;
1403*15dc779aSAndroid Build Coastguard Worker           tmp_ci = temp_i1 + ptr_sel[6] * temp_r + ptr_sel[7] * temp_i;
1404*15dc779aSAndroid Build Coastguard Worker 
1405*15dc779aSAndroid Build Coastguard Worker           in_buf1 += 256;
1406*15dc779aSAndroid Build Coastguard Worker 
1407*15dc779aSAndroid Build Coastguard Worker           temp_r = in_buf1[0];
1408*15dc779aSAndroid Build Coastguard Worker           temp_i = in_buf1[1];
1409*15dc779aSAndroid Build Coastguard Worker 
1410*15dc779aSAndroid Build Coastguard Worker           temp_r1 = ptr_sel1[0] * temp_r + ptr_sel1[1] * temp_i;
1411*15dc779aSAndroid Build Coastguard Worker           temp_i1 = ptr_sel1[2] * temp_r + ptr_sel1[3] * temp_i;
1412*15dc779aSAndroid Build Coastguard Worker 
1413*15dc779aSAndroid Build Coastguard Worker           in_buf1 -= 128;
1414*15dc779aSAndroid Build Coastguard Worker 
1415*15dc779aSAndroid Build Coastguard Worker           temp_r = in_buf1[0];
1416*15dc779aSAndroid Build Coastguard Worker           temp_i = in_buf1[1];
1417*15dc779aSAndroid Build Coastguard Worker 
1418*15dc779aSAndroid Build Coastguard Worker           tmp_vr = temp_r1 + ptr_sel1[4] * temp_r + ptr_sel1[5] * temp_i;
1419*15dc779aSAndroid Build Coastguard Worker           tmp_vi = temp_i1 + ptr_sel1[6] * temp_r + ptr_sel1[7] * temp_i;
1420*15dc779aSAndroid Build Coastguard Worker 
1421*15dc779aSAndroid Build Coastguard Worker           tmp_cr *= 0.3984033437f;
1422*15dc779aSAndroid Build Coastguard Worker           tmp_ci *= 0.3984033437f;
1423*15dc779aSAndroid Build Coastguard Worker 
1424*15dc779aSAndroid Build Coastguard Worker           tmp_vr *= 0.3984033437f;
1425*15dc779aSAndroid Build Coastguard Worker           tmp_vi *= 0.3984033437f;
1426*15dc779aSAndroid Build Coastguard Worker 
1427*15dc779aSAndroid Build Coastguard Worker           base1 = base + tmp_vr * tmp_vr;
1428*15dc779aSAndroid Build Coastguard Worker           base1 = base1 + tmp_vi * tmp_vi;
1429*15dc779aSAndroid Build Coastguard Worker 
1430*15dc779aSAndroid Build Coastguard Worker           mag_scaling_fac = (FLOAT32)(ixheaac_cbrt_calc((FLOAT32)base1));
1431*15dc779aSAndroid Build Coastguard Worker 
1432*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x[2] = tmp_vr * mag_scaling_fac;
1433*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x[3] = tmp_vi * mag_scaling_fac;
1434*15dc779aSAndroid Build Coastguard Worker 
1435*15dc779aSAndroid Build Coastguard Worker           base1 = base + tmp_cr * tmp_cr;
1436*15dc779aSAndroid Build Coastguard Worker           base1 = base1 + tmp_ci * tmp_ci;
1437*15dc779aSAndroid Build Coastguard Worker 
1438*15dc779aSAndroid Build Coastguard Worker           mag_scaling_fac = (FLOAT32)(ixheaac_cbrt_calc((FLOAT32)base1));
1439*15dc779aSAndroid Build Coastguard Worker 
1440*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x_cap[2] = tmp_cr * mag_scaling_fac;
1441*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x_cap[3] = tmp_ci * mag_scaling_fac;
1442*15dc779aSAndroid Build Coastguard Worker 
1443*15dc779aSAndroid Build Coastguard Worker           in_buf += 256;
1444*15dc779aSAndroid Build Coastguard Worker           in_buf1 += 256;
1445*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x += 4;
1446*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x_cap += 4;
1447*15dc779aSAndroid Build Coastguard Worker         }
1448*15dc779aSAndroid Build Coastguard Worker         ptr_vec_x = &vec_x[0];
1449*15dc779aSAndroid Build Coastguard Worker         ptr_vec_x_cap = &vec_x_cap[0];
1450*15dc779aSAndroid Build Coastguard Worker 
1451*15dc779aSAndroid Build Coastguard Worker         temp_r = vec_x_cap[2 * (HBE_ZERO_BAND_IDX - 2)];
1452*15dc779aSAndroid Build Coastguard Worker         temp_i = vec_x_cap[2 * (HBE_ZERO_BAND_IDX - 2) + 1];
1453*15dc779aSAndroid Build Coastguard Worker         temp_r1 = vec_x[2 * (HBE_ZERO_BAND_IDX - 2)];
1454*15dc779aSAndroid Build Coastguard Worker         temp_i1 = vec_x[2 * (HBE_ZERO_BAND_IDX - 2) + 1];
1455*15dc779aSAndroid Build Coastguard Worker 
1456*15dc779aSAndroid Build Coastguard Worker         x_zero_band_r = temp_r * temp_r - temp_i * temp_i;
1457*15dc779aSAndroid Build Coastguard Worker         x_zero_band_i = temp_r * temp_i + temp_i * temp_r;
1458*15dc779aSAndroid Build Coastguard Worker 
1459*15dc779aSAndroid Build Coastguard Worker         temp_r = temp_r1 * temp_r1 - temp_i1 * temp_i1;
1460*15dc779aSAndroid Build Coastguard Worker         temp_i = temp_r1 * temp_i1 + temp_i1 * temp_r1;
1461*15dc779aSAndroid Build Coastguard Worker 
1462*15dc779aSAndroid Build Coastguard Worker         for (k = 0; k < (HBE_OPER_BLK_LEN_3); k++) {
1463*15dc779aSAndroid Build Coastguard Worker           temp_r1 = ptr_vec_x[0] * x_zero_band_r - ptr_vec_x[1] * x_zero_band_i;
1464*15dc779aSAndroid Build Coastguard Worker           temp_i1 = ptr_vec_x[0] * x_zero_band_i + ptr_vec_x[1] * x_zero_band_r;
1465*15dc779aSAndroid Build Coastguard Worker 
1466*15dc779aSAndroid Build Coastguard Worker           temp_r1 += ptr_vec_x_cap[0] * temp_r - ptr_vec_x_cap[1] * temp_i;
1467*15dc779aSAndroid Build Coastguard Worker           temp_i1 += ptr_vec_x_cap[0] * temp_i + ptr_vec_x_cap[1] * temp_r;
1468*15dc779aSAndroid Build Coastguard Worker 
1469*15dc779aSAndroid Build Coastguard Worker           out_buf[0] += (temp_r1 * 0.23570225f);
1470*15dc779aSAndroid Build Coastguard Worker           out_buf[1] += (temp_i1 * 0.23570225f);
1471*15dc779aSAndroid Build Coastguard Worker 
1472*15dc779aSAndroid Build Coastguard Worker           out_buf += 128;
1473*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x += 2;
1474*15dc779aSAndroid Build Coastguard Worker           ptr_vec_x_cap += 2;
1475*15dc779aSAndroid Build Coastguard Worker         }
1476*15dc779aSAndroid Build Coastguard Worker 
1477*15dc779aSAndroid Build Coastguard Worker         ixheaacd_hbe_xprod_proc_3(ptr_hbe_txposer, qmf_band_idx, i, p,
1478*15dc779aSAndroid Build Coastguard Worker                                   pitch_in_bins_idx);
1479*15dc779aSAndroid Build Coastguard Worker 
1480*15dc779aSAndroid Build Coastguard Worker         in_buf -= 128 * 11;
1481*15dc779aSAndroid Build Coastguard Worker         in_buf1 -= 128 * 11;
1482*15dc779aSAndroid Build Coastguard Worker         out_buf -= 128 * 6;
1483*15dc779aSAndroid Build Coastguard Worker       }
1484*15dc779aSAndroid Build Coastguard Worker     }
1485*15dc779aSAndroid Build Coastguard Worker 
1486*15dc779aSAndroid Build Coastguard Worker     out_buf -= (256 * qmf_voc_columns) - 2;
1487*15dc779aSAndroid Build Coastguard Worker   }
1488*15dc779aSAndroid Build Coastguard Worker }
1489*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_hbe_post_anal_xprod4(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,WORD32 qmf_voc_columns,WORD32 qmf_band_idx,FLOAT32 p,WORD32 pitch_in_bins_idx)1490*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hbe_post_anal_xprod4(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
1491*15dc779aSAndroid Build Coastguard Worker                                    WORD32 qmf_voc_columns, WORD32 qmf_band_idx,
1492*15dc779aSAndroid Build Coastguard Worker                                    FLOAT32 p, WORD32 pitch_in_bins_idx) {
1493*15dc779aSAndroid Build Coastguard Worker   WORD32 i, inp_band_idx;
1494*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *out_ptr = &ptr_hbe_txposer->qmf_out_buf[3][2 * qmf_band_idx];
1495*15dc779aSAndroid Build Coastguard Worker 
1496*15dc779aSAndroid Build Coastguard Worker   ixheaacd_norm_qmf_in_buf_4(ptr_hbe_txposer, ((qmf_band_idx >> 1) - 1));
1497*15dc779aSAndroid Build Coastguard Worker 
1498*15dc779aSAndroid Build Coastguard Worker   for (; qmf_band_idx < ptr_hbe_txposer->x_over_qmf[3]; qmf_band_idx++) {
1499*15dc779aSAndroid Build Coastguard Worker     WORD32 ip_idx;
1500*15dc779aSAndroid Build Coastguard Worker     FLOAT32 temp, temp_r, temp_i;
1501*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *norm_ptr, *x_norm_ptr;
1502*15dc779aSAndroid Build Coastguard Worker     inp_band_idx = qmf_band_idx >> 1;
1503*15dc779aSAndroid Build Coastguard Worker     ip_idx = (qmf_band_idx & 1) ? (inp_band_idx + 1) : (inp_band_idx - 1);
1504*15dc779aSAndroid Build Coastguard Worker 
1505*15dc779aSAndroid Build Coastguard Worker     norm_ptr = &ptr_hbe_txposer->norm_qmf_in_buf[0][2 * ip_idx];
1506*15dc779aSAndroid Build Coastguard Worker     x_norm_ptr =
1507*15dc779aSAndroid Build Coastguard Worker         &ptr_hbe_txposer->norm_qmf_in_buf[HBE_ZERO_BAND_IDX][2 * inp_band_idx];
1508*15dc779aSAndroid Build Coastguard Worker 
1509*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < qmf_voc_columns; i++) {
1510*15dc779aSAndroid Build Coastguard Worker       WORD32 k;
1511*15dc779aSAndroid Build Coastguard Worker       FLOAT32 x_zero_band_r, x_zero_band_i;
1512*15dc779aSAndroid Build Coastguard Worker 
1513*15dc779aSAndroid Build Coastguard Worker       temp_r = x_zero_band_r = *x_norm_ptr++;
1514*15dc779aSAndroid Build Coastguard Worker       temp_i = x_zero_band_i = *x_norm_ptr++;
1515*15dc779aSAndroid Build Coastguard Worker 
1516*15dc779aSAndroid Build Coastguard Worker       temp = x_zero_band_r * x_zero_band_r - x_zero_band_i * x_zero_band_i;
1517*15dc779aSAndroid Build Coastguard Worker       x_zero_band_i =
1518*15dc779aSAndroid Build Coastguard Worker           x_zero_band_r * x_zero_band_i + x_zero_band_i * x_zero_band_r;
1519*15dc779aSAndroid Build Coastguard Worker 
1520*15dc779aSAndroid Build Coastguard Worker       x_zero_band_r = temp_r * temp - temp_i * x_zero_band_i;
1521*15dc779aSAndroid Build Coastguard Worker       x_zero_band_i = temp_r * x_zero_band_i + temp_i * temp;
1522*15dc779aSAndroid Build Coastguard Worker 
1523*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < HBE_OPER_BLK_LEN_4; k++) {
1524*15dc779aSAndroid Build Coastguard Worker         temp = *norm_ptr++;
1525*15dc779aSAndroid Build Coastguard Worker         temp_i = *norm_ptr++;
1526*15dc779aSAndroid Build Coastguard Worker 
1527*15dc779aSAndroid Build Coastguard Worker         temp_r = temp * x_zero_band_r - temp_i * x_zero_band_i;
1528*15dc779aSAndroid Build Coastguard Worker         temp_i = temp * x_zero_band_i + temp_i * x_zero_band_r;
1529*15dc779aSAndroid Build Coastguard Worker 
1530*15dc779aSAndroid Build Coastguard Worker         *out_ptr++ += (temp_r * 0.6666667f);
1531*15dc779aSAndroid Build Coastguard Worker         *out_ptr++ += (temp_i * 0.6666667f);
1532*15dc779aSAndroid Build Coastguard Worker 
1533*15dc779aSAndroid Build Coastguard Worker         norm_ptr += 254;
1534*15dc779aSAndroid Build Coastguard Worker         out_ptr += 126;
1535*15dc779aSAndroid Build Coastguard Worker       }
1536*15dc779aSAndroid Build Coastguard Worker 
1537*15dc779aSAndroid Build Coastguard Worker       norm_ptr -= 128 * 11;
1538*15dc779aSAndroid Build Coastguard Worker       out_ptr -= 128 * 4;
1539*15dc779aSAndroid Build Coastguard Worker       x_norm_ptr += 126;
1540*15dc779aSAndroid Build Coastguard Worker 
1541*15dc779aSAndroid Build Coastguard Worker       ixheaacd_hbe_xprod_proc_4(ptr_hbe_txposer, qmf_band_idx, i, p,
1542*15dc779aSAndroid Build Coastguard Worker                                 pitch_in_bins_idx);
1543*15dc779aSAndroid Build Coastguard Worker     }
1544*15dc779aSAndroid Build Coastguard Worker 
1545*15dc779aSAndroid Build Coastguard Worker     out_ptr -= (128 * 2 * qmf_voc_columns) - 2;
1546*15dc779aSAndroid Build Coastguard Worker   }
1547*15dc779aSAndroid Build Coastguard Worker }
1548*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_hbe_post_anal_process(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,WORD32 pitch_in_bins,WORD32 sbr_upsamp_4_flg)1549*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_hbe_post_anal_process(
1550*15dc779aSAndroid Build Coastguard Worker     ia_esbr_hbe_txposer_struct *ptr_hbe_txposer, WORD32 pitch_in_bins,
1551*15dc779aSAndroid Build Coastguard Worker     WORD32 sbr_upsamp_4_flg) {
1552*15dc779aSAndroid Build Coastguard Worker   FLOAT32 p;
1553*15dc779aSAndroid Build Coastguard Worker   WORD32 trans_fac;
1554*15dc779aSAndroid Build Coastguard Worker   WORD32 qmf_voc_columns = ptr_hbe_txposer->no_bins / 2;
1555*15dc779aSAndroid Build Coastguard Worker   FLOAT32 cos_sin_theta[2];
1556*15dc779aSAndroid Build Coastguard Worker 
1557*15dc779aSAndroid Build Coastguard Worker   p = (sbr_upsamp_4_flg) ? (FLOAT32)(pitch_in_bins * 0.04166666666666)
1558*15dc779aSAndroid Build Coastguard Worker                          : (FLOAT32)(pitch_in_bins * 0.08333333333333);
1559*15dc779aSAndroid Build Coastguard Worker 
1560*15dc779aSAndroid Build Coastguard Worker   if (p < SBR_CONST_PMIN) {
1561*15dc779aSAndroid Build Coastguard Worker     trans_fac = 2;
1562*15dc779aSAndroid Build Coastguard Worker     if (trans_fac <= ptr_hbe_txposer->max_stretch)
1563*15dc779aSAndroid Build Coastguard Worker       ixheaacd_hbe_post_anal_prod2(ptr_hbe_txposer, qmf_voc_columns,
1564*15dc779aSAndroid Build Coastguard Worker                                    ptr_hbe_txposer->x_over_qmf[0]);
1565*15dc779aSAndroid Build Coastguard Worker 
1566*15dc779aSAndroid Build Coastguard Worker     trans_fac = 3;
1567*15dc779aSAndroid Build Coastguard Worker     if (trans_fac <= ptr_hbe_txposer->max_stretch)
1568*15dc779aSAndroid Build Coastguard Worker       ixheaacd_hbe_post_anal_prod3(ptr_hbe_txposer, qmf_voc_columns,
1569*15dc779aSAndroid Build Coastguard Worker                                    ptr_hbe_txposer->x_over_qmf[1]);
1570*15dc779aSAndroid Build Coastguard Worker 
1571*15dc779aSAndroid Build Coastguard Worker     trans_fac = 4;
1572*15dc779aSAndroid Build Coastguard Worker     if (trans_fac <= ptr_hbe_txposer->max_stretch) {
1573*15dc779aSAndroid Build Coastguard Worker       if (ptr_hbe_txposer->x_over_qmf[2] <= 1) return IA_FATAL_ERROR;
1574*15dc779aSAndroid Build Coastguard Worker       ixheaacd_hbe_post_anal_prod4(ptr_hbe_txposer, qmf_voc_columns,
1575*15dc779aSAndroid Build Coastguard Worker                                    ptr_hbe_txposer->x_over_qmf[2]);
1576*15dc779aSAndroid Build Coastguard Worker     }
1577*15dc779aSAndroid Build Coastguard Worker 
1578*15dc779aSAndroid Build Coastguard Worker   } else {
1579*15dc779aSAndroid Build Coastguard Worker     trans_fac = 2;
1580*15dc779aSAndroid Build Coastguard Worker     if (trans_fac <= ptr_hbe_txposer->max_stretch) {
1581*15dc779aSAndroid Build Coastguard Worker       cos_sin_theta[0] = ixheaac_hbe_x_prod_cos_table_trans_2
1582*15dc779aSAndroid Build Coastguard Worker           [((pitch_in_bins + sbr_upsamp_4_flg * 128) << 1) + 0];
1583*15dc779aSAndroid Build Coastguard Worker       cos_sin_theta[1] = ixheaac_hbe_x_prod_cos_table_trans_2
1584*15dc779aSAndroid Build Coastguard Worker           [((pitch_in_bins + sbr_upsamp_4_flg * 128) << 1) + 1];
1585*15dc779aSAndroid Build Coastguard Worker 
1586*15dc779aSAndroid Build Coastguard Worker       ixheaacd_hbe_post_anal_xprod2(ptr_hbe_txposer, qmf_voc_columns,
1587*15dc779aSAndroid Build Coastguard Worker                                     ptr_hbe_txposer->x_over_qmf[0], p,
1588*15dc779aSAndroid Build Coastguard Worker                                     cos_sin_theta);
1589*15dc779aSAndroid Build Coastguard Worker     }
1590*15dc779aSAndroid Build Coastguard Worker 
1591*15dc779aSAndroid Build Coastguard Worker     trans_fac = 3;
1592*15dc779aSAndroid Build Coastguard Worker     if (trans_fac <= ptr_hbe_txposer->max_stretch)
1593*15dc779aSAndroid Build Coastguard Worker       ixheaacd_hbe_post_anal_xprod3(ptr_hbe_txposer, qmf_voc_columns,
1594*15dc779aSAndroid Build Coastguard Worker                                     ptr_hbe_txposer->x_over_qmf[1], p,
1595*15dc779aSAndroid Build Coastguard Worker                                     (pitch_in_bins + sbr_upsamp_4_flg * 128));
1596*15dc779aSAndroid Build Coastguard Worker 
1597*15dc779aSAndroid Build Coastguard Worker     trans_fac = 4;
1598*15dc779aSAndroid Build Coastguard Worker     if (trans_fac <= ptr_hbe_txposer->max_stretch) {
1599*15dc779aSAndroid Build Coastguard Worker       if (ptr_hbe_txposer->x_over_qmf[2] <= 1) return IA_FATAL_ERROR;
1600*15dc779aSAndroid Build Coastguard Worker       ixheaacd_hbe_post_anal_xprod4(ptr_hbe_txposer, qmf_voc_columns,
1601*15dc779aSAndroid Build Coastguard Worker                                     ptr_hbe_txposer->x_over_qmf[2], p,
1602*15dc779aSAndroid Build Coastguard Worker                                     (pitch_in_bins + sbr_upsamp_4_flg * 128));
1603*15dc779aSAndroid Build Coastguard Worker     }
1604*15dc779aSAndroid Build Coastguard Worker   }
1605*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
1606*15dc779aSAndroid Build Coastguard Worker }
1607