1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker * *
3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker *
5*15dc779aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker *
9*15dc779aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker *
11*15dc779aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker *
17*15dc779aSAndroid Build Coastguard Worker *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker #include <string.h>
21*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_interface.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
27*15dc779aSAndroid Build Coastguard Worker
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_sbr_const.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_freq_sca.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lpp_tran.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_calc.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pvc_dec.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_dec.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_poly.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_esbr_rom.h"
47*15dc779aSAndroid Build Coastguard Worker
ixheaacd_complex_anal_filt(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer)48*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_complex_anal_filt(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer) {
49*15dc779aSAndroid Build Coastguard Worker WORD32 idx;
50*15dc779aSAndroid Build Coastguard Worker WORD32 anal_size = 2 * ptr_hbe_txposer->synth_size;
51*15dc779aSAndroid Build Coastguard Worker WORD32 N = (10 * anal_size);
52*15dc779aSAndroid Build Coastguard Worker WORD32 no_bins = ptr_hbe_txposer->no_bins >> 1;
53*15dc779aSAndroid Build Coastguard Worker
54*15dc779aSAndroid Build Coastguard Worker if (ptr_hbe_txposer->esbr_hq != 0) {
55*15dc779aSAndroid Build Coastguard Worker anal_size = 2 * ptr_hbe_txposer->analy_size;
56*15dc779aSAndroid Build Coastguard Worker no_bins = ptr_hbe_txposer->no_bins;
57*15dc779aSAndroid Build Coastguard Worker }
58*15dc779aSAndroid Build Coastguard Worker
59*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < no_bins; idx++) {
60*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, k, l;
61*15dc779aSAndroid Build Coastguard Worker FLOAT32 window_output[640];
62*15dc779aSAndroid Build Coastguard Worker FLOAT32 u[128], u_in[256], u_out[256];
63*15dc779aSAndroid Build Coastguard Worker FLOAT32 accu_r, accu_i;
64*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *inp_signal;
65*15dc779aSAndroid Build Coastguard Worker FLOAT32 *anal_buf;
66*15dc779aSAndroid Build Coastguard Worker
67*15dc779aSAndroid Build Coastguard Worker FLOAT32 *analy_cos_sin_tab = ptr_hbe_txposer->analy_cos_sin_tab;
68*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *interp_window_coeff = ptr_hbe_txposer->analy_wind_coeff;
69*15dc779aSAndroid Build Coastguard Worker FLOAT32 *x = ptr_hbe_txposer->analy_buf;
70*15dc779aSAndroid Build Coastguard Worker if (ptr_hbe_txposer->esbr_hq != 0) {
71*15dc779aSAndroid Build Coastguard Worker memset(ptr_hbe_txposer->qmf_in_buf[idx], 0,
72*15dc779aSAndroid Build Coastguard Worker TWICE_QMF_SYNTH_CHANNELS_NUM * sizeof(FLOAT32));
73*15dc779aSAndroid Build Coastguard Worker inp_signal = ptr_hbe_txposer->ptr_output_buf +
74*15dc779aSAndroid Build Coastguard Worker idx * ptr_hbe_txposer->analy_size + 1;
75*15dc779aSAndroid Build Coastguard Worker anal_buf = &ptr_hbe_txposer->qmf_in_buf[idx]
76*15dc779aSAndroid Build Coastguard Worker [4 * ptr_hbe_txposer->a_start];
77*15dc779aSAndroid Build Coastguard Worker } else {
78*15dc779aSAndroid Build Coastguard Worker memset(ptr_hbe_txposer->qmf_in_buf[idx + HBE_OPER_WIN_LEN - 1], 0,
79*15dc779aSAndroid Build Coastguard Worker TWICE_QMF_SYNTH_CHANNELS_NUM * sizeof(FLOAT32));
80*15dc779aSAndroid Build Coastguard Worker
81*15dc779aSAndroid Build Coastguard Worker inp_signal = ptr_hbe_txposer->ptr_input_buf +
82*15dc779aSAndroid Build Coastguard Worker idx * 2 * ptr_hbe_txposer->synth_size + 1;
83*15dc779aSAndroid Build Coastguard Worker anal_buf = &ptr_hbe_txposer->qmf_in_buf[idx + HBE_OPER_WIN_LEN - 1]
84*15dc779aSAndroid Build Coastguard Worker [4 * ptr_hbe_txposer->k_start];
85*15dc779aSAndroid Build Coastguard Worker }
86*15dc779aSAndroid Build Coastguard Worker
87*15dc779aSAndroid Build Coastguard Worker for (i = N - 1; i >= anal_size; i--) {
88*15dc779aSAndroid Build Coastguard Worker x[i] = x[i - anal_size];
89*15dc779aSAndroid Build Coastguard Worker }
90*15dc779aSAndroid Build Coastguard Worker
91*15dc779aSAndroid Build Coastguard Worker for (i = anal_size - 1; i >= 0; i--) {
92*15dc779aSAndroid Build Coastguard Worker x[i] = inp_signal[anal_size - 1 - i];
93*15dc779aSAndroid Build Coastguard Worker }
94*15dc779aSAndroid Build Coastguard Worker
95*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < N; i++) {
96*15dc779aSAndroid Build Coastguard Worker window_output[i] = x[i] * interp_window_coeff[i];
97*15dc779aSAndroid Build Coastguard Worker }
98*15dc779aSAndroid Build Coastguard Worker
99*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 2 * anal_size; i++) {
100*15dc779aSAndroid Build Coastguard Worker accu_r = 0.0;
101*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < 5; j++) {
102*15dc779aSAndroid Build Coastguard Worker accu_r = accu_r + window_output[i + j * 2 * anal_size];
103*15dc779aSAndroid Build Coastguard Worker }
104*15dc779aSAndroid Build Coastguard Worker u[i] = accu_r;
105*15dc779aSAndroid Build Coastguard Worker }
106*15dc779aSAndroid Build Coastguard Worker if (anal_size == 40 || anal_size == 56) {
107*15dc779aSAndroid Build Coastguard Worker for (i = 1; i < anal_size; i++) {
108*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp1 = u[i] + u[2 * anal_size - i];
109*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp2 = u[i] - u[2 * anal_size - i];
110*15dc779aSAndroid Build Coastguard Worker u[i] = temp1;
111*15dc779aSAndroid Build Coastguard Worker u[2 * anal_size - i] = temp2;
112*15dc779aSAndroid Build Coastguard Worker }
113*15dc779aSAndroid Build Coastguard Worker
114*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < anal_size; k++) {
115*15dc779aSAndroid Build Coastguard Worker accu_r = u[anal_size];
116*15dc779aSAndroid Build Coastguard Worker if (k & 1)
117*15dc779aSAndroid Build Coastguard Worker accu_i = u[0];
118*15dc779aSAndroid Build Coastguard Worker else
119*15dc779aSAndroid Build Coastguard Worker accu_i = -u[0];
120*15dc779aSAndroid Build Coastguard Worker for (l = 1; l < anal_size; l++) {
121*15dc779aSAndroid Build Coastguard Worker accu_r = accu_r + u[0 + l] * analy_cos_sin_tab[2 * l + 0];
122*15dc779aSAndroid Build Coastguard Worker accu_i = accu_i + u[2 * anal_size - l] * analy_cos_sin_tab[2 * l + 1];
123*15dc779aSAndroid Build Coastguard Worker }
124*15dc779aSAndroid Build Coastguard Worker analy_cos_sin_tab += (2 * anal_size);
125*15dc779aSAndroid Build Coastguard Worker *anal_buf++ = (FLOAT32)accu_r;
126*15dc779aSAndroid Build Coastguard Worker *anal_buf++ = (FLOAT32)accu_i;
127*15dc779aSAndroid Build Coastguard Worker }
128*15dc779aSAndroid Build Coastguard Worker } else {
129*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_u = u_in;
130*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_v = u_out;
131*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < anal_size * 2; k++) {
132*15dc779aSAndroid Build Coastguard Worker *ptr_u++ = ((*analy_cos_sin_tab++) * u[k]);
133*15dc779aSAndroid Build Coastguard Worker *ptr_u++ = ((*analy_cos_sin_tab++) * u[k]);
134*15dc779aSAndroid Build Coastguard Worker }
135*15dc779aSAndroid Build Coastguard Worker if (ptr_hbe_txposer->ixheaacd_cmplx_anal_fft != NULL)
136*15dc779aSAndroid Build Coastguard Worker (*(ptr_hbe_txposer->ixheaacd_cmplx_anal_fft))(u_in, u_out,
137*15dc779aSAndroid Build Coastguard Worker anal_size * 2);
138*15dc779aSAndroid Build Coastguard Worker else
139*15dc779aSAndroid Build Coastguard Worker return -1;
140*15dc779aSAndroid Build Coastguard Worker
141*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < anal_size / 2; k++) {
142*15dc779aSAndroid Build Coastguard Worker *(anal_buf + 1) = -*ptr_v++;
143*15dc779aSAndroid Build Coastguard Worker *anal_buf = *ptr_v++;
144*15dc779aSAndroid Build Coastguard Worker
145*15dc779aSAndroid Build Coastguard Worker anal_buf += 2;
146*15dc779aSAndroid Build Coastguard Worker
147*15dc779aSAndroid Build Coastguard Worker *(anal_buf + 1) = *ptr_v++;
148*15dc779aSAndroid Build Coastguard Worker *anal_buf = -*ptr_v++;
149*15dc779aSAndroid Build Coastguard Worker
150*15dc779aSAndroid Build Coastguard Worker anal_buf += 2;
151*15dc779aSAndroid Build Coastguard Worker }
152*15dc779aSAndroid Build Coastguard Worker }
153*15dc779aSAndroid Build Coastguard Worker }
154*15dc779aSAndroid Build Coastguard Worker return 0;
155*15dc779aSAndroid Build Coastguard Worker }
156*15dc779aSAndroid Build Coastguard Worker
ixheaacd_real_synth_filt(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,WORD32 num_columns,FLOAT32 qmf_buf_real[][64],FLOAT32 qmf_buf_imag[][64])157*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_real_synth_filt(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
158*15dc779aSAndroid Build Coastguard Worker WORD32 num_columns, FLOAT32 qmf_buf_real[][64],
159*15dc779aSAndroid Build Coastguard Worker FLOAT32 qmf_buf_imag[][64]) {
160*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, k, l, idx;
161*15dc779aSAndroid Build Coastguard Worker FLOAT32 g[640];
162*15dc779aSAndroid Build Coastguard Worker FLOAT32 w[640];
163*15dc779aSAndroid Build Coastguard Worker FLOAT32 synth_out[128];
164*15dc779aSAndroid Build Coastguard Worker FLOAT32 accu_r;
165*15dc779aSAndroid Build Coastguard Worker WORD32 synth_size = ptr_hbe_txposer->synth_size;
166*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_cos_tab_trans_qmf =
167*15dc779aSAndroid Build Coastguard Worker (FLOAT32 *)&ixheaac_cos_table_trans_qmf[0][0] +
168*15dc779aSAndroid Build Coastguard Worker ptr_hbe_txposer->k_start * 32;
169*15dc779aSAndroid Build Coastguard Worker FLOAT32 *buffer = ptr_hbe_txposer->synth_buf;
170*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_inp_buf = ptr_hbe_txposer->ptr_input_buf + ptr_hbe_txposer->ana_fft_size[0];
171*15dc779aSAndroid Build Coastguard Worker
172*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < num_columns; idx++) {
173*15dc779aSAndroid Build Coastguard Worker FLOAT32 loc_qmf_buf[64];
174*15dc779aSAndroid Build Coastguard Worker FLOAT32 *synth_buf_r = loc_qmf_buf;
175*15dc779aSAndroid Build Coastguard Worker FLOAT32 *out_buf;
176*15dc779aSAndroid Build Coastguard Worker if (ptr_hbe_txposer->esbr_hq == 1) {
177*15dc779aSAndroid Build Coastguard Worker out_buf = ptr_inp_buf +
178*15dc779aSAndroid Build Coastguard Worker (idx - 1) * ptr_hbe_txposer->synth_size;
179*15dc779aSAndroid Build Coastguard Worker } else {
180*15dc779aSAndroid Build Coastguard Worker out_buf = ptr_hbe_txposer->ptr_input_buf +
181*15dc779aSAndroid Build Coastguard Worker (idx + 1) * ptr_hbe_txposer->synth_size;
182*15dc779aSAndroid Build Coastguard Worker }
183*15dc779aSAndroid Build Coastguard Worker FLOAT32 *synth_cos_tab = ptr_hbe_txposer->synth_cos_tab;
184*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *interp_window_coeff = ptr_hbe_txposer->synth_wind_coeff;
185*15dc779aSAndroid Build Coastguard Worker if (ptr_hbe_txposer->k_start < 0) return -1;
186*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < synth_size; k++) {
187*15dc779aSAndroid Build Coastguard Worker WORD32 ki = ptr_hbe_txposer->k_start + k;
188*15dc779aSAndroid Build Coastguard Worker synth_buf_r[k] = (FLOAT32)(
189*15dc779aSAndroid Build Coastguard Worker ptr_cos_tab_trans_qmf[(k << 1) + 0] * qmf_buf_real[idx][ki] +
190*15dc779aSAndroid Build Coastguard Worker ptr_cos_tab_trans_qmf[(k << 1) + 1] * qmf_buf_imag[idx][ki]);
191*15dc779aSAndroid Build Coastguard Worker
192*15dc779aSAndroid Build Coastguard Worker synth_buf_r[k + ptr_hbe_txposer->synth_size] = 0;
193*15dc779aSAndroid Build Coastguard Worker }
194*15dc779aSAndroid Build Coastguard Worker
195*15dc779aSAndroid Build Coastguard Worker for (l = (20 * synth_size - 1); l >= 2 * synth_size; l--) {
196*15dc779aSAndroid Build Coastguard Worker buffer[l] = buffer[l - 2 * synth_size];
197*15dc779aSAndroid Build Coastguard Worker }
198*15dc779aSAndroid Build Coastguard Worker
199*15dc779aSAndroid Build Coastguard Worker if (synth_size == 20) {
200*15dc779aSAndroid Build Coastguard Worker FLOAT32 *psynth_cos_tab = synth_cos_tab;
201*15dc779aSAndroid Build Coastguard Worker
202*15dc779aSAndroid Build Coastguard Worker for (l = 0; l < (synth_size + 1); l++) {
203*15dc779aSAndroid Build Coastguard Worker accu_r = 0.0;
204*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < synth_size; k++) {
205*15dc779aSAndroid Build Coastguard Worker accu_r += synth_buf_r[k] * psynth_cos_tab[k];
206*15dc779aSAndroid Build Coastguard Worker }
207*15dc779aSAndroid Build Coastguard Worker buffer[0 + l] = accu_r;
208*15dc779aSAndroid Build Coastguard Worker buffer[synth_size - l] = accu_r;
209*15dc779aSAndroid Build Coastguard Worker psynth_cos_tab = psynth_cos_tab + synth_size;
210*15dc779aSAndroid Build Coastguard Worker }
211*15dc779aSAndroid Build Coastguard Worker for (l = (synth_size + 1); l < (2 * synth_size - synth_size / 2); l++) {
212*15dc779aSAndroid Build Coastguard Worker accu_r = 0.0;
213*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < synth_size; k++) {
214*15dc779aSAndroid Build Coastguard Worker accu_r += synth_buf_r[k] * psynth_cos_tab[k];
215*15dc779aSAndroid Build Coastguard Worker }
216*15dc779aSAndroid Build Coastguard Worker buffer[0 + l] = accu_r;
217*15dc779aSAndroid Build Coastguard Worker buffer[3 * synth_size - l] = -accu_r;
218*15dc779aSAndroid Build Coastguard Worker psynth_cos_tab = psynth_cos_tab + synth_size;
219*15dc779aSAndroid Build Coastguard Worker }
220*15dc779aSAndroid Build Coastguard Worker accu_r = 0.0;
221*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < synth_size; k++) {
222*15dc779aSAndroid Build Coastguard Worker accu_r += synth_buf_r[k] * psynth_cos_tab[k];
223*15dc779aSAndroid Build Coastguard Worker }
224*15dc779aSAndroid Build Coastguard Worker buffer[3 * synth_size >> 1] = accu_r;
225*15dc779aSAndroid Build Coastguard Worker } else {
226*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp;
227*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_u = synth_out;
228*15dc779aSAndroid Build Coastguard Worker WORD32 kmax = (synth_size >> 1);
229*15dc779aSAndroid Build Coastguard Worker FLOAT32 *syn_buf = &buffer[kmax];
230*15dc779aSAndroid Build Coastguard Worker kmax += synth_size;
231*15dc779aSAndroid Build Coastguard Worker
232*15dc779aSAndroid Build Coastguard Worker if (ptr_hbe_txposer->ixheaacd_real_synth_fft != NULL)
233*15dc779aSAndroid Build Coastguard Worker (*(ptr_hbe_txposer->ixheaacd_real_synth_fft))(synth_buf_r, synth_out,
234*15dc779aSAndroid Build Coastguard Worker synth_size * 2);
235*15dc779aSAndroid Build Coastguard Worker else
236*15dc779aSAndroid Build Coastguard Worker return -1;
237*15dc779aSAndroid Build Coastguard Worker
238*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < kmax; k++) {
239*15dc779aSAndroid Build Coastguard Worker tmp = ((*ptr_u++) * (*synth_cos_tab++));
240*15dc779aSAndroid Build Coastguard Worker tmp -= ((*ptr_u++) * (*synth_cos_tab++));
241*15dc779aSAndroid Build Coastguard Worker *syn_buf++ = tmp;
242*15dc779aSAndroid Build Coastguard Worker }
243*15dc779aSAndroid Build Coastguard Worker
244*15dc779aSAndroid Build Coastguard Worker syn_buf = &buffer[0];
245*15dc779aSAndroid Build Coastguard Worker kmax -= synth_size;
246*15dc779aSAndroid Build Coastguard Worker
247*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < kmax; k++) {
248*15dc779aSAndroid Build Coastguard Worker tmp = ((*ptr_u++) * (*synth_cos_tab++));
249*15dc779aSAndroid Build Coastguard Worker tmp -= ((*ptr_u++) * (*synth_cos_tab++));
250*15dc779aSAndroid Build Coastguard Worker *syn_buf++ = tmp;
251*15dc779aSAndroid Build Coastguard Worker }
252*15dc779aSAndroid Build Coastguard Worker }
253*15dc779aSAndroid Build Coastguard Worker
254*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 5; i++) {
255*15dc779aSAndroid Build Coastguard Worker memcpy(&g[(2 * i + 0) * synth_size], &buffer[(4 * i + 0) * synth_size],
256*15dc779aSAndroid Build Coastguard Worker sizeof(FLOAT32) * synth_size);
257*15dc779aSAndroid Build Coastguard Worker memcpy(&g[(2 * i + 1) * synth_size], &buffer[(4 * i + 3) * synth_size],
258*15dc779aSAndroid Build Coastguard Worker sizeof(FLOAT32) * synth_size);
259*15dc779aSAndroid Build Coastguard Worker }
260*15dc779aSAndroid Build Coastguard Worker
261*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < 10 * synth_size; k++) {
262*15dc779aSAndroid Build Coastguard Worker w[k] = g[k] * interp_window_coeff[k];
263*15dc779aSAndroid Build Coastguard Worker }
264*15dc779aSAndroid Build Coastguard Worker
265*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < synth_size; i++) {
266*15dc779aSAndroid Build Coastguard Worker accu_r = 0.0;
267*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < 10; j++) {
268*15dc779aSAndroid Build Coastguard Worker accu_r = accu_r + w[synth_size * j + i];
269*15dc779aSAndroid Build Coastguard Worker }
270*15dc779aSAndroid Build Coastguard Worker out_buf[i] = (FLOAT32)accu_r;
271*15dc779aSAndroid Build Coastguard Worker }
272*15dc779aSAndroid Build Coastguard Worker }
273*15dc779aSAndroid Build Coastguard Worker return 0;
274*15dc779aSAndroid Build Coastguard Worker }
275*15dc779aSAndroid Build Coastguard Worker
ixheaacd_dft_hbe_cplx_anal_filt(ia_esbr_hbe_txposer_struct * ptr_hbe_txposer,FLOAT32 qmf_buf_real[][64],FLOAT32 qmf_buf_imag[][64])276*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_dft_hbe_cplx_anal_filt(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer,
277*15dc779aSAndroid Build Coastguard Worker FLOAT32 qmf_buf_real[][64],
278*15dc779aSAndroid Build Coastguard Worker FLOAT32 qmf_buf_imag[][64]) {
279*15dc779aSAndroid Build Coastguard Worker WORD32 idx;
280*15dc779aSAndroid Build Coastguard Worker
281*15dc779aSAndroid Build Coastguard Worker WORD32 anal_size = ptr_hbe_txposer->analy_size;
282*15dc779aSAndroid Build Coastguard Worker
283*15dc779aSAndroid Build Coastguard Worker WORD32 N = (10 * ptr_hbe_txposer->analy_size);
284*15dc779aSAndroid Build Coastguard Worker
285*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < ptr_hbe_txposer->no_bins; idx++) {
286*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, k, l;
287*15dc779aSAndroid Build Coastguard Worker FLOAT32 window_output[640];
288*15dc779aSAndroid Build Coastguard Worker FLOAT32 u[128];
289*15dc779aSAndroid Build Coastguard Worker FLOAT32 accu_r, accu_i;
290*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *inp_signal;
291*15dc779aSAndroid Build Coastguard Worker FLOAT32 *qmf_buf_r = &qmf_buf_real[idx][ptr_hbe_txposer->a_start];
292*15dc779aSAndroid Build Coastguard Worker FLOAT32 *qmf_buf_i = &qmf_buf_imag[idx][ptr_hbe_txposer->a_start];
293*15dc779aSAndroid Build Coastguard Worker
294*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *interp_window_coeff = ptr_hbe_txposer->analy_wind_coeff;
295*15dc779aSAndroid Build Coastguard Worker FLOAT32 *x = ptr_hbe_txposer->analy_buf;
296*15dc779aSAndroid Build Coastguard Worker
297*15dc779aSAndroid Build Coastguard Worker memset(&qmf_buf_real[idx][ptr_hbe_txposer->a_start], 0,
298*15dc779aSAndroid Build Coastguard Worker (NO_QMF_SYNTH_CHANNELS - ptr_hbe_txposer->a_start) *
299*15dc779aSAndroid Build Coastguard Worker sizeof(qmf_buf_real[idx][ptr_hbe_txposer->a_start]));
300*15dc779aSAndroid Build Coastguard Worker memset(&qmf_buf_imag[idx][ptr_hbe_txposer->a_start], 0,
301*15dc779aSAndroid Build Coastguard Worker TWICE_QMF_SYNTH_CHANNELS_NUM * sizeof(qmf_buf_imag[idx][ptr_hbe_txposer->a_start]));
302*15dc779aSAndroid Build Coastguard Worker
303*15dc779aSAndroid Build Coastguard Worker inp_signal = ptr_hbe_txposer->ptr_output_buf +
304*15dc779aSAndroid Build Coastguard Worker idx * ptr_hbe_txposer->analy_size + 1;
305*15dc779aSAndroid Build Coastguard Worker
306*15dc779aSAndroid Build Coastguard Worker for (i = N - 1; i >= anal_size; i--) {
307*15dc779aSAndroid Build Coastguard Worker x[i] = x[i - anal_size];
308*15dc779aSAndroid Build Coastguard Worker }
309*15dc779aSAndroid Build Coastguard Worker
310*15dc779aSAndroid Build Coastguard Worker for (i = anal_size - 1; i >= 0; i--) {
311*15dc779aSAndroid Build Coastguard Worker x[i] = inp_signal[anal_size - 1 - i];
312*15dc779aSAndroid Build Coastguard Worker }
313*15dc779aSAndroid Build Coastguard Worker
314*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < N; i++) {
315*15dc779aSAndroid Build Coastguard Worker window_output[i] = x[i] * interp_window_coeff[i];
316*15dc779aSAndroid Build Coastguard Worker }
317*15dc779aSAndroid Build Coastguard Worker
318*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 2 * anal_size; i++) {
319*15dc779aSAndroid Build Coastguard Worker accu_r = 0.0;
320*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < 5; j++) {
321*15dc779aSAndroid Build Coastguard Worker accu_r = accu_r + window_output[i + j * 2 * anal_size];
322*15dc779aSAndroid Build Coastguard Worker }
323*15dc779aSAndroid Build Coastguard Worker u[i] = accu_r;
324*15dc779aSAndroid Build Coastguard Worker }
325*15dc779aSAndroid Build Coastguard Worker
326*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < anal_size; k++) {
327*15dc779aSAndroid Build Coastguard Worker accu_r = 0;
328*15dc779aSAndroid Build Coastguard Worker accu_i = 0;
329*15dc779aSAndroid Build Coastguard Worker for (l = 0; l < 2 * anal_size; l++) {
330*15dc779aSAndroid Build Coastguard Worker accu_r = accu_r + u[l] * ptr_hbe_txposer->str_dft_hbe_anal_coeff.real[k][l];
331*15dc779aSAndroid Build Coastguard Worker accu_i = accu_i + u[l] * ptr_hbe_txposer->str_dft_hbe_anal_coeff.imag[k][l];
332*15dc779aSAndroid Build Coastguard Worker }
333*15dc779aSAndroid Build Coastguard Worker qmf_buf_r[k] = (FLOAT32)accu_r;
334*15dc779aSAndroid Build Coastguard Worker qmf_buf_i[k] = (FLOAT32)accu_i;
335*15dc779aSAndroid Build Coastguard Worker }
336*15dc779aSAndroid Build Coastguard Worker }
337*15dc779aSAndroid Build Coastguard Worker return 0;
338*15dc779aSAndroid Build Coastguard Worker }
339