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