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