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