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