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 <math.h>
22*15dc779aSAndroid Build Coastguard Worker #include <string.h>
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_common_define.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
25*15dc779aSAndroid Build Coastguard Worker #include "iusace_cnst.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
27*15dc779aSAndroid Build Coastguard Worker #include "iusace_bitbuffer.h"
28*15dc779aSAndroid Build Coastguard Worker #include "iusace_tns_usac.h"
29*15dc779aSAndroid Build Coastguard Worker #include "iusace_psy_mod.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
35*15dc779aSAndroid Build Coastguard Worker
36*15dc779aSAndroid Build Coastguard Worker static const WORD32 iusace_tns_supported_sampling_rates[13] = {
37*15dc779aSAndroid Build Coastguard Worker 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 0};
38*15dc779aSAndroid Build Coastguard Worker
39*15dc779aSAndroid Build Coastguard Worker static const UWORD16 iusace_tns_min_band_number_long[12] = {11, 12, 15, 16, 17, 20,
40*15dc779aSAndroid Build Coastguard Worker 25, 26, 24, 28, 30, 31};
41*15dc779aSAndroid Build Coastguard Worker
42*15dc779aSAndroid Build Coastguard Worker static const UWORD16 iusace_tns_min_band_number_short[12] = {2, 2, 2, 3, 3, 4,
43*15dc779aSAndroid Build Coastguard Worker 6, 6, 8, 10, 10, 12};
44*15dc779aSAndroid Build Coastguard Worker
45*15dc779aSAndroid Build Coastguard Worker static const WORD32 iusace_tns_max_bands_table[16][2] = {{31, 9}, /**< 96000 */
46*15dc779aSAndroid Build Coastguard Worker {31, 9}, /**< 88200 */
47*15dc779aSAndroid Build Coastguard Worker {34, 10}, /**< 64000 */
48*15dc779aSAndroid Build Coastguard Worker {40, 14}, /**< 48000 */
49*15dc779aSAndroid Build Coastguard Worker {42, 14}, /**< 44100 */
50*15dc779aSAndroid Build Coastguard Worker {51, 14}, /**< 32000 */
51*15dc779aSAndroid Build Coastguard Worker {47, 15}, /**< 24000 */
52*15dc779aSAndroid Build Coastguard Worker {47, 15}, /**< 22050 */
53*15dc779aSAndroid Build Coastguard Worker {43, 15}, /**< 16000 */
54*15dc779aSAndroid Build Coastguard Worker {43, 15}, /**< 12000 */
55*15dc779aSAndroid Build Coastguard Worker {43, 15}, /**< 11025 */
56*15dc779aSAndroid Build Coastguard Worker {40, 15}, /**< 8000 */
57*15dc779aSAndroid Build Coastguard Worker {40, 15}, /**< 7350 */
58*15dc779aSAndroid Build Coastguard Worker {0, 0}, {0, 0}, {0, 0}};
59*15dc779aSAndroid Build Coastguard Worker
iusace_freq_to_band_mapping(WORD32 freq,WORD32 sample_rate,WORD32 num_bands,const WORD32 * ptr_band_start_offset)60*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_freq_to_band_mapping(WORD32 freq, WORD32 sample_rate, WORD32 num_bands,
61*15dc779aSAndroid Build Coastguard Worker const WORD32 *ptr_band_start_offset) {
62*15dc779aSAndroid Build Coastguard Worker WORD32 line_num, band;
63*15dc779aSAndroid Build Coastguard Worker
64*15dc779aSAndroid Build Coastguard Worker line_num = (freq * ptr_band_start_offset[num_bands] * 4 / sample_rate + 1) / 2;
65*15dc779aSAndroid Build Coastguard Worker
66*15dc779aSAndroid Build Coastguard Worker if (line_num >= ptr_band_start_offset[num_bands]) {
67*15dc779aSAndroid Build Coastguard Worker return num_bands;
68*15dc779aSAndroid Build Coastguard Worker }
69*15dc779aSAndroid Build Coastguard Worker
70*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < num_bands; band++) {
71*15dc779aSAndroid Build Coastguard Worker if (ptr_band_start_offset[band + 1] > line_num) break;
72*15dc779aSAndroid Build Coastguard Worker }
73*15dc779aSAndroid Build Coastguard Worker
74*15dc779aSAndroid Build Coastguard Worker if (line_num - ptr_band_start_offset[band] > ptr_band_start_offset[band + 1] - line_num) {
75*15dc779aSAndroid Build Coastguard Worker band++;
76*15dc779aSAndroid Build Coastguard Worker }
77*15dc779aSAndroid Build Coastguard Worker
78*15dc779aSAndroid Build Coastguard Worker return band;
79*15dc779aSAndroid Build Coastguard Worker };
80*15dc779aSAndroid Build Coastguard Worker
iusace_calc_gauss_win(FLOAT64 * ptr_win,const WORD32 length,const WORD32 sample_rate,const WORD32 win_seq,const FLOAT32 time_resolution)81*15dc779aSAndroid Build Coastguard Worker static VOID iusace_calc_gauss_win(FLOAT64 *ptr_win, const WORD32 length, const WORD32 sample_rate,
82*15dc779aSAndroid Build Coastguard Worker const WORD32 win_seq, const FLOAT32 time_resolution) {
83*15dc779aSAndroid Build Coastguard Worker WORD32 i;
84*15dc779aSAndroid Build Coastguard Worker FLOAT32 gauss_exp = 3.14159265358979323f * sample_rate * 0.001f * (FLOAT32)time_resolution /
85*15dc779aSAndroid Build Coastguard Worker (win_seq != EIGHT_SHORT_SEQUENCE ? 1024.0f : 128.0f);
86*15dc779aSAndroid Build Coastguard Worker
87*15dc779aSAndroid Build Coastguard Worker gauss_exp = -0.5f * gauss_exp * gauss_exp;
88*15dc779aSAndroid Build Coastguard Worker
89*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < length; i++) {
90*15dc779aSAndroid Build Coastguard Worker ptr_win[i] = (FLOAT32)exp(gauss_exp * (i + 0.5) * (i + 0.5));
91*15dc779aSAndroid Build Coastguard Worker }
92*15dc779aSAndroid Build Coastguard Worker return;
93*15dc779aSAndroid Build Coastguard Worker }
94*15dc779aSAndroid Build Coastguard Worker
iusace_tns_init(WORD32 sampling_rate,WORD32 bit_rate,ia_tns_info * tns_info,WORD32 num_channels)95*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE iusace_tns_init(WORD32 sampling_rate, WORD32 bit_rate, ia_tns_info *tns_info,
96*15dc779aSAndroid Build Coastguard Worker WORD32 num_channels) {
97*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code = IA_NO_ERROR;
98*15dc779aSAndroid Build Coastguard Worker WORD32 fs_index = 0;
99*15dc779aSAndroid Build Coastguard Worker WORD32 lpc_stop_freq = 16000;
100*15dc779aSAndroid Build Coastguard Worker WORD32 lpc_start_freq_long = 2500, lpc_start_freq_short = 3750;
101*15dc779aSAndroid Build Coastguard Worker tns_info->threshold = 1.41f;
102*15dc779aSAndroid Build Coastguard Worker tns_info->tns_time_res_short = 0.6f;
103*15dc779aSAndroid Build Coastguard Worker tns_info->tns_time_res_long = 0.6f;
104*15dc779aSAndroid Build Coastguard Worker
105*15dc779aSAndroid Build Coastguard Worker if (sampling_rate == 14700) {
106*15dc779aSAndroid Build Coastguard Worker sampling_rate = 16000;
107*15dc779aSAndroid Build Coastguard Worker }
108*15dc779aSAndroid Build Coastguard Worker if (sampling_rate == 29400) {
109*15dc779aSAndroid Build Coastguard Worker sampling_rate = 32000;
110*15dc779aSAndroid Build Coastguard Worker }
111*15dc779aSAndroid Build Coastguard Worker
112*15dc779aSAndroid Build Coastguard Worker if (bit_rate < 32000) {
113*15dc779aSAndroid Build Coastguard Worker if (num_channels == 1) {
114*15dc779aSAndroid Build Coastguard Worker tns_info->threshold = 1.2f;
115*15dc779aSAndroid Build Coastguard Worker lpc_start_freq_long = 2000;
116*15dc779aSAndroid Build Coastguard Worker }
117*15dc779aSAndroid Build Coastguard Worker } else if (bit_rate < 36000) {
118*15dc779aSAndroid Build Coastguard Worker if (num_channels == 1) {
119*15dc779aSAndroid Build Coastguard Worker tns_info->tns_time_res_long = 0.8f;
120*15dc779aSAndroid Build Coastguard Worker } else {
121*15dc779aSAndroid Build Coastguard Worker tns_info->tns_time_res_long = 0.5f;
122*15dc779aSAndroid Build Coastguard Worker }
123*15dc779aSAndroid Build Coastguard Worker tns_info->tns_time_res_short = 0.3f;
124*15dc779aSAndroid Build Coastguard Worker } else {
125*15dc779aSAndroid Build Coastguard Worker tns_info->tns_time_res_long = 0.5f;
126*15dc779aSAndroid Build Coastguard Worker tns_info->tns_time_res_short = 0.3f;
127*15dc779aSAndroid Build Coastguard Worker }
128*15dc779aSAndroid Build Coastguard Worker
129*15dc779aSAndroid Build Coastguard Worker /** Determine if sampling rate is supported
130*15dc779aSAndroid Build Coastguard Worker */
131*15dc779aSAndroid Build Coastguard Worker while (sampling_rate != iusace_tns_supported_sampling_rates[fs_index]) {
132*15dc779aSAndroid Build Coastguard Worker if (!iusace_tns_supported_sampling_rates[fs_index]) {
133*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_USAC_INVALID_CORE_SAMPLE_RATE;
134*15dc779aSAndroid Build Coastguard Worker }
135*15dc779aSAndroid Build Coastguard Worker fs_index++;
136*15dc779aSAndroid Build Coastguard Worker }
137*15dc779aSAndroid Build Coastguard Worker
138*15dc779aSAndroid Build Coastguard Worker tns_info->tns_max_bands_long = iusace_tns_max_bands_table[fs_index][0];
139*15dc779aSAndroid Build Coastguard Worker tns_info->tns_max_bands_short = iusace_tns_max_bands_table[fs_index][1];
140*15dc779aSAndroid Build Coastguard Worker tns_info->tns_max_order_long = 15;
141*15dc779aSAndroid Build Coastguard Worker tns_info->tns_max_order_short = 7;
142*15dc779aSAndroid Build Coastguard Worker
143*15dc779aSAndroid Build Coastguard Worker tns_info->tns_min_band_number_long = iusace_tns_min_band_number_long[fs_index];
144*15dc779aSAndroid Build Coastguard Worker tns_info->tns_min_band_number_short = iusace_tns_min_band_number_short[fs_index];
145*15dc779aSAndroid Build Coastguard Worker
146*15dc779aSAndroid Build Coastguard Worker tns_info->lpc_start_band_long =
147*15dc779aSAndroid Build Coastguard Worker iusace_freq_to_band_mapping(lpc_start_freq_long, sampling_rate, tns_info->max_sfb_long,
148*15dc779aSAndroid Build Coastguard Worker tns_info->sfb_offset_table_long);
149*15dc779aSAndroid Build Coastguard Worker
150*15dc779aSAndroid Build Coastguard Worker tns_info->lpc_start_band_short =
151*15dc779aSAndroid Build Coastguard Worker iusace_freq_to_band_mapping(lpc_start_freq_short, sampling_rate, tns_info->max_sfb_short,
152*15dc779aSAndroid Build Coastguard Worker tns_info->sfb_offset_table_short);
153*15dc779aSAndroid Build Coastguard Worker
154*15dc779aSAndroid Build Coastguard Worker tns_info->lpc_stop_band_long = iusace_freq_to_band_mapping(
155*15dc779aSAndroid Build Coastguard Worker lpc_stop_freq, sampling_rate, tns_info->max_sfb_long, tns_info->sfb_offset_table_long);
156*15dc779aSAndroid Build Coastguard Worker
157*15dc779aSAndroid Build Coastguard Worker tns_info->lpc_stop_band_short = iusace_freq_to_band_mapping(
158*15dc779aSAndroid Build Coastguard Worker lpc_stop_freq, sampling_rate, tns_info->max_sfb_short, tns_info->sfb_offset_table_short);
159*15dc779aSAndroid Build Coastguard Worker
160*15dc779aSAndroid Build Coastguard Worker iusace_calc_gauss_win(tns_info->win_long, tns_info->tns_max_order_long + 1, sampling_rate,
161*15dc779aSAndroid Build Coastguard Worker ONLY_LONG_SEQUENCE, tns_info->tns_time_res_long);
162*15dc779aSAndroid Build Coastguard Worker
163*15dc779aSAndroid Build Coastguard Worker iusace_calc_gauss_win(tns_info->win_short, tns_info->tns_max_order_short + 1, sampling_rate,
164*15dc779aSAndroid Build Coastguard Worker EIGHT_SHORT_SEQUENCE, tns_info->tns_time_res_short);
165*15dc779aSAndroid Build Coastguard Worker return err_code;
166*15dc779aSAndroid Build Coastguard Worker }
167*15dc779aSAndroid Build Coastguard Worker
iusace_tns_filter(WORD32 length,FLOAT64 * spec,ia_tns_filter_data * filter,FLOAT64 * scratch_tns_filter)168*15dc779aSAndroid Build Coastguard Worker VOID iusace_tns_filter(WORD32 length, FLOAT64 *spec, ia_tns_filter_data *filter,
169*15dc779aSAndroid Build Coastguard Worker FLOAT64 *scratch_tns_filter) {
170*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, k = 0;
171*15dc779aSAndroid Build Coastguard Worker WORD32 order = filter->order;
172*15dc779aSAndroid Build Coastguard Worker FLOAT64 *a = filter->a_coeffs;
173*15dc779aSAndroid Build Coastguard Worker FLOAT64 *temp = scratch_tns_filter;
174*15dc779aSAndroid Build Coastguard Worker
175*15dc779aSAndroid Build Coastguard Worker /** Determine loop parameters for given direction
176*15dc779aSAndroid Build Coastguard Worker */
177*15dc779aSAndroid Build Coastguard Worker if (filter->direction) {
178*15dc779aSAndroid Build Coastguard Worker /** Startup, initial state is zero
179*15dc779aSAndroid Build Coastguard Worker */
180*15dc779aSAndroid Build Coastguard Worker temp[length - 1] = spec[length - 1];
181*15dc779aSAndroid Build Coastguard Worker for (i = length - 2; i > (length - 1 - order); i--) {
182*15dc779aSAndroid Build Coastguard Worker temp[i] = spec[i];
183*15dc779aSAndroid Build Coastguard Worker k++;
184*15dc779aSAndroid Build Coastguard Worker for (j = 1; j <= k; j++) {
185*15dc779aSAndroid Build Coastguard Worker spec[i] += temp[i + j] * a[j];
186*15dc779aSAndroid Build Coastguard Worker }
187*15dc779aSAndroid Build Coastguard Worker }
188*15dc779aSAndroid Build Coastguard Worker
189*15dc779aSAndroid Build Coastguard Worker /** Now filter the rest
190*15dc779aSAndroid Build Coastguard Worker */
191*15dc779aSAndroid Build Coastguard Worker for (i = length - 1 - order; i >= 0; i--) {
192*15dc779aSAndroid Build Coastguard Worker temp[i] = spec[i];
193*15dc779aSAndroid Build Coastguard Worker for (j = 1; j <= order; j++) {
194*15dc779aSAndroid Build Coastguard Worker spec[i] += temp[i + j] * a[j];
195*15dc779aSAndroid Build Coastguard Worker }
196*15dc779aSAndroid Build Coastguard Worker }
197*15dc779aSAndroid Build Coastguard Worker } else {
198*15dc779aSAndroid Build Coastguard Worker /** Startup, initial state is zero
199*15dc779aSAndroid Build Coastguard Worker */
200*15dc779aSAndroid Build Coastguard Worker temp[0] = spec[0];
201*15dc779aSAndroid Build Coastguard Worker for (i = 1; i < order; i++) {
202*15dc779aSAndroid Build Coastguard Worker temp[i] = spec[i];
203*15dc779aSAndroid Build Coastguard Worker for (j = 1; j <= i; j++) {
204*15dc779aSAndroid Build Coastguard Worker spec[i] += temp[i - j] * a[j];
205*15dc779aSAndroid Build Coastguard Worker }
206*15dc779aSAndroid Build Coastguard Worker }
207*15dc779aSAndroid Build Coastguard Worker
208*15dc779aSAndroid Build Coastguard Worker /** Now filter the rest
209*15dc779aSAndroid Build Coastguard Worker */
210*15dc779aSAndroid Build Coastguard Worker for (i = order; i < length; i++) {
211*15dc779aSAndroid Build Coastguard Worker temp[i] = spec[i];
212*15dc779aSAndroid Build Coastguard Worker for (j = 1; j <= order; j++) {
213*15dc779aSAndroid Build Coastguard Worker spec[i] += temp[i - j] * a[j];
214*15dc779aSAndroid Build Coastguard Worker }
215*15dc779aSAndroid Build Coastguard Worker }
216*15dc779aSAndroid Build Coastguard Worker }
217*15dc779aSAndroid Build Coastguard Worker
218*15dc779aSAndroid Build Coastguard Worker return;
219*15dc779aSAndroid Build Coastguard Worker }
220*15dc779aSAndroid Build Coastguard Worker
iusace_truncate_coeffs(WORD32 f_order,FLOAT64 threshold,FLOAT64 * k_array)221*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_truncate_coeffs(WORD32 f_order, FLOAT64 threshold, FLOAT64 *k_array) {
222*15dc779aSAndroid Build Coastguard Worker WORD32 i;
223*15dc779aSAndroid Build Coastguard Worker for (i = f_order; i >= 0; i--) {
224*15dc779aSAndroid Build Coastguard Worker k_array[i] = (fabs(k_array[i]) > threshold) ? k_array[i] : 0.0;
225*15dc779aSAndroid Build Coastguard Worker if (k_array[i] != 0.0) {
226*15dc779aSAndroid Build Coastguard Worker return i;
227*15dc779aSAndroid Build Coastguard Worker }
228*15dc779aSAndroid Build Coastguard Worker }
229*15dc779aSAndroid Build Coastguard Worker return 0;
230*15dc779aSAndroid Build Coastguard Worker }
231*15dc779aSAndroid Build Coastguard Worker
iusace_quantize_reflection_coeffs(WORD32 f_order,WORD32 coeff_res,FLOAT64 * k_array,WORD32 * index_array)232*15dc779aSAndroid Build Coastguard Worker VOID iusace_quantize_reflection_coeffs(WORD32 f_order, WORD32 coeff_res, FLOAT64 *k_array,
233*15dc779aSAndroid Build Coastguard Worker WORD32 *index_array) {
234*15dc779aSAndroid Build Coastguard Worker FLOAT64 iqfac, iqfac_m;
235*15dc779aSAndroid Build Coastguard Worker WORD32 i;
236*15dc779aSAndroid Build Coastguard Worker
237*15dc779aSAndroid Build Coastguard Worker iqfac = (((SIZE_T)1 << (coeff_res - 1)) - 0.5) / (PI / 2);
238*15dc779aSAndroid Build Coastguard Worker iqfac_m = (((SIZE_T)1 << (coeff_res - 1)) + 0.5) / (PI / 2);
239*15dc779aSAndroid Build Coastguard Worker
240*15dc779aSAndroid Build Coastguard Worker /* Quantize and inverse quantize */
241*15dc779aSAndroid Build Coastguard Worker for (i = 1; i <= f_order; i++) {
242*15dc779aSAndroid Build Coastguard Worker index_array[i] = (WORD32)(0.5 + (asin(k_array[i]) * ((k_array[i] >= 0) ? iqfac : iqfac_m)));
243*15dc779aSAndroid Build Coastguard Worker k_array[i] = sin((FLOAT64)index_array[i] / ((index_array[i] >= 0) ? iqfac : iqfac_m));
244*15dc779aSAndroid Build Coastguard Worker }
245*15dc779aSAndroid Build Coastguard Worker return;
246*15dc779aSAndroid Build Coastguard Worker }
247*15dc779aSAndroid Build Coastguard Worker
iusace_tns_auto_corr(WORD32 max_order,WORD32 data_size,FLOAT64 * data,FLOAT64 * r_array)248*15dc779aSAndroid Build Coastguard Worker VOID iusace_tns_auto_corr(WORD32 max_order, WORD32 data_size, FLOAT64 *data, FLOAT64 *r_array) {
249*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
250*15dc779aSAndroid Build Coastguard Worker FLOAT64 tmp_var;
251*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < data_size; i += 2) {
252*15dc779aSAndroid Build Coastguard Worker const FLOAT64 *input1 = &data[i];
253*15dc779aSAndroid Build Coastguard Worker FLOAT64 temp1 = *input1;
254*15dc779aSAndroid Build Coastguard Worker FLOAT64 temp2 = *(input1 + 1);
255*15dc779aSAndroid Build Coastguard Worker FLOAT64 inp_tmp1 = *input1++;
256*15dc779aSAndroid Build Coastguard Worker for (j = 0; j <= max_order; j++) {
257*15dc779aSAndroid Build Coastguard Worker FLOAT64 inp_tmp2;
258*15dc779aSAndroid Build Coastguard Worker tmp_var = temp1 * inp_tmp1;
259*15dc779aSAndroid Build Coastguard Worker inp_tmp2 = *input1++;
260*15dc779aSAndroid Build Coastguard Worker tmp_var += temp2 * inp_tmp2;
261*15dc779aSAndroid Build Coastguard Worker r_array[j] += tmp_var;
262*15dc779aSAndroid Build Coastguard Worker j++;
263*15dc779aSAndroid Build Coastguard Worker tmp_var = temp1 * inp_tmp2;
264*15dc779aSAndroid Build Coastguard Worker inp_tmp1 = *input1++;
265*15dc779aSAndroid Build Coastguard Worker tmp_var += temp2 * inp_tmp1;
266*15dc779aSAndroid Build Coastguard Worker r_array[j] += tmp_var;
267*15dc779aSAndroid Build Coastguard Worker }
268*15dc779aSAndroid Build Coastguard Worker }
269*15dc779aSAndroid Build Coastguard Worker return;
270*15dc779aSAndroid Build Coastguard Worker }
271*15dc779aSAndroid Build Coastguard Worker
iusace_levinson_durbin(WORD32 order,WORD32 data_size,FLOAT64 * ptr_data,FLOAT64 * ptr_k,FLOAT64 * ptr_win,FLOAT64 * ptr_scratch)272*15dc779aSAndroid Build Coastguard Worker static FLOAT64 iusace_levinson_durbin(WORD32 order, WORD32 data_size, FLOAT64 *ptr_data,
273*15dc779aSAndroid Build Coastguard Worker FLOAT64 *ptr_k, FLOAT64 *ptr_win, FLOAT64 *ptr_scratch) {
274*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
275*15dc779aSAndroid Build Coastguard Worker FLOAT64 *ptr_work_buffer_temp;
276*15dc779aSAndroid Build Coastguard Worker FLOAT64 *ptr_work_buffer = ptr_scratch;
277*15dc779aSAndroid Build Coastguard Worker FLOAT64 *ptr_input = ptr_scratch + TNS_MAX_ORDER + 1;
278*15dc779aSAndroid Build Coastguard Worker memset(ptr_input, 0, (TNS_MAX_ORDER + 1) * sizeof(ptr_input[0]));
279*15dc779aSAndroid Build Coastguard Worker iusace_tns_auto_corr(order, data_size, ptr_data, ptr_input);
280*15dc779aSAndroid Build Coastguard Worker
281*15dc779aSAndroid Build Coastguard Worker WORD32 num_of_coeff = order;
282*15dc779aSAndroid Build Coastguard Worker FLOAT64 *ptr_refl_coeff = ptr_k;
283*15dc779aSAndroid Build Coastguard Worker ptr_k[0] = 1.0;
284*15dc779aSAndroid Build Coastguard Worker
285*15dc779aSAndroid Build Coastguard Worker if (ptr_input[0] == 0) {
286*15dc779aSAndroid Build Coastguard Worker return 0;
287*15dc779aSAndroid Build Coastguard Worker }
288*15dc779aSAndroid Build Coastguard Worker
289*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_of_coeff + 1; i++) {
290*15dc779aSAndroid Build Coastguard Worker ptr_input[i] = ptr_input[i] * ptr_win[i];
291*15dc779aSAndroid Build Coastguard Worker }
292*15dc779aSAndroid Build Coastguard Worker
293*15dc779aSAndroid Build Coastguard Worker FLOAT64 tmp_var;
294*15dc779aSAndroid Build Coastguard Worker ptr_work_buffer[0] = ptr_input[0];
295*15dc779aSAndroid Build Coastguard Worker
296*15dc779aSAndroid Build Coastguard Worker for (i = 1; i < num_of_coeff; i++) {
297*15dc779aSAndroid Build Coastguard Worker tmp_var = ptr_input[i];
298*15dc779aSAndroid Build Coastguard Worker ptr_work_buffer[i] = tmp_var;
299*15dc779aSAndroid Build Coastguard Worker ptr_work_buffer[i + num_of_coeff - 1] = tmp_var;
300*15dc779aSAndroid Build Coastguard Worker }
301*15dc779aSAndroid Build Coastguard Worker ptr_work_buffer[i + num_of_coeff - 1] = ptr_input[i];
302*15dc779aSAndroid Build Coastguard Worker
303*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_of_coeff; i++) {
304*15dc779aSAndroid Build Coastguard Worker FLOAT64 refc, tmp;
305*15dc779aSAndroid Build Coastguard Worker tmp = ptr_work_buffer[num_of_coeff + i];
306*15dc779aSAndroid Build Coastguard Worker if (tmp < 0) {
307*15dc779aSAndroid Build Coastguard Worker tmp = -tmp;
308*15dc779aSAndroid Build Coastguard Worker } else {
309*15dc779aSAndroid Build Coastguard Worker if (ptr_work_buffer[0] < tmp) {
310*15dc779aSAndroid Build Coastguard Worker break;
311*15dc779aSAndroid Build Coastguard Worker }
312*15dc779aSAndroid Build Coastguard Worker }
313*15dc779aSAndroid Build Coastguard Worker if (ptr_work_buffer[0] == 0) {
314*15dc779aSAndroid Build Coastguard Worker refc = 0;
315*15dc779aSAndroid Build Coastguard Worker } else {
316*15dc779aSAndroid Build Coastguard Worker refc = tmp / ptr_work_buffer[0];
317*15dc779aSAndroid Build Coastguard Worker }
318*15dc779aSAndroid Build Coastguard Worker
319*15dc779aSAndroid Build Coastguard Worker if (ptr_work_buffer[num_of_coeff + i] > 0) {
320*15dc779aSAndroid Build Coastguard Worker refc = -refc;
321*15dc779aSAndroid Build Coastguard Worker }
322*15dc779aSAndroid Build Coastguard Worker ptr_refl_coeff[i + 1] = refc;
323*15dc779aSAndroid Build Coastguard Worker ptr_work_buffer_temp = &(ptr_work_buffer[num_of_coeff]);
324*15dc779aSAndroid Build Coastguard Worker
325*15dc779aSAndroid Build Coastguard Worker for (j = i; j < num_of_coeff; j++) {
326*15dc779aSAndroid Build Coastguard Worker FLOAT64 accu1, accu2;
327*15dc779aSAndroid Build Coastguard Worker accu1 = refc * ptr_work_buffer[j - i];
328*15dc779aSAndroid Build Coastguard Worker accu1 += ptr_work_buffer_temp[j];
329*15dc779aSAndroid Build Coastguard Worker accu2 = refc * ptr_work_buffer_temp[j];
330*15dc779aSAndroid Build Coastguard Worker accu2 += ptr_work_buffer[j - i];
331*15dc779aSAndroid Build Coastguard Worker ptr_work_buffer_temp[j] = accu1;
332*15dc779aSAndroid Build Coastguard Worker ptr_work_buffer[j - i] = accu2;
333*15dc779aSAndroid Build Coastguard Worker }
334*15dc779aSAndroid Build Coastguard Worker }
335*15dc779aSAndroid Build Coastguard Worker return (ptr_input[0] / ptr_work_buffer[0]);
336*15dc779aSAndroid Build Coastguard Worker }
337*15dc779aSAndroid Build Coastguard Worker
iusace_step_up(WORD32 f_order,FLOAT64 * ptr_k,FLOAT64 * ptr_a,FLOAT64 * ptr_scratch)338*15dc779aSAndroid Build Coastguard Worker static VOID iusace_step_up(WORD32 f_order, FLOAT64 *ptr_k, FLOAT64 *ptr_a, FLOAT64 *ptr_scratch) {
339*15dc779aSAndroid Build Coastguard Worker FLOAT64 *ptr_a_temp = ptr_scratch;
340*15dc779aSAndroid Build Coastguard Worker WORD32 i, order;
341*15dc779aSAndroid Build Coastguard Worker
342*15dc779aSAndroid Build Coastguard Worker ptr_a[0] = 1.0;
343*15dc779aSAndroid Build Coastguard Worker ptr_a_temp[0] = 1.0;
344*15dc779aSAndroid Build Coastguard Worker for (order = 1; order <= f_order; order++) {
345*15dc779aSAndroid Build Coastguard Worker ptr_a[order] = 0.0;
346*15dc779aSAndroid Build Coastguard Worker for (i = 1; i <= order; i++) {
347*15dc779aSAndroid Build Coastguard Worker ptr_a_temp[i] = ptr_a[i] + ptr_k[order] * ptr_a[order - i];
348*15dc779aSAndroid Build Coastguard Worker }
349*15dc779aSAndroid Build Coastguard Worker for (i = 1; i <= order; i++) {
350*15dc779aSAndroid Build Coastguard Worker ptr_a[i] = ptr_a_temp[i];
351*15dc779aSAndroid Build Coastguard Worker }
352*15dc779aSAndroid Build Coastguard Worker }
353*15dc779aSAndroid Build Coastguard Worker return;
354*15dc779aSAndroid Build Coastguard Worker }
355*15dc779aSAndroid Build Coastguard Worker
iusace_calc_weighted_spec(FLOAT64 * ptr_spec,FLOAT64 * ptr_wgt_spec,FLOAT32 * ptr_sfb_en,WORD32 * ptr_sfb_offset,WORD32 lpc_start_band,WORD32 lpc_stop_band,FLOAT64 * ptr_scratch)356*15dc779aSAndroid Build Coastguard Worker static VOID iusace_calc_weighted_spec(FLOAT64 *ptr_spec, FLOAT64 *ptr_wgt_spec,
357*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_sfb_en, WORD32 *ptr_sfb_offset,
358*15dc779aSAndroid Build Coastguard Worker WORD32 lpc_start_band, WORD32 lpc_stop_band,
359*15dc779aSAndroid Build Coastguard Worker FLOAT64 *ptr_scratch) {
360*15dc779aSAndroid Build Coastguard Worker WORD32 i, sfb;
361*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp;
362*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_tns_sfb_mean = (FLOAT32 *)ptr_scratch;
363*15dc779aSAndroid Build Coastguard Worker memset(ptr_scratch, 0, MAX_NUM_GROUPED_SFB * sizeof(ptr_tns_sfb_mean[0]));
364*15dc779aSAndroid Build Coastguard Worker WORD32 lpc_stop_line = ptr_sfb_offset[lpc_stop_band];
365*15dc779aSAndroid Build Coastguard Worker WORD32 lpc_start_line = ptr_sfb_offset[lpc_start_band];
366*15dc779aSAndroid Build Coastguard Worker
367*15dc779aSAndroid Build Coastguard Worker for (sfb = lpc_start_band; sfb < lpc_stop_band; sfb++) {
368*15dc779aSAndroid Build Coastguard Worker ptr_tns_sfb_mean[sfb] = (FLOAT32)(1.0 / sqrt(ptr_sfb_en[sfb] + 1e-30f));
369*15dc779aSAndroid Build Coastguard Worker }
370*15dc779aSAndroid Build Coastguard Worker
371*15dc779aSAndroid Build Coastguard Worker sfb = lpc_start_band;
372*15dc779aSAndroid Build Coastguard Worker temp = ptr_tns_sfb_mean[sfb];
373*15dc779aSAndroid Build Coastguard Worker
374*15dc779aSAndroid Build Coastguard Worker for (i = lpc_start_line; i < lpc_stop_line; i++) {
375*15dc779aSAndroid Build Coastguard Worker if (ptr_sfb_offset[sfb + 1] == i) {
376*15dc779aSAndroid Build Coastguard Worker sfb++;
377*15dc779aSAndroid Build Coastguard Worker
378*15dc779aSAndroid Build Coastguard Worker if (sfb + 1 < lpc_stop_band) {
379*15dc779aSAndroid Build Coastguard Worker temp = ptr_tns_sfb_mean[sfb];
380*15dc779aSAndroid Build Coastguard Worker }
381*15dc779aSAndroid Build Coastguard Worker }
382*15dc779aSAndroid Build Coastguard Worker ptr_wgt_spec[i] = temp;
383*15dc779aSAndroid Build Coastguard Worker }
384*15dc779aSAndroid Build Coastguard Worker
385*15dc779aSAndroid Build Coastguard Worker for (i = lpc_stop_line - 2; i >= lpc_start_line; i--) {
386*15dc779aSAndroid Build Coastguard Worker ptr_wgt_spec[i] = (ptr_wgt_spec[i] + ptr_wgt_spec[i + 1]) * 0.5f;
387*15dc779aSAndroid Build Coastguard Worker }
388*15dc779aSAndroid Build Coastguard Worker
389*15dc779aSAndroid Build Coastguard Worker for (i = lpc_start_line + 1; i < lpc_stop_line; i++) {
390*15dc779aSAndroid Build Coastguard Worker ptr_wgt_spec[i] = (ptr_wgt_spec[i] + ptr_wgt_spec[i - 1]) * 0.5f;
391*15dc779aSAndroid Build Coastguard Worker }
392*15dc779aSAndroid Build Coastguard Worker
393*15dc779aSAndroid Build Coastguard Worker for (i = lpc_start_line; i < lpc_stop_line; i++) {
394*15dc779aSAndroid Build Coastguard Worker ptr_wgt_spec[i] = ptr_wgt_spec[i] * ptr_spec[i];
395*15dc779aSAndroid Build Coastguard Worker }
396*15dc779aSAndroid Build Coastguard Worker return;
397*15dc779aSAndroid Build Coastguard Worker }
398*15dc779aSAndroid Build Coastguard Worker
iusace_tns_data_sync(ia_tns_info * ptr_tns_dest,ia_tns_info * ptr_tns_src,const WORD32 w,WORD32 order)399*15dc779aSAndroid Build Coastguard Worker VOID iusace_tns_data_sync(ia_tns_info *ptr_tns_dest, ia_tns_info *ptr_tns_src, const WORD32 w,
400*15dc779aSAndroid Build Coastguard Worker WORD32 order) {
401*15dc779aSAndroid Build Coastguard Worker ia_tns_window_data *win_data_src = &ptr_tns_src->window_data[w];
402*15dc779aSAndroid Build Coastguard Worker ia_tns_window_data *win_data_dest = &ptr_tns_dest->window_data[w];
403*15dc779aSAndroid Build Coastguard Worker WORD32 i;
404*15dc779aSAndroid Build Coastguard Worker if (fabs(win_data_dest->tns_pred_gain - win_data_src->tns_pred_gain) <
405*15dc779aSAndroid Build Coastguard Worker ((FLOAT32)0.03f * win_data_dest->tns_pred_gain)) {
406*15dc779aSAndroid Build Coastguard Worker win_data_dest->tns_active = win_data_src->tns_active;
407*15dc779aSAndroid Build Coastguard Worker
408*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < order; i++) {
409*15dc779aSAndroid Build Coastguard Worker win_data_dest->tns_filter->k_coeffs[i] = win_data_src->tns_filter->k_coeffs[i];
410*15dc779aSAndroid Build Coastguard Worker }
411*15dc779aSAndroid Build Coastguard Worker }
412*15dc779aSAndroid Build Coastguard Worker return;
413*15dc779aSAndroid Build Coastguard Worker }
414*15dc779aSAndroid Build Coastguard Worker
iusace_tns_encode(ia_tns_info * pstr_tns_info_ch2,ia_tns_info * pstr_tns_info,FLOAT32 * ptr_sfb_energy,WORD32 w,WORD32 i_ch,WORD32 low_pass_line,FLOAT64 * ptr_scratch_tns_filter,WORD32 core_mode,FLOAT64 * ptr_tns_scratch)415*15dc779aSAndroid Build Coastguard Worker VOID iusace_tns_encode(ia_tns_info *pstr_tns_info_ch2, ia_tns_info *pstr_tns_info,
416*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_sfb_energy, WORD32 w, WORD32 i_ch, WORD32 low_pass_line,
417*15dc779aSAndroid Build Coastguard Worker FLOAT64 *ptr_scratch_tns_filter, WORD32 core_mode,
418*15dc779aSAndroid Build Coastguard Worker FLOAT64 *ptr_tns_scratch) {
419*15dc779aSAndroid Build Coastguard Worker WORD32 number_of_bands = pstr_tns_info->number_of_bands;
420*15dc779aSAndroid Build Coastguard Worker WORD32 block_type = pstr_tns_info->block_type;
421*15dc779aSAndroid Build Coastguard Worker FLOAT64 *ptr_spec = pstr_tns_info->spec;
422*15dc779aSAndroid Build Coastguard Worker WORD32 start_band, stop_band, order; /**< bands over which to apply TNS */
423*15dc779aSAndroid Build Coastguard Worker WORD32 length_in_bands; /**< Length to filter, in bands */
424*15dc779aSAndroid Build Coastguard Worker WORD32 start_index, length;
425*15dc779aSAndroid Build Coastguard Worker WORD32 nbands;
426*15dc779aSAndroid Build Coastguard Worker WORD32 coeff_res;
427*15dc779aSAndroid Build Coastguard Worker FLOAT64 *ptr_weighted_spec = ptr_tns_scratch;
428*15dc779aSAndroid Build Coastguard Worker memset(ptr_weighted_spec, 0, 4096 * sizeof(ptr_weighted_spec[0]));
429*15dc779aSAndroid Build Coastguard Worker FLOAT64 *ptr_scratch = ptr_tns_scratch + 4096;
430*15dc779aSAndroid Build Coastguard Worker FLOAT64 *ptr_window = NULL;
431*15dc779aSAndroid Build Coastguard Worker WORD32 lpc_start_band, lpc_stop_band;
432*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_sfb_offset_table;
433*15dc779aSAndroid Build Coastguard Worker
434*15dc779aSAndroid Build Coastguard Worker switch (block_type) {
435*15dc779aSAndroid Build Coastguard Worker case EIGHT_SHORT_SEQUENCE:
436*15dc779aSAndroid Build Coastguard Worker start_band = pstr_tns_info->tns_min_band_number_short;
437*15dc779aSAndroid Build Coastguard Worker stop_band = number_of_bands;
438*15dc779aSAndroid Build Coastguard Worker length_in_bands = stop_band - start_band;
439*15dc779aSAndroid Build Coastguard Worker order = pstr_tns_info->tns_max_order_short;
440*15dc779aSAndroid Build Coastguard Worker start_band = MIN(start_band, pstr_tns_info->tns_max_bands_short);
441*15dc779aSAndroid Build Coastguard Worker stop_band = MIN(stop_band, pstr_tns_info->tns_max_bands_short);
442*15dc779aSAndroid Build Coastguard Worker coeff_res = 3;
443*15dc779aSAndroid Build Coastguard Worker ptr_window = pstr_tns_info->win_short;
444*15dc779aSAndroid Build Coastguard Worker nbands = pstr_tns_info->max_sfb_short;
445*15dc779aSAndroid Build Coastguard Worker lpc_start_band = pstr_tns_info->lpc_start_band_short;
446*15dc779aSAndroid Build Coastguard Worker lpc_stop_band = pstr_tns_info->lpc_stop_band_short;
447*15dc779aSAndroid Build Coastguard Worker if (core_mode == CORE_MODE_FD) {
448*15dc779aSAndroid Build Coastguard Worker ptr_sfb_offset_table = pstr_tns_info->sfb_offset_table_short;
449*15dc779aSAndroid Build Coastguard Worker } else {
450*15dc779aSAndroid Build Coastguard Worker ptr_sfb_offset_table = pstr_tns_info->sfb_offset_table_short_tcx;
451*15dc779aSAndroid Build Coastguard Worker }
452*15dc779aSAndroid Build Coastguard Worker break;
453*15dc779aSAndroid Build Coastguard Worker
454*15dc779aSAndroid Build Coastguard Worker default:
455*15dc779aSAndroid Build Coastguard Worker start_band = pstr_tns_info->tns_min_band_number_long;
456*15dc779aSAndroid Build Coastguard Worker stop_band = number_of_bands;
457*15dc779aSAndroid Build Coastguard Worker length_in_bands = stop_band - start_band;
458*15dc779aSAndroid Build Coastguard Worker order = pstr_tns_info->tns_max_order_long;
459*15dc779aSAndroid Build Coastguard Worker start_band = MIN(start_band, pstr_tns_info->tns_max_bands_long);
460*15dc779aSAndroid Build Coastguard Worker stop_band = MIN(stop_band, pstr_tns_info->tns_max_bands_long);
461*15dc779aSAndroid Build Coastguard Worker coeff_res = 4;
462*15dc779aSAndroid Build Coastguard Worker ptr_window = pstr_tns_info->win_long;
463*15dc779aSAndroid Build Coastguard Worker nbands = pstr_tns_info->max_sfb_long;
464*15dc779aSAndroid Build Coastguard Worker lpc_start_band = pstr_tns_info->lpc_start_band_long;
465*15dc779aSAndroid Build Coastguard Worker lpc_stop_band = pstr_tns_info->lpc_stop_band_long;
466*15dc779aSAndroid Build Coastguard Worker ptr_sfb_offset_table = pstr_tns_info->sfb_offset_table_long;
467*15dc779aSAndroid Build Coastguard Worker break;
468*15dc779aSAndroid Build Coastguard Worker }
469*15dc779aSAndroid Build Coastguard Worker
470*15dc779aSAndroid Build Coastguard Worker /** Make sure that start and stop bands < max_sfb
471*15dc779aSAndroid Build Coastguard Worker * Make sure that start and stop bands >= 0
472*15dc779aSAndroid Build Coastguard Worker */
473*15dc779aSAndroid Build Coastguard Worker start_band = MIN(start_band, nbands);
474*15dc779aSAndroid Build Coastguard Worker stop_band = MIN(stop_band, nbands);
475*15dc779aSAndroid Build Coastguard Worker start_band = MAX(start_band, 0);
476*15dc779aSAndroid Build Coastguard Worker stop_band = MAX(stop_band, 0);
477*15dc779aSAndroid Build Coastguard Worker
478*15dc779aSAndroid Build Coastguard Worker pstr_tns_info->tns_data_present = 0; /**< default TNS not used */
479*15dc779aSAndroid Build Coastguard Worker
480*15dc779aSAndroid Build Coastguard Worker /** Perform analysis and filtering for each window
481*15dc779aSAndroid Build Coastguard Worker */
482*15dc779aSAndroid Build Coastguard Worker {
483*15dc779aSAndroid Build Coastguard Worker ia_tns_window_data *window_data = &pstr_tns_info->window_data[w];
484*15dc779aSAndroid Build Coastguard Worker ia_tns_filter_data *tns_filter = window_data->tns_filter;
485*15dc779aSAndroid Build Coastguard Worker FLOAT64 *k = tns_filter->k_coeffs; /**< reflection coeffs */
486*15dc779aSAndroid Build Coastguard Worker FLOAT64 *a = tns_filter->a_coeffs; /**< prediction coeffs */
487*15dc779aSAndroid Build Coastguard Worker
488*15dc779aSAndroid Build Coastguard Worker iusace_calc_weighted_spec(ptr_spec, ptr_weighted_spec, ptr_sfb_energy, ptr_sfb_offset_table,
489*15dc779aSAndroid Build Coastguard Worker lpc_start_band, lpc_stop_band, ptr_scratch);
490*15dc779aSAndroid Build Coastguard Worker
491*15dc779aSAndroid Build Coastguard Worker window_data->n_filt = 0;
492*15dc779aSAndroid Build Coastguard Worker window_data->coef_res = coeff_res;
493*15dc779aSAndroid Build Coastguard Worker
494*15dc779aSAndroid Build Coastguard Worker start_index = ptr_sfb_offset_table[lpc_start_band];
495*15dc779aSAndroid Build Coastguard Worker length =
496*15dc779aSAndroid Build Coastguard Worker ptr_sfb_offset_table[lpc_stop_band] -
497*15dc779aSAndroid Build Coastguard Worker ptr_sfb_offset_table[lpc_start_band]; /**< The length of the spectral data to be
498*15dc779aSAndroid Build Coastguard Worker processed
499*15dc779aSAndroid Build Coastguard Worker */
500*15dc779aSAndroid Build Coastguard Worker
501*15dc779aSAndroid Build Coastguard Worker window_data->tns_pred_gain = iusace_levinson_durbin(
502*15dc779aSAndroid Build Coastguard Worker order, length, &ptr_weighted_spec[start_index], k, ptr_window, ptr_scratch);
503*15dc779aSAndroid Build Coastguard Worker
504*15dc779aSAndroid Build Coastguard Worker window_data->tns_active = 0;
505*15dc779aSAndroid Build Coastguard Worker if (window_data->tns_pred_gain > DEF_TNS_GAIN_THRESH) {
506*15dc779aSAndroid Build Coastguard Worker window_data->tns_active = 1;
507*15dc779aSAndroid Build Coastguard Worker }
508*15dc779aSAndroid Build Coastguard Worker
509*15dc779aSAndroid Build Coastguard Worker if (i_ch == 1) {
510*15dc779aSAndroid Build Coastguard Worker iusace_tns_data_sync(pstr_tns_info, pstr_tns_info_ch2, w, order);
511*15dc779aSAndroid Build Coastguard Worker }
512*15dc779aSAndroid Build Coastguard Worker
513*15dc779aSAndroid Build Coastguard Worker if (window_data->tns_pred_gain > DEF_TNS_GAIN_THRESH) {
514*15dc779aSAndroid Build Coastguard Worker /** Use TNS
515*15dc779aSAndroid Build Coastguard Worker */
516*15dc779aSAndroid Build Coastguard Worker WORD32 truncated_order;
517*15dc779aSAndroid Build Coastguard Worker window_data->n_filt++;
518*15dc779aSAndroid Build Coastguard Worker pstr_tns_info->tns_data_present = 1;
519*15dc779aSAndroid Build Coastguard Worker tns_filter->direction = 0;
520*15dc779aSAndroid Build Coastguard Worker tns_filter->coef_compress = 0;
521*15dc779aSAndroid Build Coastguard Worker tns_filter->length = length_in_bands;
522*15dc779aSAndroid Build Coastguard Worker iusace_quantize_reflection_coeffs(order, coeff_res, k, tns_filter->index);
523*15dc779aSAndroid Build Coastguard Worker truncated_order = iusace_truncate_coeffs(order, DEF_TNS_COEFF_THRESH, k);
524*15dc779aSAndroid Build Coastguard Worker tns_filter->order = truncated_order;
525*15dc779aSAndroid Build Coastguard Worker iusace_step_up(truncated_order, k, a, ptr_scratch); /**< Compute prediction coefficients */
526*15dc779aSAndroid Build Coastguard Worker start_index = ptr_sfb_offset_table[start_band];
527*15dc779aSAndroid Build Coastguard Worker length = MIN(ptr_sfb_offset_table[stop_band], low_pass_line) - start_index;
528*15dc779aSAndroid Build Coastguard Worker if (block_type == EIGHT_SHORT_SEQUENCE) {
529*15dc779aSAndroid Build Coastguard Worker length = ptr_sfb_offset_table[stop_band] - start_index;
530*15dc779aSAndroid Build Coastguard Worker }
531*15dc779aSAndroid Build Coastguard Worker iusace_tns_filter(length, &ptr_spec[start_index], tns_filter,
532*15dc779aSAndroid Build Coastguard Worker ptr_scratch_tns_filter); /**< filter */
533*15dc779aSAndroid Build Coastguard Worker }
534*15dc779aSAndroid Build Coastguard Worker }
535*15dc779aSAndroid Build Coastguard Worker return;
536*15dc779aSAndroid Build Coastguard Worker }
537