Coverage Report

Created: 2026-02-26 06:35

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