xref: /aosp_15_r20/external/libxaac/encoder/ixheaace_sbr_hbe_polyphase.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2023 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 "ixheaac_type_def.h"
21*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
24*15dc779aSAndroid Build Coastguard Worker 
25*15dc779aSAndroid Build Coastguard Worker #include "iusace_tns_usac.h"
26*15dc779aSAndroid Build Coastguard Worker #include "iusace_cnst.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_def.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_resampler.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_hbe.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_hbe_fft.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_esbr_rom.h"
32*15dc779aSAndroid Build Coastguard Worker #include <string.h>
33*15dc779aSAndroid Build Coastguard Worker 
ixheaace_complex_anal_filt(ixheaace_str_esbr_hbe_txposer * ptr_hbe_txposer)34*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaace_complex_anal_filt(ixheaace_str_esbr_hbe_txposer *ptr_hbe_txposer) {
35*15dc779aSAndroid Build Coastguard Worker   WORD32 idx;
36*15dc779aSAndroid Build Coastguard Worker   WORD32 anal_size = 2 * ptr_hbe_txposer->synth_size;
37*15dc779aSAndroid Build Coastguard Worker   WORD32 N = (10 * anal_size);
38*15dc779aSAndroid Build Coastguard Worker 
39*15dc779aSAndroid Build Coastguard Worker   WORD32 no_bins = ptr_hbe_txposer->no_bins >> 1;
40*15dc779aSAndroid Build Coastguard Worker 
41*15dc779aSAndroid Build Coastguard Worker   if (ptr_hbe_txposer->esbr_hq != 0) {
42*15dc779aSAndroid Build Coastguard Worker     anal_size = 2 * ptr_hbe_txposer->analy_size;
43*15dc779aSAndroid Build Coastguard Worker     no_bins = ptr_hbe_txposer->no_bins;
44*15dc779aSAndroid Build Coastguard Worker   }
45*15dc779aSAndroid Build Coastguard Worker 
46*15dc779aSAndroid Build Coastguard Worker   idx = 0;
47*15dc779aSAndroid Build Coastguard Worker   while (idx < no_bins) {
48*15dc779aSAndroid Build Coastguard Worker     WORD32 i, j, k, l;
49*15dc779aSAndroid Build Coastguard Worker     FLOAT32 window_output[640] = {0};
50*15dc779aSAndroid Build Coastguard Worker     FLOAT32 u[128] = {0}, u_in[256] = {0}, u_out[256] = {0};
51*15dc779aSAndroid Build Coastguard Worker     FLOAT32 accu_r, accu_i;
52*15dc779aSAndroid Build Coastguard Worker     const FLOAT32 *ptr_inp_signal;
53*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_anal_buf;
54*15dc779aSAndroid Build Coastguard Worker 
55*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_analy_cos_sin_tab = ptr_hbe_txposer->ptr_analy_cos_sin_tab;
56*15dc779aSAndroid Build Coastguard Worker     const FLOAT32 *ptr_interp_window_coeff = ptr_hbe_txposer->ptr_ana_win_coeff;
57*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_x = ptr_hbe_txposer->analy_buf;
58*15dc779aSAndroid Build Coastguard Worker 
59*15dc779aSAndroid Build Coastguard Worker     if (ptr_hbe_txposer->esbr_hq != 0) {
60*15dc779aSAndroid Build Coastguard Worker       memset(ptr_hbe_txposer->qmf_in_buf[idx], 0, sizeof(ptr_hbe_txposer->qmf_in_buf[idx]));
61*15dc779aSAndroid Build Coastguard Worker       ptr_inp_signal = ptr_hbe_txposer->ptr_output_buf + idx * ptr_hbe_txposer->analy_size + 1;
62*15dc779aSAndroid Build Coastguard Worker       ptr_anal_buf = &ptr_hbe_txposer->qmf_in_buf[idx][4 * ptr_hbe_txposer->a_start];
63*15dc779aSAndroid Build Coastguard Worker     } else {
64*15dc779aSAndroid Build Coastguard Worker       memset(ptr_hbe_txposer->qmf_in_buf[idx + IXHEAACE_HBE_OPER_WIN_LEN - 1], 0,
65*15dc779aSAndroid Build Coastguard Worker              sizeof(ptr_hbe_txposer->qmf_in_buf[idx + IXHEAACE_HBE_OPER_WIN_LEN - 1]));
66*15dc779aSAndroid Build Coastguard Worker 
67*15dc779aSAndroid Build Coastguard Worker       ptr_inp_signal = ptr_hbe_txposer->ptr_input_buf + idx * 2 * ptr_hbe_txposer->synth_size + 1;
68*15dc779aSAndroid Build Coastguard Worker       ptr_anal_buf =
69*15dc779aSAndroid Build Coastguard Worker           &ptr_hbe_txposer
70*15dc779aSAndroid Build Coastguard Worker                ->qmf_in_buf[idx + IXHEAACE_HBE_OPER_WIN_LEN - 1][4 * ptr_hbe_txposer->k_start];
71*15dc779aSAndroid Build Coastguard Worker     }
72*15dc779aSAndroid Build Coastguard Worker 
73*15dc779aSAndroid Build Coastguard Worker     for (i = N - 1; i >= anal_size; i--) {
74*15dc779aSAndroid Build Coastguard Worker       ptr_x[i] = ptr_x[i - anal_size];
75*15dc779aSAndroid Build Coastguard Worker     }
76*15dc779aSAndroid Build Coastguard Worker 
77*15dc779aSAndroid Build Coastguard Worker     for (i = anal_size - 1; i >= 0; i--) {
78*15dc779aSAndroid Build Coastguard Worker       ptr_x[i] = ptr_inp_signal[anal_size - 1 - i];
79*15dc779aSAndroid Build Coastguard Worker     }
80*15dc779aSAndroid Build Coastguard Worker 
81*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < N; i++) {
82*15dc779aSAndroid Build Coastguard Worker       window_output[i] = ptr_x[i] * ptr_interp_window_coeff[i];
83*15dc779aSAndroid Build Coastguard Worker     }
84*15dc779aSAndroid Build Coastguard Worker 
85*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 2 * anal_size; i++) {
86*15dc779aSAndroid Build Coastguard Worker       accu_r = 0.0;
87*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j < 5; j++) {
88*15dc779aSAndroid Build Coastguard Worker         accu_r = accu_r + window_output[i + j * 2 * anal_size];
89*15dc779aSAndroid Build Coastguard Worker       }
90*15dc779aSAndroid Build Coastguard Worker       u[i] = accu_r;
91*15dc779aSAndroid Build Coastguard Worker     }
92*15dc779aSAndroid Build Coastguard Worker     if (anal_size == 40 || anal_size == 56) {
93*15dc779aSAndroid Build Coastguard Worker       for (i = 1; i < anal_size; i++) {
94*15dc779aSAndroid Build Coastguard Worker         FLOAT32 temp1 = u[i] + u[2 * anal_size - i];
95*15dc779aSAndroid Build Coastguard Worker         FLOAT32 temp2 = u[i] - u[2 * anal_size - i];
96*15dc779aSAndroid Build Coastguard Worker         u[i] = temp1;
97*15dc779aSAndroid Build Coastguard Worker         u[2 * anal_size - i] = temp2;
98*15dc779aSAndroid Build Coastguard Worker       }
99*15dc779aSAndroid Build Coastguard Worker 
100*15dc779aSAndroid Build Coastguard Worker       k = 0;
101*15dc779aSAndroid Build Coastguard Worker       while (k < anal_size) {
102*15dc779aSAndroid Build Coastguard Worker         accu_r = u[anal_size];
103*15dc779aSAndroid Build Coastguard Worker         if (k & 1)
104*15dc779aSAndroid Build Coastguard Worker           accu_i = u[0];
105*15dc779aSAndroid Build Coastguard Worker         else
106*15dc779aSAndroid Build Coastguard Worker           accu_i = -u[0];
107*15dc779aSAndroid Build Coastguard Worker         for (l = 1; l < anal_size; l++) {
108*15dc779aSAndroid Build Coastguard Worker           accu_r = accu_r + u[0 + l] * ptr_analy_cos_sin_tab[2 * l + 0];
109*15dc779aSAndroid Build Coastguard Worker           accu_i = accu_i + u[2 * anal_size - l] * ptr_analy_cos_sin_tab[2 * l + 1];
110*15dc779aSAndroid Build Coastguard Worker         }
111*15dc779aSAndroid Build Coastguard Worker         ptr_analy_cos_sin_tab += (2 * anal_size);
112*15dc779aSAndroid Build Coastguard Worker         *ptr_anal_buf++ = (FLOAT32)accu_r;
113*15dc779aSAndroid Build Coastguard Worker         *ptr_anal_buf++ = (FLOAT32)accu_i;
114*15dc779aSAndroid Build Coastguard Worker         k++;
115*15dc779aSAndroid Build Coastguard Worker       }
116*15dc779aSAndroid Build Coastguard Worker     } else {
117*15dc779aSAndroid Build Coastguard Worker       FLOAT32 *ptr_u = u_in;
118*15dc779aSAndroid Build Coastguard Worker       FLOAT32 *ptr_v = u_out;
119*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < anal_size * 2; k++) {
120*15dc779aSAndroid Build Coastguard Worker         *ptr_u++ = ((*ptr_analy_cos_sin_tab++) * u[k]);
121*15dc779aSAndroid Build Coastguard Worker         *ptr_u++ = ((*ptr_analy_cos_sin_tab++) * u[k]);
122*15dc779aSAndroid Build Coastguard Worker       }
123*15dc779aSAndroid Build Coastguard Worker       if (ptr_hbe_txposer->ixheaace_cmplx_anal_fft != NULL) {
124*15dc779aSAndroid Build Coastguard Worker         (*(ptr_hbe_txposer->ixheaace_cmplx_anal_fft))(u_in, u_out, anal_size * 2);
125*15dc779aSAndroid Build Coastguard Worker       } else {
126*15dc779aSAndroid Build Coastguard Worker         return IA_EXHEAACE_EXE_NONFATAL_ESBR_INVALID_FFT;
127*15dc779aSAndroid Build Coastguard Worker       }
128*15dc779aSAndroid Build Coastguard Worker 
129*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < anal_size / 2; k++) {
130*15dc779aSAndroid Build Coastguard Worker         *(ptr_anal_buf + 1) = -*ptr_v++;
131*15dc779aSAndroid Build Coastguard Worker         *ptr_anal_buf = *ptr_v++;
132*15dc779aSAndroid Build Coastguard Worker 
133*15dc779aSAndroid Build Coastguard Worker         ptr_anal_buf += 2;
134*15dc779aSAndroid Build Coastguard Worker 
135*15dc779aSAndroid Build Coastguard Worker         *(ptr_anal_buf + 1) = *ptr_v++;
136*15dc779aSAndroid Build Coastguard Worker         *ptr_anal_buf = -*ptr_v++;
137*15dc779aSAndroid Build Coastguard Worker 
138*15dc779aSAndroid Build Coastguard Worker         ptr_anal_buf += 2;
139*15dc779aSAndroid Build Coastguard Worker       }
140*15dc779aSAndroid Build Coastguard Worker     }
141*15dc779aSAndroid Build Coastguard Worker     idx++;
142*15dc779aSAndroid Build Coastguard Worker   }
143*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
144*15dc779aSAndroid Build Coastguard Worker }
145*15dc779aSAndroid Build Coastguard Worker 
ixheaace_real_synth_filt(ixheaace_str_esbr_hbe_txposer * ptr_hbe_txposer,WORD32 num_columns,FLOAT32 qmf_buf_real[][64],FLOAT32 qmf_buf_imag[][64])146*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaace_real_synth_filt(ixheaace_str_esbr_hbe_txposer *ptr_hbe_txposer,
147*15dc779aSAndroid Build Coastguard Worker                                       WORD32 num_columns, FLOAT32 qmf_buf_real[][64],
148*15dc779aSAndroid Build Coastguard Worker                                       FLOAT32 qmf_buf_imag[][64]) {
149*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j, k, l, idx;
150*15dc779aSAndroid Build Coastguard Worker   FLOAT32 g[640];
151*15dc779aSAndroid Build Coastguard Worker   FLOAT32 w[640];
152*15dc779aSAndroid Build Coastguard Worker   FLOAT32 synth_out[128];
153*15dc779aSAndroid Build Coastguard Worker   FLOAT32 accu_r;
154*15dc779aSAndroid Build Coastguard Worker   WORD32 synth_size = ptr_hbe_txposer->synth_size;
155*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_cos_tab_trans_qmf =
156*15dc779aSAndroid Build Coastguard Worker       (FLOAT32 *)&ixheaac_cos_table_trans_qmf[0][0] + ptr_hbe_txposer->k_start * 32;
157*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_buffer = ptr_hbe_txposer->synth_buf;
158*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_inp_buf = ptr_hbe_txposer->ptr_input_buf + ptr_hbe_txposer->ana_fft_size[0];
159*15dc779aSAndroid Build Coastguard Worker 
160*15dc779aSAndroid Build Coastguard Worker   for (idx = 0; idx < num_columns; idx++) {
161*15dc779aSAndroid Build Coastguard Worker     FLOAT32 loc_qmf_buf[64];
162*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_synth_buf_r = loc_qmf_buf;
163*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_out_buf;
164*15dc779aSAndroid Build Coastguard Worker     if (ptr_hbe_txposer->esbr_hq == 1) {
165*15dc779aSAndroid Build Coastguard Worker       ptr_out_buf = ptr_inp_buf + (idx - 1) * ptr_hbe_txposer->synth_size;
166*15dc779aSAndroid Build Coastguard Worker     } else {
167*15dc779aSAndroid Build Coastguard Worker       ptr_out_buf = ptr_hbe_txposer->ptr_input_buf + (idx + 1) * ptr_hbe_txposer->synth_size;
168*15dc779aSAndroid Build Coastguard Worker     }
169*15dc779aSAndroid Build Coastguard Worker 
170*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_synth_cos_tab = ptr_hbe_txposer->ptr_syn_cos_tab;
171*15dc779aSAndroid Build Coastguard Worker     const FLOAT32 *ptr_interp_window_coeff = ptr_hbe_txposer->ptr_syn_win_coeff;
172*15dc779aSAndroid Build Coastguard Worker     if (ptr_hbe_txposer->k_start < 0) {
173*15dc779aSAndroid Build Coastguard Worker       return IA_EXHEAACE_EXE_NONFATAL_ESBR_INVALID_START_BAND;
174*15dc779aSAndroid Build Coastguard Worker     }
175*15dc779aSAndroid Build Coastguard Worker 
176*15dc779aSAndroid Build Coastguard Worker     k = 0;
177*15dc779aSAndroid Build Coastguard Worker     while (k < synth_size) {
178*15dc779aSAndroid Build Coastguard Worker       WORD32 ki = ptr_hbe_txposer->k_start + k;
179*15dc779aSAndroid Build Coastguard Worker       ptr_synth_buf_r[k] = (FLOAT32)(ptr_cos_tab_trans_qmf[(k << 1) + 0] * qmf_buf_real[idx][ki] +
180*15dc779aSAndroid Build Coastguard Worker                                      ptr_cos_tab_trans_qmf[(k << 1) + 1] * qmf_buf_imag[idx][ki]);
181*15dc779aSAndroid Build Coastguard Worker 
182*15dc779aSAndroid Build Coastguard Worker       ptr_synth_buf_r[k + ptr_hbe_txposer->synth_size] = 0;
183*15dc779aSAndroid Build Coastguard Worker       k++;
184*15dc779aSAndroid Build Coastguard Worker     }
185*15dc779aSAndroid Build Coastguard Worker 
186*15dc779aSAndroid Build Coastguard Worker     for (l = (20 * synth_size - 1); l >= 2 * synth_size; l--) {
187*15dc779aSAndroid Build Coastguard Worker       ptr_buffer[l] = ptr_buffer[l - 2 * synth_size];
188*15dc779aSAndroid Build Coastguard Worker     }
189*15dc779aSAndroid Build Coastguard Worker 
190*15dc779aSAndroid Build Coastguard Worker     if (synth_size == 20) {
191*15dc779aSAndroid Build Coastguard Worker       FLOAT32 *ptr_psynth_cos_tab = ptr_synth_cos_tab;
192*15dc779aSAndroid Build Coastguard Worker 
193*15dc779aSAndroid Build Coastguard Worker       for (l = 0; l < (synth_size + 1); l++) {
194*15dc779aSAndroid Build Coastguard Worker         accu_r = 0.0;
195*15dc779aSAndroid Build Coastguard Worker         for (k = 0; k < synth_size; k++) {
196*15dc779aSAndroid Build Coastguard Worker           accu_r += ptr_synth_buf_r[k] * ptr_psynth_cos_tab[k];
197*15dc779aSAndroid Build Coastguard Worker         }
198*15dc779aSAndroid Build Coastguard Worker         ptr_buffer[0 + l] = accu_r;
199*15dc779aSAndroid Build Coastguard Worker         ptr_buffer[synth_size - l] = accu_r;
200*15dc779aSAndroid Build Coastguard Worker         ptr_psynth_cos_tab = ptr_psynth_cos_tab + synth_size;
201*15dc779aSAndroid Build Coastguard Worker       }
202*15dc779aSAndroid Build Coastguard Worker       for (l = (synth_size + 1); l < (2 * synth_size - synth_size / 2); 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 += ptr_synth_buf_r[k] * ptr_psynth_cos_tab[k];
206*15dc779aSAndroid Build Coastguard Worker         }
207*15dc779aSAndroid Build Coastguard Worker         ptr_buffer[0 + l] = accu_r;
208*15dc779aSAndroid Build Coastguard Worker         ptr_buffer[3 * synth_size - l] = -accu_r;
209*15dc779aSAndroid Build Coastguard Worker         ptr_psynth_cos_tab = ptr_psynth_cos_tab + synth_size;
210*15dc779aSAndroid Build Coastguard Worker       }
211*15dc779aSAndroid Build Coastguard Worker       accu_r = 0.0;
212*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < synth_size; k++) {
213*15dc779aSAndroid Build Coastguard Worker         accu_r += ptr_synth_buf_r[k] * ptr_psynth_cos_tab[k];
214*15dc779aSAndroid Build Coastguard Worker       }
215*15dc779aSAndroid Build Coastguard Worker       ptr_buffer[3 * synth_size >> 1] = accu_r;
216*15dc779aSAndroid Build Coastguard Worker     } else {
217*15dc779aSAndroid Build Coastguard Worker       FLOAT32 tmp;
218*15dc779aSAndroid Build Coastguard Worker       FLOAT32 *ptr_u = synth_out;
219*15dc779aSAndroid Build Coastguard Worker       WORD32 kmax = (synth_size >> 1);
220*15dc779aSAndroid Build Coastguard Worker       FLOAT32 *ptr_syn_buf = &ptr_buffer[kmax];
221*15dc779aSAndroid Build Coastguard Worker       kmax += synth_size;
222*15dc779aSAndroid Build Coastguard Worker 
223*15dc779aSAndroid Build Coastguard Worker       if (ptr_hbe_txposer->ixheaace_real_synth_fft != NULL) {
224*15dc779aSAndroid Build Coastguard Worker         (*(ptr_hbe_txposer->ixheaace_real_synth_fft))(ptr_synth_buf_r, synth_out, synth_size * 2);
225*15dc779aSAndroid Build Coastguard Worker       } else {
226*15dc779aSAndroid Build Coastguard Worker         return IA_EXHEAACE_EXE_NONFATAL_ESBR_INVALID_FFT;
227*15dc779aSAndroid Build Coastguard Worker       }
228*15dc779aSAndroid Build Coastguard Worker 
229*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < kmax; k++) {
230*15dc779aSAndroid Build Coastguard Worker         tmp = ((*ptr_u++) * (*ptr_synth_cos_tab++));
231*15dc779aSAndroid Build Coastguard Worker         tmp -= ((*ptr_u++) * (*ptr_synth_cos_tab++));
232*15dc779aSAndroid Build Coastguard Worker         *ptr_syn_buf++ = tmp;
233*15dc779aSAndroid Build Coastguard Worker       }
234*15dc779aSAndroid Build Coastguard Worker 
235*15dc779aSAndroid Build Coastguard Worker       ptr_syn_buf = &ptr_buffer[0];
236*15dc779aSAndroid Build Coastguard Worker       kmax -= synth_size;
237*15dc779aSAndroid Build Coastguard Worker 
238*15dc779aSAndroid Build Coastguard Worker       for (k = 0; k < kmax; k++) {
239*15dc779aSAndroid Build Coastguard Worker         tmp = ((*ptr_u++) * (*ptr_synth_cos_tab++));
240*15dc779aSAndroid Build Coastguard Worker         tmp -= ((*ptr_u++) * (*ptr_synth_cos_tab++));
241*15dc779aSAndroid Build Coastguard Worker         *ptr_syn_buf++ = tmp;
242*15dc779aSAndroid Build Coastguard Worker       }
243*15dc779aSAndroid Build Coastguard Worker     }
244*15dc779aSAndroid Build Coastguard Worker 
245*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 5; i++) {
246*15dc779aSAndroid Build Coastguard Worker       memcpy(&g[(2 * i + 0) * synth_size], &ptr_buffer[(4 * i + 0) * synth_size],
247*15dc779aSAndroid Build Coastguard Worker              sizeof(g[0]) * synth_size);
248*15dc779aSAndroid Build Coastguard Worker       memcpy(&g[(2 * i + 1) * synth_size], &ptr_buffer[(4 * i + 3) * synth_size],
249*15dc779aSAndroid Build Coastguard Worker              sizeof(g[0]) * synth_size);
250*15dc779aSAndroid Build Coastguard Worker     }
251*15dc779aSAndroid Build Coastguard Worker 
252*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < 10 * synth_size; k++) {
253*15dc779aSAndroid Build Coastguard Worker       w[k] = g[k] * ptr_interp_window_coeff[k];
254*15dc779aSAndroid Build Coastguard Worker     }
255*15dc779aSAndroid Build Coastguard Worker 
256*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < synth_size; i++) {
257*15dc779aSAndroid Build Coastguard Worker       accu_r = 0.0;
258*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j < 10; j++) {
259*15dc779aSAndroid Build Coastguard Worker         accu_r = accu_r + w[synth_size * j + i];
260*15dc779aSAndroid Build Coastguard Worker       }
261*15dc779aSAndroid Build Coastguard Worker       ptr_out_buf[i] = (FLOAT32)accu_r;
262*15dc779aSAndroid Build Coastguard Worker     }
263*15dc779aSAndroid Build Coastguard Worker   }
264*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
265*15dc779aSAndroid Build Coastguard Worker }
266*15dc779aSAndroid Build Coastguard Worker 
ixheaace_dft_hbe_cplx_anal_filt(ixheaace_str_esbr_hbe_txposer * ptr_hbe_txposer,FLOAT32 qmf_buf_real[][64],FLOAT32 qmf_buf_imag[][64])267*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_dft_hbe_cplx_anal_filt(ixheaace_str_esbr_hbe_txposer *ptr_hbe_txposer,
268*15dc779aSAndroid Build Coastguard Worker                                      FLOAT32 qmf_buf_real[][64], FLOAT32 qmf_buf_imag[][64]) {
269*15dc779aSAndroid Build Coastguard Worker   WORD32 idx;
270*15dc779aSAndroid Build Coastguard Worker 
271*15dc779aSAndroid Build Coastguard Worker   WORD32 anal_size = ptr_hbe_txposer->analy_size;
272*15dc779aSAndroid Build Coastguard Worker 
273*15dc779aSAndroid Build Coastguard Worker   WORD32 N = (10 * ptr_hbe_txposer->analy_size);
274*15dc779aSAndroid Build Coastguard Worker 
275*15dc779aSAndroid Build Coastguard Worker   idx = 0;
276*15dc779aSAndroid Build Coastguard Worker   while (idx < ptr_hbe_txposer->no_bins) {
277*15dc779aSAndroid Build Coastguard Worker     WORD32 i, j, k, l;
278*15dc779aSAndroid Build Coastguard Worker     FLOAT32 window_output[640] = {0};
279*15dc779aSAndroid Build Coastguard Worker     FLOAT32 u[128] = {0};
280*15dc779aSAndroid Build Coastguard Worker     FLOAT32 accu_r, accu_i;
281*15dc779aSAndroid Build Coastguard Worker     const FLOAT32 *ptr_inp_signal;
282*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_qmf_buf_r = &qmf_buf_real[idx][ptr_hbe_txposer->a_start];
283*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_qmf_buf_i = &qmf_buf_imag[idx][ptr_hbe_txposer->a_start];
284*15dc779aSAndroid Build Coastguard Worker 
285*15dc779aSAndroid Build Coastguard Worker     const FLOAT32 *ptr_interp_window_coeff = ptr_hbe_txposer->ptr_ana_win_coeff;
286*15dc779aSAndroid Build Coastguard Worker     FLOAT32 *ptr_x = ptr_hbe_txposer->analy_buf;
287*15dc779aSAndroid Build Coastguard Worker 
288*15dc779aSAndroid Build Coastguard Worker     memset(&qmf_buf_real[idx][ptr_hbe_txposer->a_start], 0,
289*15dc779aSAndroid Build Coastguard Worker            (IXHEAACE_NUM_QMF_SYNTH_CHANNELS - ptr_hbe_txposer->a_start) *
290*15dc779aSAndroid Build Coastguard Worker                sizeof(qmf_buf_real[idx][ptr_hbe_txposer->a_start]));
291*15dc779aSAndroid Build Coastguard Worker     memset(&qmf_buf_imag[idx][ptr_hbe_txposer->a_start], 0,
292*15dc779aSAndroid Build Coastguard Worker            IXHEAACE_TWICE_QMF_SYNTH_CH_NUM * sizeof(qmf_buf_imag[idx][ptr_hbe_txposer->a_start]));
293*15dc779aSAndroid Build Coastguard Worker 
294*15dc779aSAndroid Build Coastguard Worker     ptr_inp_signal = ptr_hbe_txposer->ptr_output_buf + idx * ptr_hbe_txposer->analy_size + 1;
295*15dc779aSAndroid Build Coastguard Worker 
296*15dc779aSAndroid Build Coastguard Worker     for (i = N - 1; i >= anal_size; i--) {
297*15dc779aSAndroid Build Coastguard Worker       ptr_x[i] = ptr_x[i - anal_size];
298*15dc779aSAndroid Build Coastguard Worker     }
299*15dc779aSAndroid Build Coastguard Worker 
300*15dc779aSAndroid Build Coastguard Worker     for (i = anal_size - 1; i >= 0; i--) {
301*15dc779aSAndroid Build Coastguard Worker       ptr_x[i] = ptr_inp_signal[anal_size - 1 - i];
302*15dc779aSAndroid Build Coastguard Worker     }
303*15dc779aSAndroid Build Coastguard Worker 
304*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < N; i++) {
305*15dc779aSAndroid Build Coastguard Worker       window_output[i] = ptr_x[i] * ptr_interp_window_coeff[i];
306*15dc779aSAndroid Build Coastguard Worker     }
307*15dc779aSAndroid Build Coastguard Worker 
308*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < 2 * anal_size; i++) {
309*15dc779aSAndroid Build Coastguard Worker       accu_r = 0.0;
310*15dc779aSAndroid Build Coastguard Worker       for (j = 0; j < 5; j++) {
311*15dc779aSAndroid Build Coastguard Worker         accu_r = accu_r + window_output[i + j * 2 * anal_size];
312*15dc779aSAndroid Build Coastguard Worker       }
313*15dc779aSAndroid Build Coastguard Worker       u[i] = accu_r;
314*15dc779aSAndroid Build Coastguard Worker     }
315*15dc779aSAndroid Build Coastguard Worker 
316*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < anal_size; k++) {
317*15dc779aSAndroid Build Coastguard Worker       accu_r = 0;
318*15dc779aSAndroid Build Coastguard Worker       accu_i = 0;
319*15dc779aSAndroid Build Coastguard Worker       for (l = 0; l < 2 * anal_size; l++) {
320*15dc779aSAndroid Build Coastguard Worker         accu_r = accu_r + u[l] * ptr_hbe_txposer->str_dft_hbe_anal_coeff.real[k][l];
321*15dc779aSAndroid Build Coastguard Worker         accu_i = accu_i + u[l] * ptr_hbe_txposer->str_dft_hbe_anal_coeff.imag[k][l];
322*15dc779aSAndroid Build Coastguard Worker       }
323*15dc779aSAndroid Build Coastguard Worker       ptr_qmf_buf_r[k] = (FLOAT32)accu_r;
324*15dc779aSAndroid Build Coastguard Worker       ptr_qmf_buf_i[k] = (FLOAT32)accu_i;
325*15dc779aSAndroid Build Coastguard Worker     }
326*15dc779aSAndroid Build Coastguard Worker 
327*15dc779aSAndroid Build Coastguard Worker     idx++;
328*15dc779aSAndroid Build Coastguard Worker   }
329*15dc779aSAndroid Build Coastguard Worker }
330