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
21*15dc779aSAndroid Build Coastguard Worker #include <string.h>
22*15dc779aSAndroid Build Coastguard Worker #include <math.h>
23*15dc779aSAndroid Build Coastguard Worker
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
32*15dc779aSAndroid Build Coastguard Worker
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_def.h"
35*15dc779aSAndroid Build Coastguard Worker #include "iusace_esbr_inter_tes.h"
36*15dc779aSAndroid Build Coastguard Worker #include "iusace_esbr_rom.h"
37*15dc779aSAndroid Build Coastguard Worker
ixheaace_init_esbr_inter_tes(ixheaace_str_inter_tes_params * pstr_tes_enc,WORD32 sbr_ratio_index)38*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_init_esbr_inter_tes(ixheaace_str_inter_tes_params *pstr_tes_enc,
39*15dc779aSAndroid Build Coastguard Worker WORD32 sbr_ratio_index) {
40*15dc779aSAndroid Build Coastguard Worker WORD32 ts;
41*15dc779aSAndroid Build Coastguard Worker WORD32 memset_sz = IXHEAACE_QMF_CHANNELS * sizeof(pstr_tes_enc->qmf_buf_real[0][0]);
42*15dc779aSAndroid Build Coastguard Worker
43*15dc779aSAndroid Build Coastguard Worker switch (sbr_ratio_index) {
44*15dc779aSAndroid Build Coastguard Worker case USAC_SBR_RATIO_INDEX_2_1:
45*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->op_delay = 6;
46*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->codec_delay = 32;
47*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->sbr_ratio_index = sbr_ratio_index;
48*15dc779aSAndroid Build Coastguard Worker break;
49*15dc779aSAndroid Build Coastguard Worker case USAC_SBR_RATIO_INDEX_4_1:
50*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->op_delay = 6 * 2;
51*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->codec_delay = 64;
52*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->sbr_ratio_index = sbr_ratio_index;
53*15dc779aSAndroid Build Coastguard Worker break;
54*15dc779aSAndroid Build Coastguard Worker }
55*15dc779aSAndroid Build Coastguard Worker
56*15dc779aSAndroid Build Coastguard Worker memset(&pstr_tes_enc->bw_array_prev[0], 0,
57*15dc779aSAndroid Build Coastguard Worker IXHEAACE_MAX_NUM_PATCHES * sizeof(pstr_tes_enc->bw_array_prev[0]));
58*15dc779aSAndroid Build Coastguard Worker memset(&pstr_tes_enc->inv_filt_mode_prev[0], 0,
59*15dc779aSAndroid Build Coastguard Worker IXHEAACE_MAX_NUM_NOISE_VALUES * sizeof(pstr_tes_enc->inv_filt_mode_prev[0]));
60*15dc779aSAndroid Build Coastguard Worker
61*15dc779aSAndroid Build Coastguard Worker for (ts = 0;
62*15dc779aSAndroid Build Coastguard Worker ts < pstr_tes_enc->op_delay + pstr_tes_enc->codec_delay + IXHEAACE_SBR_HF_ADJ_OFFSET;
63*15dc779aSAndroid Build Coastguard Worker ts++) {
64*15dc779aSAndroid Build Coastguard Worker memset(pstr_tes_enc->qmf_buf_real[ts], 0, memset_sz);
65*15dc779aSAndroid Build Coastguard Worker memset(pstr_tes_enc->qmf_buf_imag[ts], 0, memset_sz);
66*15dc779aSAndroid Build Coastguard Worker }
67*15dc779aSAndroid Build Coastguard Worker return;
68*15dc779aSAndroid Build Coastguard Worker }
69*15dc779aSAndroid Build Coastguard Worker
ixheaace_apply_inter_tes(FLOAT32 * qmf_real1,FLOAT32 * qmf_imag1,FLOAT32 * qmf_real,FLOAT32 * qmf_imag,WORD32 num_sample,WORD32 sub_band_start,WORD32 num_subband,WORD32 gamma_idx)70*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_apply_inter_tes(FLOAT32 *qmf_real1, FLOAT32 *qmf_imag1, FLOAT32 *qmf_real,
71*15dc779aSAndroid Build Coastguard Worker FLOAT32 *qmf_imag, WORD32 num_sample, WORD32 sub_band_start,
72*15dc779aSAndroid Build Coastguard Worker WORD32 num_subband, WORD32 gamma_idx) {
73*15dc779aSAndroid Build Coastguard Worker WORD32 sub_band_end = sub_band_start + num_subband;
74*15dc779aSAndroid Build Coastguard Worker FLOAT32 subsample_power_high[IXHEAACE_TIMESLOT_BUFFER_SIZE],
75*15dc779aSAndroid Build Coastguard Worker subsample_power_low[IXHEAACE_TIMESLOT_BUFFER_SIZE];
76*15dc779aSAndroid Build Coastguard Worker FLOAT32 total_power_high = 0.0f;
77*15dc779aSAndroid Build Coastguard Worker FLOAT32 total_power_low = 0.0f, total_power_high_after = 1.0e-6f;
78*15dc779aSAndroid Build Coastguard Worker FLOAT32 gain[IXHEAACE_TIMESLOT_BUFFER_SIZE];
79*15dc779aSAndroid Build Coastguard Worker FLOAT32 gain_adj, gain_adj_2;
80*15dc779aSAndroid Build Coastguard Worker FLOAT32 gamma = ixheaace_gamma_tab[gamma_idx];
81*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
82*15dc779aSAndroid Build Coastguard Worker WORD32 memcpy_sz = sub_band_start * sizeof(FLOAT32);
83*15dc779aSAndroid Build Coastguard Worker
84*15dc779aSAndroid Build Coastguard Worker if (gamma > 0) {
85*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_sample; i++) {
86*15dc779aSAndroid Build Coastguard Worker memcpy(&qmf_real[IXHEAACE_QMF_CHANNELS * i], &qmf_real1[IXHEAACE_QMF_CHANNELS * i],
87*15dc779aSAndroid Build Coastguard Worker memcpy_sz);
88*15dc779aSAndroid Build Coastguard Worker memcpy(&qmf_imag[IXHEAACE_QMF_CHANNELS * i], &qmf_imag1[IXHEAACE_QMF_CHANNELS * i],
89*15dc779aSAndroid Build Coastguard Worker memcpy_sz);
90*15dc779aSAndroid Build Coastguard Worker }
91*15dc779aSAndroid Build Coastguard Worker
92*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_sample; i++) {
93*15dc779aSAndroid Build Coastguard Worker j = 0;
94*15dc779aSAndroid Build Coastguard Worker subsample_power_low[i] = 0.0f;
95*15dc779aSAndroid Build Coastguard Worker while (j < sub_band_start) {
96*15dc779aSAndroid Build Coastguard Worker subsample_power_low[i] +=
97*15dc779aSAndroid Build Coastguard Worker qmf_real[IXHEAACE_QMF_CHANNELS * i + j] * qmf_real[IXHEAACE_QMF_CHANNELS * i + j];
98*15dc779aSAndroid Build Coastguard Worker subsample_power_low[i] +=
99*15dc779aSAndroid Build Coastguard Worker qmf_imag[IXHEAACE_QMF_CHANNELS * i + j] * qmf_imag[IXHEAACE_QMF_CHANNELS * i + j];
100*15dc779aSAndroid Build Coastguard Worker j++;
101*15dc779aSAndroid Build Coastguard Worker }
102*15dc779aSAndroid Build Coastguard Worker subsample_power_high[i] = 0.0f;
103*15dc779aSAndroid Build Coastguard Worker while (j < sub_band_end) {
104*15dc779aSAndroid Build Coastguard Worker subsample_power_high[i] +=
105*15dc779aSAndroid Build Coastguard Worker qmf_real[IXHEAACE_QMF_CHANNELS * i + j] * qmf_real[IXHEAACE_QMF_CHANNELS * i + j];
106*15dc779aSAndroid Build Coastguard Worker subsample_power_high[i] +=
107*15dc779aSAndroid Build Coastguard Worker qmf_imag[IXHEAACE_QMF_CHANNELS * i + j] * qmf_imag[IXHEAACE_QMF_CHANNELS * i + j];
108*15dc779aSAndroid Build Coastguard Worker j++;
109*15dc779aSAndroid Build Coastguard Worker }
110*15dc779aSAndroid Build Coastguard Worker total_power_low += subsample_power_low[i];
111*15dc779aSAndroid Build Coastguard Worker total_power_high += subsample_power_high[i];
112*15dc779aSAndroid Build Coastguard Worker }
113*15dc779aSAndroid Build Coastguard Worker
114*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_sample; i++) {
115*15dc779aSAndroid Build Coastguard Worker gain[i] =
116*15dc779aSAndroid Build Coastguard Worker (FLOAT32)(sqrt(subsample_power_low[i] * num_sample / (total_power_low + 1.0e-6f)));
117*15dc779aSAndroid Build Coastguard Worker gain[i] = (FLOAT32)(1.0f + gamma * (gain[i] - 1.0f));
118*15dc779aSAndroid Build Coastguard Worker
119*15dc779aSAndroid Build Coastguard Worker if (gain[i] < 0.2f) {
120*15dc779aSAndroid Build Coastguard Worker gain[i] = 0.2f;
121*15dc779aSAndroid Build Coastguard Worker }
122*15dc779aSAndroid Build Coastguard Worker
123*15dc779aSAndroid Build Coastguard Worker subsample_power_high[i] *= gain[i] * gain[i];
124*15dc779aSAndroid Build Coastguard Worker total_power_high_after += subsample_power_high[i];
125*15dc779aSAndroid Build Coastguard Worker }
126*15dc779aSAndroid Build Coastguard Worker
127*15dc779aSAndroid Build Coastguard Worker gain_adj_2 = total_power_high / total_power_high_after;
128*15dc779aSAndroid Build Coastguard Worker gain_adj = (FLOAT32)(sqrt(gain_adj_2));
129*15dc779aSAndroid Build Coastguard Worker
130*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_sample; i++) {
131*15dc779aSAndroid Build Coastguard Worker gain[i] *= gain_adj;
132*15dc779aSAndroid Build Coastguard Worker
133*15dc779aSAndroid Build Coastguard Worker j = sub_band_start;
134*15dc779aSAndroid Build Coastguard Worker while (j < sub_band_end) {
135*15dc779aSAndroid Build Coastguard Worker qmf_real[IXHEAACE_QMF_CHANNELS * i + j] *= gain[i];
136*15dc779aSAndroid Build Coastguard Worker qmf_imag[IXHEAACE_QMF_CHANNELS * i + j] *= gain[i];
137*15dc779aSAndroid Build Coastguard Worker j++;
138*15dc779aSAndroid Build Coastguard Worker }
139*15dc779aSAndroid Build Coastguard Worker }
140*15dc779aSAndroid Build Coastguard Worker }
141*15dc779aSAndroid Build Coastguard Worker }
142*15dc779aSAndroid Build Coastguard Worker
ixheaace_inter_tes_sound_activity(FLOAT32 qmf_real[][IXHEAACE_QMF_CHANNELS],FLOAT32 qmf_imag[][IXHEAACE_QMF_CHANNELS],FLOAT32 energy[],WORD32 len,WORD32 start,WORD32 stop,WORD32 * is_transient)143*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_inter_tes_sound_activity(FLOAT32 qmf_real[][IXHEAACE_QMF_CHANNELS],
144*15dc779aSAndroid Build Coastguard Worker FLOAT32 qmf_imag[][IXHEAACE_QMF_CHANNELS],
145*15dc779aSAndroid Build Coastguard Worker FLOAT32 energy[], WORD32 len, WORD32 start,
146*15dc779aSAndroid Build Coastguard Worker WORD32 stop, WORD32 *is_transient) {
147*15dc779aSAndroid Build Coastguard Worker WORD32 snd_act = 0, ts, idx;
148*15dc779aSAndroid Build Coastguard Worker FLOAT32 ene_min = MAX_FLT_VAL, ene_max = 0.0f;
149*15dc779aSAndroid Build Coastguard Worker
150*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < len; ts++) {
151*15dc779aSAndroid Build Coastguard Worker idx = start;
152*15dc779aSAndroid Build Coastguard Worker while (idx < stop) {
153*15dc779aSAndroid Build Coastguard Worker energy[ts] += (qmf_real[ts][idx] * qmf_real[ts][idx]);
154*15dc779aSAndroid Build Coastguard Worker energy[ts] += (qmf_imag[ts][idx] * qmf_imag[ts][idx]);
155*15dc779aSAndroid Build Coastguard Worker idx++;
156*15dc779aSAndroid Build Coastguard Worker }
157*15dc779aSAndroid Build Coastguard Worker
158*15dc779aSAndroid Build Coastguard Worker if (energy[ts] > ene_max) {
159*15dc779aSAndroid Build Coastguard Worker ene_max = energy[ts];
160*15dc779aSAndroid Build Coastguard Worker }
161*15dc779aSAndroid Build Coastguard Worker if (energy[ts] < ene_min) {
162*15dc779aSAndroid Build Coastguard Worker ene_min = energy[ts];
163*15dc779aSAndroid Build Coastguard Worker }
164*15dc779aSAndroid Build Coastguard Worker }
165*15dc779aSAndroid Build Coastguard Worker
166*15dc779aSAndroid Build Coastguard Worker snd_act = (ene_max > IXHEAACE_ESBR_TES_ENERGY_MAX_THR) ? 1 : 0;
167*15dc779aSAndroid Build Coastguard Worker
168*15dc779aSAndroid Build Coastguard Worker if ((ene_max / (ene_min + 1.0e-6f)) > 20) {
169*15dc779aSAndroid Build Coastguard Worker *is_transient = 1;
170*15dc779aSAndroid Build Coastguard Worker } else {
171*15dc779aSAndroid Build Coastguard Worker *is_transient = 0;
172*15dc779aSAndroid Build Coastguard Worker }
173*15dc779aSAndroid Build Coastguard Worker return snd_act;
174*15dc779aSAndroid Build Coastguard Worker }
175*15dc779aSAndroid Build Coastguard Worker
ixheaace_find_closest_entry(WORD32 goal_sb,WORD16 * ptr_master_tab,WORD16 num_mf_bands,WORD16 direction)176*15dc779aSAndroid Build Coastguard Worker static WORD16 ixheaace_find_closest_entry(WORD32 goal_sb, WORD16 *ptr_master_tab,
177*15dc779aSAndroid Build Coastguard Worker WORD16 num_mf_bands, WORD16 direction) {
178*15dc779aSAndroid Build Coastguard Worker WORD32 index;
179*15dc779aSAndroid Build Coastguard Worker
180*15dc779aSAndroid Build Coastguard Worker if (goal_sb <= ptr_master_tab[0]) return ptr_master_tab[0];
181*15dc779aSAndroid Build Coastguard Worker
182*15dc779aSAndroid Build Coastguard Worker if (goal_sb >= ptr_master_tab[num_mf_bands]) return ptr_master_tab[num_mf_bands];
183*15dc779aSAndroid Build Coastguard Worker
184*15dc779aSAndroid Build Coastguard Worker if (direction) {
185*15dc779aSAndroid Build Coastguard Worker index = 0;
186*15dc779aSAndroid Build Coastguard Worker while (ptr_master_tab[index] < goal_sb) {
187*15dc779aSAndroid Build Coastguard Worker index++;
188*15dc779aSAndroid Build Coastguard Worker }
189*15dc779aSAndroid Build Coastguard Worker } else {
190*15dc779aSAndroid Build Coastguard Worker index = num_mf_bands;
191*15dc779aSAndroid Build Coastguard Worker while (ptr_master_tab[index] > goal_sb) {
192*15dc779aSAndroid Build Coastguard Worker index--;
193*15dc779aSAndroid Build Coastguard Worker }
194*15dc779aSAndroid Build Coastguard Worker }
195*15dc779aSAndroid Build Coastguard Worker
196*15dc779aSAndroid Build Coastguard Worker return ptr_master_tab[index];
197*15dc779aSAndroid Build Coastguard Worker }
198*15dc779aSAndroid Build Coastguard Worker
ixheaace_esbr_calc_co_variance(ixheaace_str_auto_corr_ele * pstr_auto_corr,FLOAT32 ptr_vec_x_real[][IXHEAACE_QMF_CHANNELS],FLOAT32 ptr_vec_x_imag[][IXHEAACE_QMF_CHANNELS],WORD32 bd,WORD32 len)199*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_esbr_calc_co_variance(ixheaace_str_auto_corr_ele *pstr_auto_corr,
200*15dc779aSAndroid Build Coastguard Worker FLOAT32 ptr_vec_x_real[][IXHEAACE_QMF_CHANNELS],
201*15dc779aSAndroid Build Coastguard Worker FLOAT32 ptr_vec_x_imag[][IXHEAACE_QMF_CHANNELS],
202*15dc779aSAndroid Build Coastguard Worker WORD32 bd, WORD32 len) {
203*15dc779aSAndroid Build Coastguard Worker WORD32 j = 0;
204*15dc779aSAndroid Build Coastguard Worker
205*15dc779aSAndroid Build Coastguard Worker FLOAT32 xr_j;
206*15dc779aSAndroid Build Coastguard Worker FLOAT32 xr_j_minus_1 = ptr_vec_x_real[j - 1][bd];
207*15dc779aSAndroid Build Coastguard Worker FLOAT32 xr_j_minus_2 = ptr_vec_x_real[j - 2][bd];
208*15dc779aSAndroid Build Coastguard Worker
209*15dc779aSAndroid Build Coastguard Worker FLOAT32 xi_j;
210*15dc779aSAndroid Build Coastguard Worker FLOAT32 xi_j_minus_1 = ptr_vec_x_imag[j - 1][bd];
211*15dc779aSAndroid Build Coastguard Worker FLOAT32 xi_j_minus_2 = ptr_vec_x_imag[j - 2][bd];
212*15dc779aSAndroid Build Coastguard Worker
213*15dc779aSAndroid Build Coastguard Worker memset(pstr_auto_corr, 0, sizeof(ixheaace_str_auto_corr_ele));
214*15dc779aSAndroid Build Coastguard Worker
215*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < len; j++) {
216*15dc779aSAndroid Build Coastguard Worker xr_j = ptr_vec_x_real[j][bd];
217*15dc779aSAndroid Build Coastguard Worker xi_j = ptr_vec_x_imag[j][bd];
218*15dc779aSAndroid Build Coastguard Worker
219*15dc779aSAndroid Build Coastguard Worker pstr_auto_corr->phi_0_1_real += xr_j * xr_j_minus_1 + xi_j * xi_j_minus_1;
220*15dc779aSAndroid Build Coastguard Worker
221*15dc779aSAndroid Build Coastguard Worker pstr_auto_corr->phi_0_1_imag += xi_j * xr_j_minus_1 - xr_j * xi_j_minus_1;
222*15dc779aSAndroid Build Coastguard Worker
223*15dc779aSAndroid Build Coastguard Worker pstr_auto_corr->phi_0_2_real += xr_j * xr_j_minus_2 + xi_j * xi_j_minus_2;
224*15dc779aSAndroid Build Coastguard Worker
225*15dc779aSAndroid Build Coastguard Worker pstr_auto_corr->phi_0_2_imag += xi_j * xr_j_minus_2 - xr_j * xi_j_minus_2;
226*15dc779aSAndroid Build Coastguard Worker
227*15dc779aSAndroid Build Coastguard Worker pstr_auto_corr->phi_1_1 += xr_j_minus_1 * xr_j_minus_1 + xi_j_minus_1 * xi_j_minus_1;
228*15dc779aSAndroid Build Coastguard Worker
229*15dc779aSAndroid Build Coastguard Worker pstr_auto_corr->phi_1_2_real += xr_j_minus_1 * xr_j_minus_2 + xi_j_minus_1 * xi_j_minus_2;
230*15dc779aSAndroid Build Coastguard Worker
231*15dc779aSAndroid Build Coastguard Worker pstr_auto_corr->phi_1_2_imag += xi_j_minus_1 * xr_j_minus_2 - xr_j_minus_1 * xi_j_minus_2;
232*15dc779aSAndroid Build Coastguard Worker
233*15dc779aSAndroid Build Coastguard Worker pstr_auto_corr->phi_2_2 += xr_j_minus_2 * xr_j_minus_2 + xi_j_minus_2 * xi_j_minus_2;
234*15dc779aSAndroid Build Coastguard Worker
235*15dc779aSAndroid Build Coastguard Worker xr_j_minus_2 = xr_j_minus_1;
236*15dc779aSAndroid Build Coastguard Worker xr_j_minus_1 = xr_j;
237*15dc779aSAndroid Build Coastguard Worker
238*15dc779aSAndroid Build Coastguard Worker xi_j_minus_2 = xi_j_minus_1;
239*15dc779aSAndroid Build Coastguard Worker xi_j_minus_1 = xi_j;
240*15dc779aSAndroid Build Coastguard Worker }
241*15dc779aSAndroid Build Coastguard Worker
242*15dc779aSAndroid Build Coastguard Worker pstr_auto_corr->det = pstr_auto_corr->phi_1_1 * pstr_auto_corr->phi_2_2 -
243*15dc779aSAndroid Build Coastguard Worker (pstr_auto_corr->phi_1_2_real * pstr_auto_corr->phi_1_2_real +
244*15dc779aSAndroid Build Coastguard Worker pstr_auto_corr->phi_1_2_imag * pstr_auto_corr->phi_1_2_imag) *
245*15dc779aSAndroid Build Coastguard Worker IXHEAACE_SBR_HF_RELAXATION_PARAM;
246*15dc779aSAndroid Build Coastguard Worker }
247*15dc779aSAndroid Build Coastguard Worker
ixheaace_gausssolve(WORD32 n,FLOAT32 ptr_a[][IXHEAACE_MAXDEG+1],FLOAT32 ptr_b[],FLOAT32 ptr_y[])248*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_gausssolve(WORD32 n, FLOAT32 ptr_a[][IXHEAACE_MAXDEG + 1], FLOAT32 ptr_b[],
249*15dc779aSAndroid Build Coastguard Worker FLOAT32 ptr_y[]) {
250*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, k, imax;
251*15dc779aSAndroid Build Coastguard Worker FLOAT32 v;
252*15dc779aSAndroid Build Coastguard Worker
253*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < n; i++) {
254*15dc779aSAndroid Build Coastguard Worker imax = i;
255*15dc779aSAndroid Build Coastguard Worker k = i + 1;
256*15dc779aSAndroid Build Coastguard Worker while (k < n) {
257*15dc779aSAndroid Build Coastguard Worker if (fabs(ptr_a[k][i]) > fabs(ptr_a[imax][i])) {
258*15dc779aSAndroid Build Coastguard Worker imax = k;
259*15dc779aSAndroid Build Coastguard Worker }
260*15dc779aSAndroid Build Coastguard Worker k++;
261*15dc779aSAndroid Build Coastguard Worker }
262*15dc779aSAndroid Build Coastguard Worker if (imax != i) {
263*15dc779aSAndroid Build Coastguard Worker v = ptr_b[imax];
264*15dc779aSAndroid Build Coastguard Worker ptr_b[imax] = ptr_b[i];
265*15dc779aSAndroid Build Coastguard Worker ptr_b[i] = v;
266*15dc779aSAndroid Build Coastguard Worker j = i;
267*15dc779aSAndroid Build Coastguard Worker while (j < n) {
268*15dc779aSAndroid Build Coastguard Worker v = ptr_a[imax][j];
269*15dc779aSAndroid Build Coastguard Worker ptr_a[imax][j] = ptr_a[i][j];
270*15dc779aSAndroid Build Coastguard Worker ptr_a[i][j] = v;
271*15dc779aSAndroid Build Coastguard Worker j++;
272*15dc779aSAndroid Build Coastguard Worker }
273*15dc779aSAndroid Build Coastguard Worker }
274*15dc779aSAndroid Build Coastguard Worker
275*15dc779aSAndroid Build Coastguard Worker v = ptr_a[i][i];
276*15dc779aSAndroid Build Coastguard Worker
277*15dc779aSAndroid Build Coastguard Worker ptr_b[i] /= v;
278*15dc779aSAndroid Build Coastguard Worker for (j = i; j < n; j++) {
279*15dc779aSAndroid Build Coastguard Worker ptr_a[i][j] /= v;
280*15dc779aSAndroid Build Coastguard Worker }
281*15dc779aSAndroid Build Coastguard Worker
282*15dc779aSAndroid Build Coastguard Worker for (k = i + 1; k < n; k++) {
283*15dc779aSAndroid Build Coastguard Worker v = ptr_a[k][i];
284*15dc779aSAndroid Build Coastguard Worker ptr_b[k] -= v * ptr_b[i];
285*15dc779aSAndroid Build Coastguard Worker for (j = i + 1; j < n; j++) {
286*15dc779aSAndroid Build Coastguard Worker ptr_a[k][j] -= v * ptr_a[i][j];
287*15dc779aSAndroid Build Coastguard Worker }
288*15dc779aSAndroid Build Coastguard Worker }
289*15dc779aSAndroid Build Coastguard Worker }
290*15dc779aSAndroid Build Coastguard Worker
291*15dc779aSAndroid Build Coastguard Worker for (i = n - 1; i >= 0; i--) {
292*15dc779aSAndroid Build Coastguard Worker ptr_y[i] = ptr_b[i];
293*15dc779aSAndroid Build Coastguard Worker for (j = i + 1; j < n; j++) {
294*15dc779aSAndroid Build Coastguard Worker ptr_y[i] -= ptr_a[i][j] * ptr_y[j];
295*15dc779aSAndroid Build Coastguard Worker }
296*15dc779aSAndroid Build Coastguard Worker }
297*15dc779aSAndroid Build Coastguard Worker }
298*15dc779aSAndroid Build Coastguard Worker
ixheaace_polyfit(WORD32 n,FLOAT32 ptr_y[],FLOAT32 ptr_p[])299*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_polyfit(WORD32 n, FLOAT32 ptr_y[], FLOAT32 ptr_p[]) {
300*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, k;
301*15dc779aSAndroid Build Coastguard Worker FLOAT32 ptr_a[IXHEAACE_MAXDEG + 1][IXHEAACE_MAXDEG + 1] = {{0}};
302*15dc779aSAndroid Build Coastguard Worker FLOAT32 ptr_b[IXHEAACE_MAXDEG + 1] = {0};
303*15dc779aSAndroid Build Coastguard Worker FLOAT32 v[2 * IXHEAACE_MAXDEG + 1];
304*15dc779aSAndroid Build Coastguard Worker
305*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < n; k++) {
306*15dc779aSAndroid Build Coastguard Worker v[0] = 1.0;
307*15dc779aSAndroid Build Coastguard Worker for (i = 1; i <= 2 * IXHEAACE_MAXDEG; i++) {
308*15dc779aSAndroid Build Coastguard Worker v[i] = k * v[i - 1];
309*15dc779aSAndroid Build Coastguard Worker }
310*15dc779aSAndroid Build Coastguard Worker
311*15dc779aSAndroid Build Coastguard Worker for (i = 0; i <= IXHEAACE_MAXDEG; i++) {
312*15dc779aSAndroid Build Coastguard Worker ptr_b[i] += v[IXHEAACE_MAXDEG - i] * ptr_y[k];
313*15dc779aSAndroid Build Coastguard Worker for (j = 0; j <= IXHEAACE_MAXDEG; j++) {
314*15dc779aSAndroid Build Coastguard Worker ptr_a[i][j] += v[2 * IXHEAACE_MAXDEG - i - j];
315*15dc779aSAndroid Build Coastguard Worker }
316*15dc779aSAndroid Build Coastguard Worker }
317*15dc779aSAndroid Build Coastguard Worker }
318*15dc779aSAndroid Build Coastguard Worker
319*15dc779aSAndroid Build Coastguard Worker ixheaace_gausssolve(IXHEAACE_MAXDEG + 1, ptr_a, ptr_b, ptr_p);
320*15dc779aSAndroid Build Coastguard Worker }
321*15dc779aSAndroid Build Coastguard Worker
ixheaace_esbr_chirp_fac_calc(WORD32 * ptr_inv_filt_mode,WORD32 * ptr_inv_filt_mode_prev,WORD32 num_if_bands,FLOAT32 * ptr_bw_array,FLOAT32 * ptr_bw_array_prev)322*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_esbr_chirp_fac_calc(WORD32 *ptr_inv_filt_mode,
323*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_inv_filt_mode_prev, WORD32 num_if_bands,
324*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_bw_array, FLOAT32 *ptr_bw_array_prev) {
325*15dc779aSAndroid Build Coastguard Worker WORD32 i;
326*15dc779aSAndroid Build Coastguard Worker
327*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_if_bands; i++) {
328*15dc779aSAndroid Build Coastguard Worker ptr_bw_array[i] = ixheaace_new_bw_tab[ptr_inv_filt_mode_prev[i]][ptr_inv_filt_mode[i]];
329*15dc779aSAndroid Build Coastguard Worker
330*15dc779aSAndroid Build Coastguard Worker if (ptr_bw_array[i] < ptr_bw_array_prev[i]) {
331*15dc779aSAndroid Build Coastguard Worker ptr_bw_array[i] = 0.75000f * ptr_bw_array[i] + 0.25000f * ptr_bw_array_prev[i];
332*15dc779aSAndroid Build Coastguard Worker } else {
333*15dc779aSAndroid Build Coastguard Worker ptr_bw_array[i] = 0.90625f * ptr_bw_array[i] + 0.09375f * ptr_bw_array_prev[i];
334*15dc779aSAndroid Build Coastguard Worker }
335*15dc779aSAndroid Build Coastguard Worker
336*15dc779aSAndroid Build Coastguard Worker if (ptr_bw_array[i] < 0.015625) {
337*15dc779aSAndroid Build Coastguard Worker ptr_bw_array[i] = 0;
338*15dc779aSAndroid Build Coastguard Worker }
339*15dc779aSAndroid Build Coastguard Worker }
340*15dc779aSAndroid Build Coastguard Worker }
341*15dc779aSAndroid Build Coastguard Worker
ixheaace_pre_processing(FLOAT32 ptr_src_buf_real[][IXHEAACE_QMF_CHANNELS],FLOAT32 ptr_src_buf_imag[][IXHEAACE_QMF_CHANNELS],FLOAT32 ptr_gain_vector[],WORD32 num_bands,WORD32 start_sample,WORD32 end_sample)342*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_pre_processing(FLOAT32 ptr_src_buf_real[][IXHEAACE_QMF_CHANNELS],
343*15dc779aSAndroid Build Coastguard Worker FLOAT32 ptr_src_buf_imag[][IXHEAACE_QMF_CHANNELS],
344*15dc779aSAndroid Build Coastguard Worker FLOAT32 ptr_gain_vector[], WORD32 num_bands,
345*15dc779aSAndroid Build Coastguard Worker WORD32 start_sample, WORD32 end_sample) {
346*15dc779aSAndroid Build Coastguard Worker WORD32 k, i;
347*15dc779aSAndroid Build Coastguard Worker FLOAT32 poly_coeff[4];
348*15dc779aSAndroid Build Coastguard Worker FLOAT32 mean_enrg = 0;
349*15dc779aSAndroid Build Coastguard Worker FLOAT32 low_env_slope[IXHEAACE_QMF_CHANNELS];
350*15dc779aSAndroid Build Coastguard Worker FLOAT32 low_env[IXHEAACE_QMF_CHANNELS];
351*15dc779aSAndroid Build Coastguard Worker FLOAT32 a0;
352*15dc779aSAndroid Build Coastguard Worker FLOAT32 a1;
353*15dc779aSAndroid Build Coastguard Worker FLOAT32 a2;
354*15dc779aSAndroid Build Coastguard Worker FLOAT32 a3;
355*15dc779aSAndroid Build Coastguard Worker
356*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < num_bands; k++) {
357*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp = 0;
358*15dc779aSAndroid Build Coastguard Worker for (i = start_sample; i < end_sample; i++) {
359*15dc779aSAndroid Build Coastguard Worker temp += ptr_src_buf_real[i][k] * ptr_src_buf_real[i][k] +
360*15dc779aSAndroid Build Coastguard Worker ptr_src_buf_imag[i][k] * ptr_src_buf_imag[i][k];
361*15dc779aSAndroid Build Coastguard Worker }
362*15dc779aSAndroid Build Coastguard Worker temp /= (end_sample - start_sample);
363*15dc779aSAndroid Build Coastguard Worker low_env[k] = (FLOAT32)(10 * log10(temp + 1));
364*15dc779aSAndroid Build Coastguard Worker mean_enrg += low_env[k];
365*15dc779aSAndroid Build Coastguard Worker }
366*15dc779aSAndroid Build Coastguard Worker mean_enrg /= num_bands;
367*15dc779aSAndroid Build Coastguard Worker
368*15dc779aSAndroid Build Coastguard Worker ixheaace_polyfit(num_bands, low_env, poly_coeff);
369*15dc779aSAndroid Build Coastguard Worker
370*15dc779aSAndroid Build Coastguard Worker a0 = poly_coeff[0];
371*15dc779aSAndroid Build Coastguard Worker a1 = poly_coeff[1];
372*15dc779aSAndroid Build Coastguard Worker a2 = poly_coeff[2];
373*15dc779aSAndroid Build Coastguard Worker a3 = poly_coeff[3];
374*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < num_bands; k++) {
375*15dc779aSAndroid Build Coastguard Worker low_env_slope[k] = a3 + a2 * k + a1 * k * k + a0 * k * k * k;
376*15dc779aSAndroid Build Coastguard Worker }
377*15dc779aSAndroid Build Coastguard Worker
378*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_bands; i++) {
379*15dc779aSAndroid Build Coastguard Worker ptr_gain_vector[i] = (FLOAT32)pow(10, (mean_enrg - low_env_slope[i]) / 20.0f);
380*15dc779aSAndroid Build Coastguard Worker }
381*15dc779aSAndroid Build Coastguard Worker }
382*15dc779aSAndroid Build Coastguard Worker
ixheaace_generate_hf(FLOAT32 ptr_src_buf_real[][64],FLOAT32 ptr_src_buf_imag[][64],FLOAT32 ptr_ph_vocod_buf_real[][64],FLOAT32 ptr_ph_vocod_buf_imag[][64],FLOAT32 ptr_dst_buf_real[][64],FLOAT32 ptr_dst_buf_imag[][64],ixheaace_str_inter_tes_params * pstr_tes_enc)383*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_generate_hf(FLOAT32 ptr_src_buf_real[][64],
384*15dc779aSAndroid Build Coastguard Worker FLOAT32 ptr_src_buf_imag[][64],
385*15dc779aSAndroid Build Coastguard Worker FLOAT32 ptr_ph_vocod_buf_real[][64],
386*15dc779aSAndroid Build Coastguard Worker FLOAT32 ptr_ph_vocod_buf_imag[][64],
387*15dc779aSAndroid Build Coastguard Worker FLOAT32 ptr_dst_buf_real[][64],
388*15dc779aSAndroid Build Coastguard Worker FLOAT32 ptr_dst_buf_imag[][64],
389*15dc779aSAndroid Build Coastguard Worker ixheaace_str_inter_tes_params *pstr_tes_enc) {
390*15dc779aSAndroid Build Coastguard Worker WORD32 bw_index, i, k, k2, patch = 0;
391*15dc779aSAndroid Build Coastguard Worker WORD32 co_var_len;
392*15dc779aSAndroid Build Coastguard Worker WORD32 start_sample, end_sample, goal_sb;
393*15dc779aSAndroid Build Coastguard Worker WORD32 sb, source_start_band, patch_stride, num_bands_in_patch;
394*15dc779aSAndroid Build Coastguard Worker WORD32 hbe_flag = 0;
395*15dc779aSAndroid Build Coastguard Worker FLOAT32 a0r, a0i, a1r, a1i;
396*15dc779aSAndroid Build Coastguard Worker FLOAT32 ptr_bw_array[IXHEAACE_MAX_NUM_PATCHES] = {0};
397*15dc779aSAndroid Build Coastguard Worker
398*15dc779aSAndroid Build Coastguard Worker ixheaace_str_auto_corr_ele str_auto_corr;
399*15dc779aSAndroid Build Coastguard Worker
400*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_invf_band_tbl = &pstr_tes_enc->invf_band_tbl[1];
401*15dc779aSAndroid Build Coastguard Worker WORD32 num_if_bands = pstr_tes_enc->num_if_bands;
402*15dc779aSAndroid Build Coastguard Worker WORD32 sub_band_start = pstr_tes_enc->sub_band_start;
403*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_master_tab = pstr_tes_enc->f_master_tbl;
404*15dc779aSAndroid Build Coastguard Worker WORD32 num_mf_bands = pstr_tes_enc->num_mf_bands;
405*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_inv_filt_mode = pstr_tes_enc->inv_filt_mode;
406*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_inv_filt_mode_prev = pstr_tes_enc->inv_filt_mode_prev;
407*15dc779aSAndroid Build Coastguard Worker WORD32 sbr_patching_mode = 1;
408*15dc779aSAndroid Build Coastguard Worker WORD32 pre_proc_flag = 0;
409*15dc779aSAndroid Build Coastguard Worker WORD32 fs = pstr_tes_enc->out_fs;
410*15dc779aSAndroid Build Coastguard Worker WORD32 cov_count;
411*15dc779aSAndroid Build Coastguard Worker WORD32 lsb = ptr_master_tab[0];
412*15dc779aSAndroid Build Coastguard Worker WORD32 usb = ptr_master_tab[num_mf_bands];
413*15dc779aSAndroid Build Coastguard Worker WORD32 memset_sz = (IXHEAACE_QMF_CHANNELS - usb) * sizeof(FLOAT32);
414*15dc779aSAndroid Build Coastguard Worker WORD32 xover_offset = sub_band_start - ptr_master_tab[0];
415*15dc779aSAndroid Build Coastguard Worker FLOAT32 bw = 0.0f;
416*15dc779aSAndroid Build Coastguard Worker FLOAT32 fac = 0.0f;
417*15dc779aSAndroid Build Coastguard Worker FLOAT32 gain;
418*15dc779aSAndroid Build Coastguard Worker FLOAT32 ptr_gain_vector[64];
419*15dc779aSAndroid Build Coastguard Worker WORD32 slope_length = 0;
420*15dc779aSAndroid Build Coastguard Worker WORD32 first_slot_offset = pstr_tes_enc->border_vec[0];
421*15dc779aSAndroid Build Coastguard Worker WORD32 end_slot_offs = 0;
422*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_bw_array_prev = pstr_tes_enc->bw_array_prev;
423*15dc779aSAndroid Build Coastguard Worker
424*15dc779aSAndroid Build Coastguard Worker end_slot_offs = pstr_tes_enc->border_vec[pstr_tes_enc->num_env] - 16;
425*15dc779aSAndroid Build Coastguard Worker
426*15dc779aSAndroid Build Coastguard Worker switch (pstr_tes_enc->sbr_ratio_index) {
427*15dc779aSAndroid Build Coastguard Worker case USAC_SBR_RATIO_INDEX_2_1:
428*15dc779aSAndroid Build Coastguard Worker start_sample = first_slot_offset * 2;
429*15dc779aSAndroid Build Coastguard Worker end_sample = 32 + end_slot_offs * 2;
430*15dc779aSAndroid Build Coastguard Worker co_var_len = 38;
431*15dc779aSAndroid Build Coastguard Worker break;
432*15dc779aSAndroid Build Coastguard Worker case USAC_SBR_RATIO_INDEX_4_1:
433*15dc779aSAndroid Build Coastguard Worker start_sample = first_slot_offset * 4;
434*15dc779aSAndroid Build Coastguard Worker end_sample = 64 + end_slot_offs * 4;
435*15dc779aSAndroid Build Coastguard Worker co_var_len = 76;
436*15dc779aSAndroid Build Coastguard Worker break;
437*15dc779aSAndroid Build Coastguard Worker default:
438*15dc779aSAndroid Build Coastguard Worker start_sample = first_slot_offset * 2;
439*15dc779aSAndroid Build Coastguard Worker end_sample = 32 + end_slot_offs * 2;
440*15dc779aSAndroid Build Coastguard Worker co_var_len = 38;
441*15dc779aSAndroid Build Coastguard Worker break;
442*15dc779aSAndroid Build Coastguard Worker }
443*15dc779aSAndroid Build Coastguard Worker
444*15dc779aSAndroid Build Coastguard Worker if (pre_proc_flag) {
445*15dc779aSAndroid Build Coastguard Worker ixheaace_pre_processing(ptr_src_buf_real, ptr_src_buf_imag, ptr_gain_vector,
446*15dc779aSAndroid Build Coastguard Worker ptr_master_tab[0], start_sample, end_sample);
447*15dc779aSAndroid Build Coastguard Worker }
448*15dc779aSAndroid Build Coastguard Worker
449*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_chirp_fac_calc(ptr_inv_filt_mode, ptr_inv_filt_mode_prev, num_if_bands,
450*15dc779aSAndroid Build Coastguard Worker ptr_bw_array, ptr_bw_array_prev);
451*15dc779aSAndroid Build Coastguard Worker
452*15dc779aSAndroid Build Coastguard Worker for (i = start_sample; i < end_sample; i++) {
453*15dc779aSAndroid Build Coastguard Worker memset(ptr_dst_buf_real[i] + usb, 0, memset_sz);
454*15dc779aSAndroid Build Coastguard Worker memset(ptr_dst_buf_imag[i] + usb, 0, memset_sz);
455*15dc779aSAndroid Build Coastguard Worker }
456*15dc779aSAndroid Build Coastguard Worker
457*15dc779aSAndroid Build Coastguard Worker if (sbr_patching_mode || !hbe_flag) {
458*15dc779aSAndroid Build Coastguard Worker FLOAT32 alpha_real[IXHEAACE_QMF_CHANNELS][2] = {{0}},
459*15dc779aSAndroid Build Coastguard Worker alpha_imag[IXHEAACE_QMF_CHANNELS][2] = {{0}};
460*15dc779aSAndroid Build Coastguard Worker cov_count = ptr_master_tab[0];
461*15dc779aSAndroid Build Coastguard Worker
462*15dc779aSAndroid Build Coastguard Worker for (k = 1; k < cov_count; k++) {
463*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_calc_co_variance(&str_auto_corr, &ptr_src_buf_real[0], &ptr_src_buf_imag[0],
464*15dc779aSAndroid Build Coastguard Worker k, co_var_len);
465*15dc779aSAndroid Build Coastguard Worker if (str_auto_corr.det == 0.0f) {
466*15dc779aSAndroid Build Coastguard Worker alpha_real[k][1] = alpha_imag[k][1] = 0;
467*15dc779aSAndroid Build Coastguard Worker } else {
468*15dc779aSAndroid Build Coastguard Worker fac = 1.0f / str_auto_corr.det;
469*15dc779aSAndroid Build Coastguard Worker alpha_real[k][1] = (str_auto_corr.phi_0_1_real * str_auto_corr.phi_1_2_real -
470*15dc779aSAndroid Build Coastguard Worker str_auto_corr.phi_0_1_imag * str_auto_corr.phi_1_2_imag -
471*15dc779aSAndroid Build Coastguard Worker str_auto_corr.phi_0_2_real * str_auto_corr.phi_1_1) *
472*15dc779aSAndroid Build Coastguard Worker fac;
473*15dc779aSAndroid Build Coastguard Worker alpha_imag[k][1] = (str_auto_corr.phi_0_1_imag * str_auto_corr.phi_1_2_real +
474*15dc779aSAndroid Build Coastguard Worker str_auto_corr.phi_0_1_real * str_auto_corr.phi_1_2_imag -
475*15dc779aSAndroid Build Coastguard Worker str_auto_corr.phi_0_2_imag * str_auto_corr.phi_1_1) *
476*15dc779aSAndroid Build Coastguard Worker fac;
477*15dc779aSAndroid Build Coastguard Worker }
478*15dc779aSAndroid Build Coastguard Worker
479*15dc779aSAndroid Build Coastguard Worker if (str_auto_corr.phi_1_1 == 0) {
480*15dc779aSAndroid Build Coastguard Worker alpha_real[k][0] = alpha_imag[k][0] = 0;
481*15dc779aSAndroid Build Coastguard Worker } else {
482*15dc779aSAndroid Build Coastguard Worker fac = 1.0f / str_auto_corr.phi_1_1;
483*15dc779aSAndroid Build Coastguard Worker alpha_real[k][0] =
484*15dc779aSAndroid Build Coastguard Worker -(str_auto_corr.phi_0_1_real + alpha_real[k][1] * str_auto_corr.phi_1_2_real +
485*15dc779aSAndroid Build Coastguard Worker alpha_imag[k][1] * str_auto_corr.phi_1_2_imag) *
486*15dc779aSAndroid Build Coastguard Worker fac;
487*15dc779aSAndroid Build Coastguard Worker alpha_imag[k][0] =
488*15dc779aSAndroid Build Coastguard Worker -(str_auto_corr.phi_0_1_imag + alpha_imag[k][1] * str_auto_corr.phi_1_2_real -
489*15dc779aSAndroid Build Coastguard Worker alpha_real[k][1] * str_auto_corr.phi_1_2_imag) *
490*15dc779aSAndroid Build Coastguard Worker fac;
491*15dc779aSAndroid Build Coastguard Worker }
492*15dc779aSAndroid Build Coastguard Worker
493*15dc779aSAndroid Build Coastguard Worker if ((alpha_real[k][0] * alpha_real[k][0] + alpha_imag[k][0] * alpha_imag[k][0] >= 16.0f) ||
494*15dc779aSAndroid Build Coastguard Worker (alpha_real[k][1] * alpha_real[k][1] + alpha_imag[k][1] * alpha_imag[k][1] >= 16.0f)) {
495*15dc779aSAndroid Build Coastguard Worker alpha_real[k][0] = 0.0f;
496*15dc779aSAndroid Build Coastguard Worker alpha_imag[k][0] = 0.0f;
497*15dc779aSAndroid Build Coastguard Worker alpha_real[k][1] = 0.0f;
498*15dc779aSAndroid Build Coastguard Worker alpha_imag[k][1] = 0.0f;
499*15dc779aSAndroid Build Coastguard Worker }
500*15dc779aSAndroid Build Coastguard Worker }
501*15dc779aSAndroid Build Coastguard Worker
502*15dc779aSAndroid Build Coastguard Worker goal_sb = (WORD32)(2.048e6f / fs + 0.5f);
503*15dc779aSAndroid Build Coastguard Worker {
504*15dc779aSAndroid Build Coastguard Worker WORD32 index;
505*15dc779aSAndroid Build Coastguard Worker if (goal_sb < ptr_master_tab[num_mf_bands]) {
506*15dc779aSAndroid Build Coastguard Worker for (index = 0; (ptr_master_tab[index] < goal_sb); index++)
507*15dc779aSAndroid Build Coastguard Worker goal_sb = ptr_master_tab[index];
508*15dc779aSAndroid Build Coastguard Worker } else {
509*15dc779aSAndroid Build Coastguard Worker goal_sb = ptr_master_tab[num_mf_bands];
510*15dc779aSAndroid Build Coastguard Worker }
511*15dc779aSAndroid Build Coastguard Worker }
512*15dc779aSAndroid Build Coastguard Worker
513*15dc779aSAndroid Build Coastguard Worker source_start_band = xover_offset + 1;
514*15dc779aSAndroid Build Coastguard Worker
515*15dc779aSAndroid Build Coastguard Worker sb = lsb + xover_offset;
516*15dc779aSAndroid Build Coastguard Worker
517*15dc779aSAndroid Build Coastguard Worker patch = 0;
518*15dc779aSAndroid Build Coastguard Worker while (sb < usb) {
519*15dc779aSAndroid Build Coastguard Worker if (IXHEAACE_MAX_NUM_PATCHES <= patch) {
520*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_NONFATAL_ESBR_INVALID_NUM_PATCH;
521*15dc779aSAndroid Build Coastguard Worker }
522*15dc779aSAndroid Build Coastguard Worker
523*15dc779aSAndroid Build Coastguard Worker num_bands_in_patch = goal_sb - sb;
524*15dc779aSAndroid Build Coastguard Worker
525*15dc779aSAndroid Build Coastguard Worker if (num_bands_in_patch + source_start_band >= lsb) {
526*15dc779aSAndroid Build Coastguard Worker patch_stride = sb - source_start_band;
527*15dc779aSAndroid Build Coastguard Worker patch_stride = patch_stride & ~1;
528*15dc779aSAndroid Build Coastguard Worker num_bands_in_patch = lsb - (sb - patch_stride);
529*15dc779aSAndroid Build Coastguard Worker num_bands_in_patch = ixheaace_find_closest_entry(sb + num_bands_in_patch, ptr_master_tab,
530*15dc779aSAndroid Build Coastguard Worker (WORD16)(num_mf_bands), 0) -
531*15dc779aSAndroid Build Coastguard Worker (WORD32)(sb);
532*15dc779aSAndroid Build Coastguard Worker }
533*15dc779aSAndroid Build Coastguard Worker
534*15dc779aSAndroid Build Coastguard Worker patch_stride = num_bands_in_patch + sb - lsb;
535*15dc779aSAndroid Build Coastguard Worker patch_stride = (patch_stride + 1) & ~1;
536*15dc779aSAndroid Build Coastguard Worker
537*15dc779aSAndroid Build Coastguard Worker source_start_band = 1;
538*15dc779aSAndroid Build Coastguard Worker
539*15dc779aSAndroid Build Coastguard Worker if (goal_sb - (sb + num_bands_in_patch) < 3) {
540*15dc779aSAndroid Build Coastguard Worker goal_sb = usb;
541*15dc779aSAndroid Build Coastguard Worker }
542*15dc779aSAndroid Build Coastguard Worker
543*15dc779aSAndroid Build Coastguard Worker if ((num_bands_in_patch < 3) && (patch > 0) && (sb + num_bands_in_patch == usb)) {
544*15dc779aSAndroid Build Coastguard Worker for (i = start_sample + slope_length; i < end_sample + slope_length; i++) {
545*15dc779aSAndroid Build Coastguard Worker for (k2 = sb; k2 < sb + num_bands_in_patch; k2++) {
546*15dc779aSAndroid Build Coastguard Worker if (k2 < 0 || k2 >= 64) {
547*15dc779aSAndroid Build Coastguard Worker break;
548*15dc779aSAndroid Build Coastguard Worker }
549*15dc779aSAndroid Build Coastguard Worker ptr_dst_buf_real[i][k2] = 0.0f;
550*15dc779aSAndroid Build Coastguard Worker ptr_dst_buf_imag[i][k2] = 0.0f;
551*15dc779aSAndroid Build Coastguard Worker }
552*15dc779aSAndroid Build Coastguard Worker }
553*15dc779aSAndroid Build Coastguard Worker break;
554*15dc779aSAndroid Build Coastguard Worker }
555*15dc779aSAndroid Build Coastguard Worker
556*15dc779aSAndroid Build Coastguard Worker if (num_bands_in_patch <= 0) {
557*15dc779aSAndroid Build Coastguard Worker continue;
558*15dc779aSAndroid Build Coastguard Worker }
559*15dc779aSAndroid Build Coastguard Worker
560*15dc779aSAndroid Build Coastguard Worker for (k2 = sb; k2 < sb + num_bands_in_patch; k2++) {
561*15dc779aSAndroid Build Coastguard Worker k = k2 - patch_stride;
562*15dc779aSAndroid Build Coastguard Worker bw_index = 0;
563*15dc779aSAndroid Build Coastguard Worker while (k2 >= ptr_invf_band_tbl[bw_index]) {
564*15dc779aSAndroid Build Coastguard Worker bw_index++;
565*15dc779aSAndroid Build Coastguard Worker if (bw_index >= IXHEAACE_MAX_NOISE_COEFFS) {
566*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_NONFATAL_ESBR_INVALID_BANDWIDTH_INDEX;
567*15dc779aSAndroid Build Coastguard Worker }
568*15dc779aSAndroid Build Coastguard Worker }
569*15dc779aSAndroid Build Coastguard Worker
570*15dc779aSAndroid Build Coastguard Worker if (bw_index >= IXHEAACE_MAX_NUM_PATCHES) {
571*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_NONFATAL_ESBR_INVALID_BANDWIDTH_INDEX;
572*15dc779aSAndroid Build Coastguard Worker }
573*15dc779aSAndroid Build Coastguard Worker bw = ptr_bw_array[bw_index];
574*15dc779aSAndroid Build Coastguard Worker
575*15dc779aSAndroid Build Coastguard Worker a0r = bw * alpha_real[k][0];
576*15dc779aSAndroid Build Coastguard Worker a0i = bw * alpha_imag[k][0];
577*15dc779aSAndroid Build Coastguard Worker bw *= bw;
578*15dc779aSAndroid Build Coastguard Worker a1r = bw * alpha_real[k][1];
579*15dc779aSAndroid Build Coastguard Worker a1i = bw * alpha_imag[k][1];
580*15dc779aSAndroid Build Coastguard Worker
581*15dc779aSAndroid Build Coastguard Worker if (pre_proc_flag) {
582*15dc779aSAndroid Build Coastguard Worker gain = ptr_gain_vector[k];
583*15dc779aSAndroid Build Coastguard Worker } else {
584*15dc779aSAndroid Build Coastguard Worker gain = 1.0f;
585*15dc779aSAndroid Build Coastguard Worker }
586*15dc779aSAndroid Build Coastguard Worker
587*15dc779aSAndroid Build Coastguard Worker for (i = start_sample + slope_length; i < end_sample + slope_length; i++) {
588*15dc779aSAndroid Build Coastguard Worker ptr_dst_buf_real[i][k2] = ptr_src_buf_real[i][k] * gain;
589*15dc779aSAndroid Build Coastguard Worker
590*15dc779aSAndroid Build Coastguard Worker ptr_dst_buf_imag[i][k2] = ptr_src_buf_imag[i][k] * gain;
591*15dc779aSAndroid Build Coastguard Worker
592*15dc779aSAndroid Build Coastguard Worker if (bw > 0.0f) {
593*15dc779aSAndroid Build Coastguard Worker ptr_dst_buf_real[i][k2] +=
594*15dc779aSAndroid Build Coastguard Worker (a0r * ptr_src_buf_real[i - 1][k] - a0i * ptr_src_buf_imag[i - 1][k] +
595*15dc779aSAndroid Build Coastguard Worker a1r * ptr_src_buf_real[i - 2][k] - a1i * ptr_src_buf_imag[i - 2][k]) *
596*15dc779aSAndroid Build Coastguard Worker gain;
597*15dc779aSAndroid Build Coastguard Worker ptr_dst_buf_imag[i][k2] +=
598*15dc779aSAndroid Build Coastguard Worker (a0i * ptr_src_buf_real[i - 1][k] + a0r * ptr_src_buf_imag[i - 1][k] +
599*15dc779aSAndroid Build Coastguard Worker a1i * ptr_src_buf_real[i - 2][k] + a1r * ptr_src_buf_imag[i - 2][k]) *
600*15dc779aSAndroid Build Coastguard Worker gain;
601*15dc779aSAndroid Build Coastguard Worker }
602*15dc779aSAndroid Build Coastguard Worker }
603*15dc779aSAndroid Build Coastguard Worker }
604*15dc779aSAndroid Build Coastguard Worker sb += num_bands_in_patch;
605*15dc779aSAndroid Build Coastguard Worker patch++;
606*15dc779aSAndroid Build Coastguard Worker }
607*15dc779aSAndroid Build Coastguard Worker }
608*15dc779aSAndroid Build Coastguard Worker
609*15dc779aSAndroid Build Coastguard Worker if (hbe_flag && !sbr_patching_mode) {
610*15dc779aSAndroid Build Coastguard Worker FLOAT32 alpha_real[2], alpha_imag[2];
611*15dc779aSAndroid Build Coastguard Worker
612*15dc779aSAndroid Build Coastguard Worker bw_index = 0, patch = 1;
613*15dc779aSAndroid Build Coastguard Worker if (NULL == ptr_ph_vocod_buf_real || NULL == ptr_ph_vocod_buf_imag) {
614*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_NONFATAL_ESBR_INVALID_VOCOD_BUF;
615*15dc779aSAndroid Build Coastguard Worker }
616*15dc779aSAndroid Build Coastguard Worker
617*15dc779aSAndroid Build Coastguard Worker for (k2 = sub_band_start; k2 < ptr_master_tab[num_mf_bands]; k2++) {
618*15dc779aSAndroid Build Coastguard Worker ixheaace_esbr_calc_co_variance(&str_auto_corr, &ptr_ph_vocod_buf_real[0],
619*15dc779aSAndroid Build Coastguard Worker &ptr_ph_vocod_buf_imag[0], k2, co_var_len);
620*15dc779aSAndroid Build Coastguard Worker
621*15dc779aSAndroid Build Coastguard Worker if (str_auto_corr.det == 0.0f) {
622*15dc779aSAndroid Build Coastguard Worker alpha_real[1] = alpha_imag[1] = 0;
623*15dc779aSAndroid Build Coastguard Worker } else {
624*15dc779aSAndroid Build Coastguard Worker fac = 1.0f / str_auto_corr.det;
625*15dc779aSAndroid Build Coastguard Worker alpha_real[1] = (str_auto_corr.phi_0_1_real * str_auto_corr.phi_1_2_real -
626*15dc779aSAndroid Build Coastguard Worker str_auto_corr.phi_0_1_imag * str_auto_corr.phi_1_2_imag -
627*15dc779aSAndroid Build Coastguard Worker str_auto_corr.phi_0_2_real * str_auto_corr.phi_1_1) *
628*15dc779aSAndroid Build Coastguard Worker fac;
629*15dc779aSAndroid Build Coastguard Worker alpha_imag[1] = (str_auto_corr.phi_0_1_imag * str_auto_corr.phi_1_2_real +
630*15dc779aSAndroid Build Coastguard Worker str_auto_corr.phi_0_1_real * str_auto_corr.phi_1_2_imag -
631*15dc779aSAndroid Build Coastguard Worker str_auto_corr.phi_0_2_imag * str_auto_corr.phi_1_1) *
632*15dc779aSAndroid Build Coastguard Worker fac;
633*15dc779aSAndroid Build Coastguard Worker }
634*15dc779aSAndroid Build Coastguard Worker
635*15dc779aSAndroid Build Coastguard Worker if (str_auto_corr.phi_1_1 == 0) {
636*15dc779aSAndroid Build Coastguard Worker alpha_real[0] = alpha_imag[0] = 0;
637*15dc779aSAndroid Build Coastguard Worker } else {
638*15dc779aSAndroid Build Coastguard Worker fac = 1.0f / str_auto_corr.phi_1_1;
639*15dc779aSAndroid Build Coastguard Worker alpha_real[0] =
640*15dc779aSAndroid Build Coastguard Worker -(str_auto_corr.phi_0_1_real + alpha_real[1] * str_auto_corr.phi_1_2_real +
641*15dc779aSAndroid Build Coastguard Worker alpha_imag[1] * str_auto_corr.phi_1_2_imag) *
642*15dc779aSAndroid Build Coastguard Worker fac;
643*15dc779aSAndroid Build Coastguard Worker alpha_imag[0] =
644*15dc779aSAndroid Build Coastguard Worker -(str_auto_corr.phi_0_1_imag + alpha_imag[1] * str_auto_corr.phi_1_2_real -
645*15dc779aSAndroid Build Coastguard Worker alpha_real[1] * str_auto_corr.phi_1_2_imag) *
646*15dc779aSAndroid Build Coastguard Worker fac;
647*15dc779aSAndroid Build Coastguard Worker }
648*15dc779aSAndroid Build Coastguard Worker
649*15dc779aSAndroid Build Coastguard Worker if (alpha_real[0] * alpha_real[0] + alpha_imag[0] * alpha_imag[0] >= 16.0f ||
650*15dc779aSAndroid Build Coastguard Worker alpha_real[1] * alpha_real[1] + alpha_imag[1] * alpha_imag[1] >= 16.0f) {
651*15dc779aSAndroid Build Coastguard Worker alpha_real[0] = 0.0f;
652*15dc779aSAndroid Build Coastguard Worker alpha_imag[0] = 0.0f;
653*15dc779aSAndroid Build Coastguard Worker alpha_real[1] = 0.0f;
654*15dc779aSAndroid Build Coastguard Worker alpha_imag[1] = 0.0f;
655*15dc779aSAndroid Build Coastguard Worker }
656*15dc779aSAndroid Build Coastguard Worker
657*15dc779aSAndroid Build Coastguard Worker while (k2 >= ptr_invf_band_tbl[bw_index]) {
658*15dc779aSAndroid Build Coastguard Worker bw_index++;
659*15dc779aSAndroid Build Coastguard Worker if (bw_index >= IXHEAACE_MAX_NOISE_COEFFS) {
660*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_NONFATAL_ESBR_INVALID_BANDWIDTH_INDEX;
661*15dc779aSAndroid Build Coastguard Worker }
662*15dc779aSAndroid Build Coastguard Worker }
663*15dc779aSAndroid Build Coastguard Worker
664*15dc779aSAndroid Build Coastguard Worker if (bw_index >= IXHEAACE_MAX_NUM_PATCHES) {
665*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_NONFATAL_ESBR_INVALID_BANDWIDTH_INDEX;
666*15dc779aSAndroid Build Coastguard Worker }
667*15dc779aSAndroid Build Coastguard Worker bw = ptr_bw_array[bw_index];
668*15dc779aSAndroid Build Coastguard Worker
669*15dc779aSAndroid Build Coastguard Worker a0r = bw * alpha_real[0];
670*15dc779aSAndroid Build Coastguard Worker a0i = bw * alpha_imag[0];
671*15dc779aSAndroid Build Coastguard Worker bw *= bw;
672*15dc779aSAndroid Build Coastguard Worker a1r = bw * alpha_real[1];
673*15dc779aSAndroid Build Coastguard Worker a1i = bw * alpha_imag[1];
674*15dc779aSAndroid Build Coastguard Worker
675*15dc779aSAndroid Build Coastguard Worker if (bw > 0.0f) {
676*15dc779aSAndroid Build Coastguard Worker for (i = start_sample; i < end_sample; i++) {
677*15dc779aSAndroid Build Coastguard Worker FLOAT32 real1, imag1, real2, imag2;
678*15dc779aSAndroid Build Coastguard Worker
679*15dc779aSAndroid Build Coastguard Worker real1 = ptr_ph_vocod_buf_real[i - 1][k2];
680*15dc779aSAndroid Build Coastguard Worker imag1 = ptr_ph_vocod_buf_imag[i - 1][k2];
681*15dc779aSAndroid Build Coastguard Worker real2 = ptr_ph_vocod_buf_real[i - 2][k2];
682*15dc779aSAndroid Build Coastguard Worker imag2 = ptr_ph_vocod_buf_imag[i - 2][k2];
683*15dc779aSAndroid Build Coastguard Worker ptr_dst_buf_real[i][k2] = ptr_ph_vocod_buf_real[i][k2] +
684*15dc779aSAndroid Build Coastguard Worker ((a0r * real1 - a0i * imag1) + (a1r * real2 - a1i * imag2));
685*15dc779aSAndroid Build Coastguard Worker ptr_dst_buf_imag[i][k2] = ptr_ph_vocod_buf_imag[i][k2] +
686*15dc779aSAndroid Build Coastguard Worker ((a0i * real1 + a0r * imag1) + (a1i * real2 + a1r * imag2));
687*15dc779aSAndroid Build Coastguard Worker }
688*15dc779aSAndroid Build Coastguard Worker } else {
689*15dc779aSAndroid Build Coastguard Worker for (i = start_sample; i < end_sample; i++) {
690*15dc779aSAndroid Build Coastguard Worker ptr_dst_buf_real[i][k2] = ptr_ph_vocod_buf_real[i][k2];
691*15dc779aSAndroid Build Coastguard Worker ptr_dst_buf_imag[i][k2] = ptr_ph_vocod_buf_imag[i][k2];
692*15dc779aSAndroid Build Coastguard Worker }
693*15dc779aSAndroid Build Coastguard Worker }
694*15dc779aSAndroid Build Coastguard Worker }
695*15dc779aSAndroid Build Coastguard Worker }
696*15dc779aSAndroid Build Coastguard Worker if (patch >= (IXHEAACE_MAX_NUM_PATCHES + 1)) {
697*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_NONFATAL_ESBR_INVALID_NUM_PATCH;
698*15dc779aSAndroid Build Coastguard Worker }
699*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_if_bands; i++) {
700*15dc779aSAndroid Build Coastguard Worker ptr_bw_array_prev[i] = ptr_bw_array[i];
701*15dc779aSAndroid Build Coastguard Worker }
702*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
703*15dc779aSAndroid Build Coastguard Worker }
704*15dc779aSAndroid Build Coastguard Worker
ixheaace_process_inter_tes(ixheaace_str_inter_tes_params * pstr_tes_enc,WORD8 * ptr_scr)705*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaace_process_inter_tes(ixheaace_str_inter_tes_params *pstr_tes_enc,
706*15dc779aSAndroid Build Coastguard Worker WORD8 *ptr_scr) {
707*15dc779aSAndroid Build Coastguard Worker WORD32 gi = 0, env, tes_enable = 0, ts, bd, start_ts, stop_ts;
708*15dc779aSAndroid Build Coastguard Worker WORD32 is_sound_activity[IXHEAACE_MAX_ENVELOPES] = {0},
709*15dc779aSAndroid Build Coastguard Worker is_transient[IXHEAACE_MAX_ENVELOPES] = {0};
710*15dc779aSAndroid Build Coastguard Worker WORD32 tes_shape_mode = 0;
711*15dc779aSAndroid Build Coastguard Worker WORD32 num_samples, num_bands;
712*15dc779aSAndroid Build Coastguard Worker WORD32 len;
713*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE status = IA_NO_ERROR;
714*15dc779aSAndroid Build Coastguard Worker FLOAT32 energy_high[64] = {0};
715*15dc779aSAndroid Build Coastguard Worker FLOAT32 energy[64] = {0};
716*15dc779aSAndroid Build Coastguard Worker FLOAT32 gamma[IXHEAACE_ESBR_NUM_GAMMA_IDXS] = {0};
717*15dc779aSAndroid Build Coastguard Worker FLOAT32 gamma_min = MAX_FLT_VAL;
718*15dc779aSAndroid Build Coastguard Worker ixheaace_str_inter_tes_scr *tes_scr = (ixheaace_str_inter_tes_scr *)ptr_scr;
719*15dc779aSAndroid Build Coastguard Worker num_bands = pstr_tes_enc->sub_band_end - pstr_tes_enc->sub_band_start;
720*15dc779aSAndroid Build Coastguard Worker
721*15dc779aSAndroid Build Coastguard Worker for (env = 0; env < pstr_tes_enc->num_env; env++) {
722*15dc779aSAndroid Build Coastguard Worker tes_shape_mode = 0;
723*15dc779aSAndroid Build Coastguard Worker len = 2 * (pstr_tes_enc->border_vec[env + 1] - pstr_tes_enc->border_vec[env]);
724*15dc779aSAndroid Build Coastguard Worker is_sound_activity[env] = ixheaace_inter_tes_sound_activity(
725*15dc779aSAndroid Build Coastguard Worker &pstr_tes_enc
726*15dc779aSAndroid Build Coastguard Worker ->qmf_buf_real[IXHEAACE_SBR_HF_ADJ_OFFSET + 2 * pstr_tes_enc->border_vec[env]],
727*15dc779aSAndroid Build Coastguard Worker &pstr_tes_enc
728*15dc779aSAndroid Build Coastguard Worker ->qmf_buf_imag[IXHEAACE_SBR_HF_ADJ_OFFSET + 2 * pstr_tes_enc->border_vec[env]],
729*15dc779aSAndroid Build Coastguard Worker &energy_high[IXHEAACE_SBR_HF_ADJ_OFFSET + 2 * pstr_tes_enc->border_vec[env]], len,
730*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->sub_band_start, pstr_tes_enc->sub_band_end, &is_transient[env]);
731*15dc779aSAndroid Build Coastguard Worker if (1 == is_transient[env] && 1 == is_sound_activity[env]) {
732*15dc779aSAndroid Build Coastguard Worker tes_enable = 1;
733*15dc779aSAndroid Build Coastguard Worker }
734*15dc779aSAndroid Build Coastguard Worker }
735*15dc779aSAndroid Build Coastguard Worker
736*15dc779aSAndroid Build Coastguard Worker if (1 == tes_enable) {
737*15dc779aSAndroid Build Coastguard Worker status = ixheaace_generate_hf(&pstr_tes_enc->qmf_buf_real[IXHEAACE_SBR_HF_ADJ_OFFSET],
738*15dc779aSAndroid Build Coastguard Worker &pstr_tes_enc->qmf_buf_imag[IXHEAACE_SBR_HF_ADJ_OFFSET], NULL,
739*15dc779aSAndroid Build Coastguard Worker NULL, &tes_scr->dst_qmf_r[IXHEAACE_SBR_HF_ADJ_OFFSET],
740*15dc779aSAndroid Build Coastguard Worker &tes_scr->dst_qmf_i[IXHEAACE_SBR_HF_ADJ_OFFSET], pstr_tes_enc);
741*15dc779aSAndroid Build Coastguard Worker
742*15dc779aSAndroid Build Coastguard Worker if (status) {
743*15dc779aSAndroid Build Coastguard Worker return status;
744*15dc779aSAndroid Build Coastguard Worker }
745*15dc779aSAndroid Build Coastguard Worker for (env = 0; env < pstr_tes_enc->num_env; env++) {
746*15dc779aSAndroid Build Coastguard Worker if ((1 == is_sound_activity[env]) && (1 == is_transient[env])) {
747*15dc779aSAndroid Build Coastguard Worker num_samples = (pstr_tes_enc->border_vec[env + 1] - pstr_tes_enc->border_vec[env]) * 2;
748*15dc779aSAndroid Build Coastguard Worker start_ts = IXHEAACE_SBR_HF_ADJ_OFFSET + pstr_tes_enc->border_vec[env] * 2;
749*15dc779aSAndroid Build Coastguard Worker stop_ts = start_ts + num_samples;
750*15dc779aSAndroid Build Coastguard Worker
751*15dc779aSAndroid Build Coastguard Worker for (gi = 0; gi < IXHEAACE_ESBR_NUM_GAMMA_IDXS; gi++) {
752*15dc779aSAndroid Build Coastguard Worker ixheaace_apply_inter_tes(
753*15dc779aSAndroid Build Coastguard Worker &tes_scr
754*15dc779aSAndroid Build Coastguard Worker ->dst_qmf_r[IXHEAACE_SBR_HF_ADJ_OFFSET + 2 * pstr_tes_enc->border_vec[env]][0],
755*15dc779aSAndroid Build Coastguard Worker &tes_scr
756*15dc779aSAndroid Build Coastguard Worker ->dst_qmf_i[IXHEAACE_SBR_HF_ADJ_OFFSET + 2 * pstr_tes_enc->border_vec[env]][0],
757*15dc779aSAndroid Build Coastguard Worker &pstr_tes_enc->qmf_buf_real[IXHEAACE_SBR_HF_ADJ_OFFSET +
758*15dc779aSAndroid Build Coastguard Worker 2 * pstr_tes_enc->border_vec[env]][0],
759*15dc779aSAndroid Build Coastguard Worker &pstr_tes_enc->qmf_buf_imag[IXHEAACE_SBR_HF_ADJ_OFFSET +
760*15dc779aSAndroid Build Coastguard Worker 2 * pstr_tes_enc->border_vec[env]][0],
761*15dc779aSAndroid Build Coastguard Worker num_samples, pstr_tes_enc->sub_band_start, num_bands, gi);
762*15dc779aSAndroid Build Coastguard Worker for (ts = start_ts; ts < stop_ts; ts++) {
763*15dc779aSAndroid Build Coastguard Worker energy[ts] = 0.0f;
764*15dc779aSAndroid Build Coastguard Worker for (bd = pstr_tes_enc->sub_band_start; bd < pstr_tes_enc->sub_band_end; bd++) {
765*15dc779aSAndroid Build Coastguard Worker energy[ts] += tes_scr->dst_qmf_r[ts][bd] * tes_scr->dst_qmf_r[ts][bd];
766*15dc779aSAndroid Build Coastguard Worker energy[ts] += tes_scr->dst_qmf_i[ts][bd] * tes_scr->dst_qmf_i[ts][bd];
767*15dc779aSAndroid Build Coastguard Worker }
768*15dc779aSAndroid Build Coastguard Worker gamma[gi] += (FLOAT32)fabs(energy[ts] - energy_high[ts]) /
769*15dc779aSAndroid Build Coastguard Worker (FLOAT32)(pow((energy_high[ts] + 1e-6f), 0.9f));
770*15dc779aSAndroid Build Coastguard Worker }
771*15dc779aSAndroid Build Coastguard Worker if (gamma[gi] < gamma_min) {
772*15dc779aSAndroid Build Coastguard Worker gamma_min = gamma[gi];
773*15dc779aSAndroid Build Coastguard Worker tes_shape_mode = gi;
774*15dc779aSAndroid Build Coastguard Worker }
775*15dc779aSAndroid Build Coastguard Worker }
776*15dc779aSAndroid Build Coastguard Worker }
777*15dc779aSAndroid Build Coastguard Worker
778*15dc779aSAndroid Build Coastguard Worker if (tes_shape_mode > 0) {
779*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->bs_tes_shape[env] = 1;
780*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->bs_tes_shape_mode[env] = tes_shape_mode;
781*15dc779aSAndroid Build Coastguard Worker } else {
782*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->bs_tes_shape[env] = 0;
783*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->bs_tes_shape_mode[env] = 0;
784*15dc779aSAndroid Build Coastguard Worker }
785*15dc779aSAndroid Build Coastguard Worker }
786*15dc779aSAndroid Build Coastguard Worker } else {
787*15dc779aSAndroid Build Coastguard Worker for (env = 0; env < pstr_tes_enc->num_env; env++) {
788*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->bs_tes_shape[env] = 0;
789*15dc779aSAndroid Build Coastguard Worker pstr_tes_enc->bs_tes_shape_mode[env] = 0;
790*15dc779aSAndroid Build Coastguard Worker }
791*15dc779aSAndroid Build Coastguard Worker }
792*15dc779aSAndroid Build Coastguard Worker return status;
793*15dc779aSAndroid Build Coastguard Worker }
794