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