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