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 #include "ixheaac_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_adjust_threshold_data.h"
25*15dc779aSAndroid Build Coastguard Worker #include "iusace_bitbuffer.h"
26*15dc779aSAndroid Build Coastguard Worker
27*15dc779aSAndroid Build Coastguard Worker /* DRC */
28*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_common_enc.h"
29*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc.h"
30*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_tables.h"
31*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_api.h"
32*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc_eq.h"
33*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc_filter_bank.h"
34*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_gain_enc.h"
35*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_struct_def.h"
36*15dc779aSAndroid Build Coastguard Worker
37*15dc779aSAndroid Build Coastguard Worker #include "iusace_cnst.h"
38*15dc779aSAndroid Build Coastguard Worker #include "iusace_tns_usac.h"
39*15dc779aSAndroid Build Coastguard Worker #include "iusace_psy_mod.h"
40*15dc779aSAndroid Build Coastguard Worker #include "iusace_tns_usac.h"
41*15dc779aSAndroid Build Coastguard Worker #include "iusace_config.h"
42*15dc779aSAndroid Build Coastguard Worker #include "iusace_fft.h"
43*15dc779aSAndroid Build Coastguard Worker #include "iusace_tcx_mdct.h"
44*15dc779aSAndroid Build Coastguard Worker #include "iusace_arith_enc.h"
45*15dc779aSAndroid Build Coastguard Worker #include "iusace_fd_qc_util.h"
46*15dc779aSAndroid Build Coastguard Worker #include "iusace_fd_quant.h"
47*15dc779aSAndroid Build Coastguard Worker #include "iusace_block_switch_const.h"
48*15dc779aSAndroid Build Coastguard Worker #include "iusace_block_switch_struct_def.h"
49*15dc779aSAndroid Build Coastguard Worker #include "iusace_ms.h"
50*15dc779aSAndroid Build Coastguard Worker #include "iusace_signal_classifier.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_header.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_config.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_asc_write.h"
54*15dc779aSAndroid Build Coastguard Worker #include "iusace_main.h"
55*15dc779aSAndroid Build Coastguard Worker #include "iusace_lpd_rom.h"
56*15dc779aSAndroid Build Coastguard Worker #include "iusace_lpd.h"
57*15dc779aSAndroid Build Coastguard Worker #include "iusace_avq_enc.h"
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_utils.h"
59*15dc779aSAndroid Build Coastguard Worker
60*15dc779aSAndroid Build Coastguard Worker const UWORD32 iusace_pow10_gain_div28[128] = {
61*15dc779aSAndroid Build Coastguard Worker 1024, 1112, 1207, 1311, 1423, 1545, 1677, 1821, 1977,
62*15dc779aSAndroid Build Coastguard Worker 2146, 2330, 2530, 2747, 2983, 3238, 3516, 3817, 4144,
63*15dc779aSAndroid Build Coastguard Worker 4499, 4885, 5304, 5758, 6252, 6788, 7370, 8001, 8687,
64*15dc779aSAndroid Build Coastguard Worker 9432, 10240, 11118, 12071, 13105, 14228, 15448, 16772, 18210,
65*15dc779aSAndroid Build Coastguard Worker 19770, 21465, 23305, 25302, 27471, 29825, 32382, 35157, 38171,
66*15dc779aSAndroid Build Coastguard Worker 41442, 44994, 48851, 53038, 57584, 62519, 67878, 73696, 80012,
67*15dc779aSAndroid Build Coastguard Worker 86870, 94316, 102400, 111177, 120706, 131052, 142284, 154480, 167720,
68*15dc779aSAndroid Build Coastguard Worker 182096, 197703, 214649, 233047, 253021, 274708, 298254, 323817, 351572,
69*15dc779aSAndroid Build Coastguard Worker 381706, 414422, 449943, 488508, 530378, 575838, 625193, 678779, 736958,
70*15dc779aSAndroid Build Coastguard Worker 800124, 868703, 943161, 1024000, 1111768, 1207059, 1310517, 1422843, 1544797,
71*15dc779aSAndroid Build Coastguard Worker 1677203, 1820958, 1977034, 2146488, 2330466, 2530213, 2747080, 2982536, 3238172,
72*15dc779aSAndroid Build Coastguard Worker 3515720, 3817056, 4144220, 4499426, 4885077, 5303782, 5758375, 6251932, 6787792,
73*15dc779aSAndroid Build Coastguard Worker 7369581, 8001236, 8687031, 9431606, 10240000, 11117682, 12070591, 13105175, 14228434,
74*15dc779aSAndroid Build Coastguard Worker 15447969, 16772032, 18209581, 19770345, 21464883, 23304662, 25302131, 27470805, 29825358,
75*15dc779aSAndroid Build Coastguard Worker 32381723, 35157197};
76*15dc779aSAndroid Build Coastguard Worker
77*15dc779aSAndroid Build Coastguard Worker static const FLOAT64 iusace_lpc_pre_twid_cos[ORDER + 1] = {1.0,
78*15dc779aSAndroid Build Coastguard Worker 0.99969881867944277,
79*15dc779aSAndroid Build Coastguard Worker 0.99879545613814691,
80*15dc779aSAndroid Build Coastguard Worker 0.99729045666498317,
81*15dc779aSAndroid Build Coastguard Worker 0.99518472640441780,
82*15dc779aSAndroid Build Coastguard Worker 0.99247953486470630,
83*15dc779aSAndroid Build Coastguard Worker 0.98917650991010153,
84*15dc779aSAndroid Build Coastguard Worker 0.98527764316379052,
85*15dc779aSAndroid Build Coastguard Worker 0.98078527933727178,
86*15dc779aSAndroid Build Coastguard Worker 0.97570212991605565,
87*15dc779aSAndroid Build Coastguard Worker 0.97003125425052761,
88*15dc779aSAndroid Build Coastguard Worker 0.96377606826277584,
89*15dc779aSAndroid Build Coastguard Worker 0.95694033551585822,
90*15dc779aSAndroid Build Coastguard Worker 0.94952817722361749,
91*15dc779aSAndroid Build Coastguard Worker 0.94154406823678738,
92*15dc779aSAndroid Build Coastguard Worker 0.93299279849944938,
93*15dc779aSAndroid Build Coastguard Worker 0.92387952832938047};
94*15dc779aSAndroid Build Coastguard Worker
95*15dc779aSAndroid Build Coastguard Worker static const FLOAT64 iusace_lpc_pre_twid_sin[ORDER + 1] = {0,
96*15dc779aSAndroid Build Coastguard Worker 0.024541229205697054,
97*15dc779aSAndroid Build Coastguard Worker 0.049067675691753569,
98*15dc779aSAndroid Build Coastguard Worker 0.073564563785488826,
99*15dc779aSAndroid Build Coastguard Worker 0.098017143048367339,
100*15dc779aSAndroid Build Coastguard Worker 0.12241067304257494,
101*15dc779aSAndroid Build Coastguard Worker 0.14673047482398086,
102*15dc779aSAndroid Build Coastguard Worker 0.17096188429473480,
103*15dc779aSAndroid Build Coastguard Worker 0.19509032737506427,
104*15dc779aSAndroid Build Coastguard Worker 0.21910124070226658,
105*15dc779aSAndroid Build Coastguard Worker 0.24298017568754085,
106*15dc779aSAndroid Build Coastguard Worker 0.26671274855909161,
107*15dc779aSAndroid Build Coastguard Worker 0.29028467796767482,
108*15dc779aSAndroid Build Coastguard Worker 0.31368175059826858,
109*15dc779aSAndroid Build Coastguard Worker 0.33688984485751389,
110*15dc779aSAndroid Build Coastguard Worker 0.35989503740419343,
111*15dc779aSAndroid Build Coastguard Worker 0.38268344246110436};
112*15dc779aSAndroid Build Coastguard Worker
iusace_lpc_mdct(FLOAT32 * ptr_lpc_coeffs,FLOAT32 * mdct_gains,WORD32 length,iusace_scratch_mem * pstr_scratch)113*15dc779aSAndroid Build Coastguard Worker static VOID iusace_lpc_mdct(FLOAT32 *ptr_lpc_coeffs, FLOAT32 *mdct_gains, WORD32 length,
114*15dc779aSAndroid Build Coastguard Worker iusace_scratch_mem *pstr_scratch) {
115*15dc779aSAndroid Build Coastguard Worker FLOAT32 *in_out = pstr_scratch->p_in_out_tcx;
116*15dc779aSAndroid Build Coastguard Worker WORD32 i;
117*15dc779aSAndroid Build Coastguard Worker
118*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER + 1; i++) {
119*15dc779aSAndroid Build Coastguard Worker in_out[2 * i] = (FLOAT32)(ptr_lpc_coeffs[i] * iusace_lpc_pre_twid_cos[i]);
120*15dc779aSAndroid Build Coastguard Worker in_out[2 * i + 1] = (FLOAT32)(-ptr_lpc_coeffs[i] * iusace_lpc_pre_twid_sin[i]);
121*15dc779aSAndroid Build Coastguard Worker }
122*15dc779aSAndroid Build Coastguard Worker for (; i < length; i++) {
123*15dc779aSAndroid Build Coastguard Worker in_out[2 * i] = 0.f;
124*15dc779aSAndroid Build Coastguard Worker in_out[2 * i + 1] = 0.f;
125*15dc779aSAndroid Build Coastguard Worker }
126*15dc779aSAndroid Build Coastguard Worker
127*15dc779aSAndroid Build Coastguard Worker iusace_complex_fft(in_out, length, pstr_scratch);
128*15dc779aSAndroid Build Coastguard Worker
129*15dc779aSAndroid Build Coastguard Worker for (i = 0; i<length>> 1; i++) {
130*15dc779aSAndroid Build Coastguard Worker mdct_gains[i] = (FLOAT32)(
131*15dc779aSAndroid Build Coastguard Worker 1.0f / sqrt(in_out[2 * i] * in_out[2 * i] + in_out[2 * i + 1] * in_out[2 * i + 1]));
132*15dc779aSAndroid Build Coastguard Worker }
133*15dc779aSAndroid Build Coastguard Worker
134*15dc779aSAndroid Build Coastguard Worker return;
135*15dc779aSAndroid Build Coastguard Worker }
136*15dc779aSAndroid Build Coastguard Worker
iusace_rounded_sqrt(UWORD32 pos_num)137*15dc779aSAndroid Build Coastguard Worker UWORD32 iusace_rounded_sqrt(UWORD32 pos_num) {
138*15dc779aSAndroid Build Coastguard Worker UWORD32 num = pos_num;
139*15dc779aSAndroid Build Coastguard Worker UWORD32 value = 0;
140*15dc779aSAndroid Build Coastguard Worker UWORD32 bit_set = 1 << 30;
141*15dc779aSAndroid Build Coastguard Worker
142*15dc779aSAndroid Build Coastguard Worker while (bit_set > num) {
143*15dc779aSAndroid Build Coastguard Worker bit_set >>= 2;
144*15dc779aSAndroid Build Coastguard Worker }
145*15dc779aSAndroid Build Coastguard Worker while (bit_set) {
146*15dc779aSAndroid Build Coastguard Worker if (num >= value + bit_set) {
147*15dc779aSAndroid Build Coastguard Worker num -= value + bit_set;
148*15dc779aSAndroid Build Coastguard Worker value += bit_set << 1;
149*15dc779aSAndroid Build Coastguard Worker }
150*15dc779aSAndroid Build Coastguard Worker value >>= 1;
151*15dc779aSAndroid Build Coastguard Worker bit_set >>= 2;
152*15dc779aSAndroid Build Coastguard Worker }
153*15dc779aSAndroid Build Coastguard Worker num = value + 1;
154*15dc779aSAndroid Build Coastguard Worker if (num * num - pos_num < pos_num - value * value) {
155*15dc779aSAndroid Build Coastguard Worker return num;
156*15dc779aSAndroid Build Coastguard Worker }
157*15dc779aSAndroid Build Coastguard Worker return value;
158*15dc779aSAndroid Build Coastguard Worker }
159*15dc779aSAndroid Build Coastguard Worker
iusace_noise_shaping(FLOAT32 * rr,WORD32 lg,WORD32 M,FLOAT32 * gain1,FLOAT32 * gain2)160*15dc779aSAndroid Build Coastguard Worker static VOID iusace_noise_shaping(FLOAT32 *rr, WORD32 lg, WORD32 M, FLOAT32 *gain1,
161*15dc779aSAndroid Build Coastguard Worker FLOAT32 *gain2) {
162*15dc779aSAndroid Build Coastguard Worker WORD32 i, k;
163*15dc779aSAndroid Build Coastguard Worker FLOAT32 r, r_prev, g1, g2, a = 0, b = 0;
164*15dc779aSAndroid Build Coastguard Worker
165*15dc779aSAndroid Build Coastguard Worker k = lg/M;
166*15dc779aSAndroid Build Coastguard Worker
167*15dc779aSAndroid Build Coastguard Worker r_prev = 0;
168*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < lg; i++) {
169*15dc779aSAndroid Build Coastguard Worker if ((i % k) == 0) {
170*15dc779aSAndroid Build Coastguard Worker g1 = gain1[i / k];
171*15dc779aSAndroid Build Coastguard Worker g2 = gain2[i / k];
172*15dc779aSAndroid Build Coastguard Worker a = 2.0f * g1 * g2 / (g1 + g2);
173*15dc779aSAndroid Build Coastguard Worker b = (g2 - g1) / (g1 + g2);
174*15dc779aSAndroid Build Coastguard Worker }
175*15dc779aSAndroid Build Coastguard Worker
176*15dc779aSAndroid Build Coastguard Worker r = a * rr[i] + b * r_prev;
177*15dc779aSAndroid Build Coastguard Worker
178*15dc779aSAndroid Build Coastguard Worker rr[i] = r;
179*15dc779aSAndroid Build Coastguard Worker r_prev = r;
180*15dc779aSAndroid Build Coastguard Worker }
181*15dc779aSAndroid Build Coastguard Worker
182*15dc779aSAndroid Build Coastguard Worker return;
183*15dc779aSAndroid Build Coastguard Worker }
184*15dc779aSAndroid Build Coastguard Worker
iusace_pre_shaping(FLOAT32 * rr,WORD32 lg,WORD32 M,FLOAT32 * gain1,FLOAT32 * gain2)185*15dc779aSAndroid Build Coastguard Worker static VOID iusace_pre_shaping(FLOAT32 *rr, WORD32 lg, WORD32 M, FLOAT32 *gain1, FLOAT32 *gain2) {
186*15dc779aSAndroid Build Coastguard Worker WORD32 i, k;
187*15dc779aSAndroid Build Coastguard Worker FLOAT32 r, r_prev, g1, g2, a = 0, b = 0;
188*15dc779aSAndroid Build Coastguard Worker
189*15dc779aSAndroid Build Coastguard Worker k = lg / M;
190*15dc779aSAndroid Build Coastguard Worker
191*15dc779aSAndroid Build Coastguard Worker r_prev = 0;
192*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < lg; i++) {
193*15dc779aSAndroid Build Coastguard Worker if ((i % k) == 0) {
194*15dc779aSAndroid Build Coastguard Worker g1 = gain1[i / k];
195*15dc779aSAndroid Build Coastguard Worker g2 = gain2[i / k];
196*15dc779aSAndroid Build Coastguard Worker
197*15dc779aSAndroid Build Coastguard Worker a = (g1 + g2) / (2.0f * g1 * g2);
198*15dc779aSAndroid Build Coastguard Worker b = (g1 - g2) / (2.0f * g1 * g2);
199*15dc779aSAndroid Build Coastguard Worker }
200*15dc779aSAndroid Build Coastguard Worker
201*15dc779aSAndroid Build Coastguard Worker r = a * rr[i] + b * r_prev;
202*15dc779aSAndroid Build Coastguard Worker
203*15dc779aSAndroid Build Coastguard Worker r_prev = rr[i];
204*15dc779aSAndroid Build Coastguard Worker rr[i] = r;
205*15dc779aSAndroid Build Coastguard Worker }
206*15dc779aSAndroid Build Coastguard Worker
207*15dc779aSAndroid Build Coastguard Worker return;
208*15dc779aSAndroid Build Coastguard Worker }
209*15dc779aSAndroid Build Coastguard Worker
iusace_adapt_lo_freq_emph(FLOAT32 * signal,WORD32 length)210*15dc779aSAndroid Build Coastguard Worker static VOID iusace_adapt_lo_freq_emph(FLOAT32 *signal, WORD32 length) {
211*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, i_max;
212*15dc779aSAndroid Build Coastguard Worker FLOAT32 max_energy, factor, temp;
213*15dc779aSAndroid Build Coastguard Worker
214*15dc779aSAndroid Build Coastguard Worker i_max = length >> 2;
215*15dc779aSAndroid Build Coastguard Worker
216*15dc779aSAndroid Build Coastguard Worker max_energy = 0.01f;
217*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < i_max; i += 8) {
218*15dc779aSAndroid Build Coastguard Worker temp = 0.01f;
219*15dc779aSAndroid Build Coastguard Worker for (j = i; j < i + 8; j++) {
220*15dc779aSAndroid Build Coastguard Worker temp += signal[j] * signal[j];
221*15dc779aSAndroid Build Coastguard Worker }
222*15dc779aSAndroid Build Coastguard Worker if (temp > max_energy) {
223*15dc779aSAndroid Build Coastguard Worker max_energy = temp;
224*15dc779aSAndroid Build Coastguard Worker }
225*15dc779aSAndroid Build Coastguard Worker }
226*15dc779aSAndroid Build Coastguard Worker
227*15dc779aSAndroid Build Coastguard Worker factor = 10.0f;
228*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < i_max; i += 8) {
229*15dc779aSAndroid Build Coastguard Worker temp = 0.01f;
230*15dc779aSAndroid Build Coastguard Worker for (j = i; j < i + 8; j++) {
231*15dc779aSAndroid Build Coastguard Worker temp += signal[j] * signal[j];
232*15dc779aSAndroid Build Coastguard Worker }
233*15dc779aSAndroid Build Coastguard Worker temp = (FLOAT32)sqrt(sqrt(max_energy / temp));
234*15dc779aSAndroid Build Coastguard Worker if (temp < factor) {
235*15dc779aSAndroid Build Coastguard Worker factor = temp;
236*15dc779aSAndroid Build Coastguard Worker }
237*15dc779aSAndroid Build Coastguard Worker for (j = i; j < i + 8; j++) {
238*15dc779aSAndroid Build Coastguard Worker signal[j] *= factor;
239*15dc779aSAndroid Build Coastguard Worker }
240*15dc779aSAndroid Build Coastguard Worker }
241*15dc779aSAndroid Build Coastguard Worker return;
242*15dc779aSAndroid Build Coastguard Worker }
243*15dc779aSAndroid Build Coastguard Worker
iusace_adapt_lo_freq_deemph(FLOAT32 * signal,WORD32 length,FLOAT32 * gains)244*15dc779aSAndroid Build Coastguard Worker static VOID iusace_adapt_lo_freq_deemph(FLOAT32 *signal, WORD32 length, FLOAT32 *gains) {
245*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, i_max;
246*15dc779aSAndroid Build Coastguard Worker FLOAT32 max_energy, factor, energy, rm;
247*15dc779aSAndroid Build Coastguard Worker
248*15dc779aSAndroid Build Coastguard Worker i_max = length >> 2;
249*15dc779aSAndroid Build Coastguard Worker
250*15dc779aSAndroid Build Coastguard Worker max_energy = 0.01f;
251*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < i_max; i += 8) {
252*15dc779aSAndroid Build Coastguard Worker energy = 0.01f;
253*15dc779aSAndroid Build Coastguard Worker for (j = i; j < i + 8; j++) {
254*15dc779aSAndroid Build Coastguard Worker energy += signal[j] * signal[j];
255*15dc779aSAndroid Build Coastguard Worker }
256*15dc779aSAndroid Build Coastguard Worker if (energy > max_energy) {
257*15dc779aSAndroid Build Coastguard Worker max_energy = energy;
258*15dc779aSAndroid Build Coastguard Worker }
259*15dc779aSAndroid Build Coastguard Worker }
260*15dc779aSAndroid Build Coastguard Worker
261*15dc779aSAndroid Build Coastguard Worker factor = 0.1f;
262*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < i_max; i += 8) {
263*15dc779aSAndroid Build Coastguard Worker energy = 0.01f;
264*15dc779aSAndroid Build Coastguard Worker for (j = i; j < i + 8; j++) {
265*15dc779aSAndroid Build Coastguard Worker energy += signal[j] * signal[j];
266*15dc779aSAndroid Build Coastguard Worker }
267*15dc779aSAndroid Build Coastguard Worker
268*15dc779aSAndroid Build Coastguard Worker rm = (FLOAT32)sqrt(energy / max_energy);
269*15dc779aSAndroid Build Coastguard Worker if (rm > factor) {
270*15dc779aSAndroid Build Coastguard Worker factor = rm;
271*15dc779aSAndroid Build Coastguard Worker }
272*15dc779aSAndroid Build Coastguard Worker for (j = i; j < i + 8; j++) {
273*15dc779aSAndroid Build Coastguard Worker signal[j] *= factor;
274*15dc779aSAndroid Build Coastguard Worker }
275*15dc779aSAndroid Build Coastguard Worker gains[i / 8] = factor;
276*15dc779aSAndroid Build Coastguard Worker }
277*15dc779aSAndroid Build Coastguard Worker
278*15dc779aSAndroid Build Coastguard Worker return;
279*15dc779aSAndroid Build Coastguard Worker }
280*15dc779aSAndroid Build Coastguard Worker
iusace_tcx_fac_encode(ia_usac_data_struct * usac_data,FLOAT32 * lpc_coeffs,FLOAT32 * lpc_coeffs_quant,FLOAT32 * speech,WORD32 frame_len,WORD32 num_bits_per_supfrm,ia_usac_lpd_state_struct * lpd_state,WORD32 * params,WORD32 * n_param,WORD32 ch_idx,WORD32 k_idx)281*15dc779aSAndroid Build Coastguard Worker VOID iusace_tcx_fac_encode(ia_usac_data_struct *usac_data, FLOAT32 *lpc_coeffs,
282*15dc779aSAndroid Build Coastguard Worker FLOAT32 *lpc_coeffs_quant, FLOAT32 *speech, WORD32 frame_len,
283*15dc779aSAndroid Build Coastguard Worker WORD32 num_bits_per_supfrm, ia_usac_lpd_state_struct *lpd_state,
284*15dc779aSAndroid Build Coastguard Worker WORD32 *params, WORD32 *n_param, WORD32 ch_idx, WORD32 k_idx) {
285*15dc779aSAndroid Build Coastguard Worker ia_usac_td_encoder_struct *st = usac_data->td_encoder[ch_idx];
286*15dc779aSAndroid Build Coastguard Worker iusace_scratch_mem *pstr_scratch = &usac_data->str_scratch;
287*15dc779aSAndroid Build Coastguard Worker FLOAT32 *weighted_sig = &pstr_scratch->p_wsig_buf[k_idx * st->len_subfrm];
288*15dc779aSAndroid Build Coastguard Worker FLOAT32 *wsynth = pstr_scratch->p_wsyn_tcx_buf;
289*15dc779aSAndroid Build Coastguard Worker FLOAT32 *synth = pstr_scratch->p_synth_tcx_buf;
290*15dc779aSAndroid Build Coastguard Worker WORD32 i, k, n, mode, i_subfr, lg, lext, index, target_bits;
291*15dc779aSAndroid Build Coastguard Worker FLOAT32 tmp, gain, fac_ns, energy, gain_tcx, nsfill_en_thres;
292*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_lp_flt_coeffs, lp_flt_coeffs[ORDER + 1];
293*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *sine_window_prev, *sine_window;
294*15dc779aSAndroid Build Coastguard Worker FLOAT32 mem_tcx_q;
295*15dc779aSAndroid Build Coastguard Worker FLOAT32 *xn;
296*15dc779aSAndroid Build Coastguard Worker FLOAT32 *xn1 = pstr_scratch->p_xn1_tcx;
297*15dc779aSAndroid Build Coastguard Worker FLOAT32 *xn_buf = pstr_scratch->p_xn_buf_tcx;
298*15dc779aSAndroid Build Coastguard Worker FLOAT32 *x = pstr_scratch->p_x_tcx;
299*15dc779aSAndroid Build Coastguard Worker FLOAT32 *x_tmp = pstr_scratch->p_x_tmp_tcx;
300*15dc779aSAndroid Build Coastguard Worker FLOAT32 *en = pstr_scratch->p_en_tcx;
301*15dc779aSAndroid Build Coastguard Worker FLOAT32 sq_gain;
302*15dc779aSAndroid Build Coastguard Worker FLOAT32 gain_prev, gain_next;
303*15dc779aSAndroid Build Coastguard Worker FLOAT32 *alfd_gains = pstr_scratch->p_alfd_gains_tcx;
304*15dc779aSAndroid Build Coastguard Worker FLOAT32 *sq_enc = pstr_scratch->p_sq_enc_tcx;
305*15dc779aSAndroid Build Coastguard Worker WORD32 *sq_quant = pstr_scratch->p_sq_quant_tcx;
306*15dc779aSAndroid Build Coastguard Worker FLOAT32 sq_err_energy;
307*15dc779aSAndroid Build Coastguard Worker WORD32 max_k;
308*15dc779aSAndroid Build Coastguard Worker FLOAT32 *gain1 = pstr_scratch->p_gain1_tcx;
309*15dc779aSAndroid Build Coastguard Worker FLOAT32 *gain2 = pstr_scratch->p_gain2_tcx;
310*15dc779aSAndroid Build Coastguard Worker FLOAT32 *facelp = pstr_scratch->p_facelp_tcx;
311*15dc779aSAndroid Build Coastguard Worker FLOAT32 *xn2 = pstr_scratch->p_xn2_tcx;
312*15dc779aSAndroid Build Coastguard Worker FLOAT32 *fac_window = pstr_scratch->p_fac_window_tcx;
313*15dc779aSAndroid Build Coastguard Worker FLOAT32 *x1 = pstr_scratch->p_x1_tcx;
314*15dc779aSAndroid Build Coastguard Worker FLOAT32 *x2 = pstr_scratch->p_x2_tcx;
315*15dc779aSAndroid Build Coastguard Worker WORD32 *y = pstr_scratch->p_y_tcx;
316*15dc779aSAndroid Build Coastguard Worker
317*15dc779aSAndroid Build Coastguard Worker WORD32 TTT;
318*15dc779aSAndroid Build Coastguard Worker FLOAT32 corr = 0;
319*15dc779aSAndroid Build Coastguard Worker WORD32 len_subfrm = st->len_subfrm;
320*15dc779aSAndroid Build Coastguard Worker WORD32 fac_length = len_subfrm >> 1;
321*15dc779aSAndroid Build Coastguard Worker WORD32 fac_len_prev, fac_len;
322*15dc779aSAndroid Build Coastguard Worker
323*15dc779aSAndroid Build Coastguard Worker if (frame_len == 4 * st->len_subfrm) {
324*15dc779aSAndroid Build Coastguard Worker if (st->last_was_short) {
325*15dc779aSAndroid Build Coastguard Worker fac_len_prev = (st->len_frame) / 16;
326*15dc779aSAndroid Build Coastguard Worker } else {
327*15dc779aSAndroid Build Coastguard Worker fac_len_prev = st->len_subfrm / 2;
328*15dc779aSAndroid Build Coastguard Worker }
329*15dc779aSAndroid Build Coastguard Worker if (st->next_is_short) {
330*15dc779aSAndroid Build Coastguard Worker fac_len = (st->len_frame) / 16;
331*15dc779aSAndroid Build Coastguard Worker } else {
332*15dc779aSAndroid Build Coastguard Worker fac_len = st->len_subfrm / 2;
333*15dc779aSAndroid Build Coastguard Worker }
334*15dc779aSAndroid Build Coastguard Worker } else if (frame_len == 2 * st->len_subfrm) {
335*15dc779aSAndroid Build Coastguard Worker if (k_idx == 0 && st->last_was_short) {
336*15dc779aSAndroid Build Coastguard Worker fac_len_prev = (st->len_frame) / 16;
337*15dc779aSAndroid Build Coastguard Worker } else {
338*15dc779aSAndroid Build Coastguard Worker fac_len_prev = st->len_subfrm / 2;
339*15dc779aSAndroid Build Coastguard Worker }
340*15dc779aSAndroid Build Coastguard Worker if (k_idx == 2 && st->next_is_short) {
341*15dc779aSAndroid Build Coastguard Worker fac_len = (st->len_frame) / 16;
342*15dc779aSAndroid Build Coastguard Worker } else {
343*15dc779aSAndroid Build Coastguard Worker fac_len = st->len_subfrm / 2;
344*15dc779aSAndroid Build Coastguard Worker }
345*15dc779aSAndroid Build Coastguard Worker } else {
346*15dc779aSAndroid Build Coastguard Worker if (k_idx == 0 && st->last_was_short) {
347*15dc779aSAndroid Build Coastguard Worker fac_len_prev = (st->len_frame) / 16;
348*15dc779aSAndroid Build Coastguard Worker } else {
349*15dc779aSAndroid Build Coastguard Worker fac_len_prev = st->len_subfrm / 2;
350*15dc779aSAndroid Build Coastguard Worker }
351*15dc779aSAndroid Build Coastguard Worker if (k_idx == 3 && st->next_is_short) {
352*15dc779aSAndroid Build Coastguard Worker fac_len = (st->len_frame) / 16;
353*15dc779aSAndroid Build Coastguard Worker } else {
354*15dc779aSAndroid Build Coastguard Worker fac_len = st->len_subfrm / 2;
355*15dc779aSAndroid Build Coastguard Worker }
356*15dc779aSAndroid Build Coastguard Worker }
357*15dc779aSAndroid Build Coastguard Worker
358*15dc779aSAndroid Build Coastguard Worker memset(xn_buf, 0, (128 + frame_len + 128) * sizeof(FLOAT32));
359*15dc779aSAndroid Build Coastguard Worker
360*15dc779aSAndroid Build Coastguard Worker mode = frame_len / len_subfrm;
361*15dc779aSAndroid Build Coastguard Worker
362*15dc779aSAndroid Build Coastguard Worker if (mode > 2) {
363*15dc779aSAndroid Build Coastguard Worker mode = 3;
364*15dc779aSAndroid Build Coastguard Worker }
365*15dc779aSAndroid Build Coastguard Worker
366*15dc779aSAndroid Build Coastguard Worker if (lpd_state->mode == 0) {
367*15dc779aSAndroid Build Coastguard Worker params += fac_len_prev;
368*15dc779aSAndroid Build Coastguard Worker }
369*15dc779aSAndroid Build Coastguard Worker switch (fac_len_prev) {
370*15dc779aSAndroid Build Coastguard Worker case 64:
371*15dc779aSAndroid Build Coastguard Worker sine_window_prev = iusace_sin_window_128;
372*15dc779aSAndroid Build Coastguard Worker break;
373*15dc779aSAndroid Build Coastguard Worker default:
374*15dc779aSAndroid Build Coastguard Worker sine_window_prev = iusace_sin_window_256;
375*15dc779aSAndroid Build Coastguard Worker break;
376*15dc779aSAndroid Build Coastguard Worker }
377*15dc779aSAndroid Build Coastguard Worker switch (fac_len) {
378*15dc779aSAndroid Build Coastguard Worker case 64:
379*15dc779aSAndroid Build Coastguard Worker sine_window = iusace_sin_window_128;
380*15dc779aSAndroid Build Coastguard Worker break;
381*15dc779aSAndroid Build Coastguard Worker default:
382*15dc779aSAndroid Build Coastguard Worker sine_window = iusace_sin_window_256;
383*15dc779aSAndroid Build Coastguard Worker break;
384*15dc779aSAndroid Build Coastguard Worker }
385*15dc779aSAndroid Build Coastguard Worker
386*15dc779aSAndroid Build Coastguard Worker lg = frame_len;
387*15dc779aSAndroid Build Coastguard Worker lext = fac_length;
388*15dc779aSAndroid Build Coastguard Worker xn = xn_buf + fac_length;
389*15dc779aSAndroid Build Coastguard Worker
390*15dc779aSAndroid Build Coastguard Worker *n_param = lg;
391*15dc779aSAndroid Build Coastguard Worker
392*15dc779aSAndroid Build Coastguard Worker target_bits = num_bits_per_supfrm - 10;
393*15dc779aSAndroid Build Coastguard Worker
394*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_length; i++) {
395*15dc779aSAndroid Build Coastguard Worker xn_buf[i] = lpd_state->tcx_mem[i + 128 - fac_length];
396*15dc779aSAndroid Build Coastguard Worker }
397*15dc779aSAndroid Build Coastguard Worker
398*15dc779aSAndroid Build Coastguard Worker memcpy(xn, speech, (frame_len + fac_length) * sizeof(FLOAT32));
399*15dc779aSAndroid Build Coastguard Worker
400*15dc779aSAndroid Build Coastguard Worker tmp = xn[-1];
401*15dc779aSAndroid Build Coastguard Worker
402*15dc779aSAndroid Build Coastguard Worker iusace_apply_deemph(xn, TILT_FAC, frame_len, &tmp);
403*15dc779aSAndroid Build Coastguard Worker
404*15dc779aSAndroid Build Coastguard Worker memcpy(lpd_state->tcx_mem, &xn[frame_len - 128], 128 * sizeof(FLOAT32));
405*15dc779aSAndroid Build Coastguard Worker
406*15dc779aSAndroid Build Coastguard Worker memcpy(&xn[frame_len], &speech[frame_len], lext * sizeof(FLOAT32));
407*15dc779aSAndroid Build Coastguard Worker iusace_apply_deemph(&xn[frame_len], TILT_FAC, lext, &tmp);
408*15dc779aSAndroid Build Coastguard Worker
409*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER + fac_len_prev; i++) {
410*15dc779aSAndroid Build Coastguard Worker xn1[i] = xn_buf[fac_length - ORDER + i];
411*15dc779aSAndroid Build Coastguard Worker }
412*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER + fac_len; i++) {
413*15dc779aSAndroid Build Coastguard Worker xn2[i] = xn_buf[frame_len - ORDER + i];
414*15dc779aSAndroid Build Coastguard Worker }
415*15dc779aSAndroid Build Coastguard Worker
416*15dc779aSAndroid Build Coastguard Worker if (lpd_state->mode >= -1) {
417*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_length - fac_len_prev; i++) {
418*15dc779aSAndroid Build Coastguard Worker xn_buf[i] = 0.0f;
419*15dc779aSAndroid Build Coastguard Worker }
420*15dc779aSAndroid Build Coastguard Worker for (i = fac_length - fac_len_prev; i < (fac_length + fac_len_prev); i++) {
421*15dc779aSAndroid Build Coastguard Worker xn_buf[i] *= sine_window_prev[i - fac_length + fac_len_prev];
422*15dc779aSAndroid Build Coastguard Worker }
423*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < (2 * fac_len); i++) {
424*15dc779aSAndroid Build Coastguard Worker xn_buf[frame_len + fac_length - fac_len + i] *= sine_window[(2 * fac_len) - 1 - i];
425*15dc779aSAndroid Build Coastguard Worker }
426*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_length - fac_len; i++) {
427*15dc779aSAndroid Build Coastguard Worker xn_buf[frame_len + fac_length + fac_len + i] = 0.0f;
428*15dc779aSAndroid Build Coastguard Worker }
429*15dc779aSAndroid Build Coastguard Worker }
430*15dc779aSAndroid Build Coastguard Worker
431*15dc779aSAndroid Build Coastguard Worker iusace_tcx_mdct_main(xn_buf, x, (2 * fac_length), frame_len - (2 * fac_length),
432*15dc779aSAndroid Build Coastguard Worker (2 * fac_length), pstr_scratch);
433*15dc779aSAndroid Build Coastguard Worker
434*15dc779aSAndroid Build Coastguard Worker iusace_get_weighted_lpc(lpc_coeffs_quant + (ORDER + 1), lp_flt_coeffs);
435*15dc779aSAndroid Build Coastguard Worker iusace_lpc_mdct(lp_flt_coeffs, gain1, ((FDNS_RESOLUTION * len_subfrm) / LEN_FRAME) << 1,
436*15dc779aSAndroid Build Coastguard Worker pstr_scratch);
437*15dc779aSAndroid Build Coastguard Worker
438*15dc779aSAndroid Build Coastguard Worker iusace_get_weighted_lpc(lpc_coeffs_quant + (2 * (ORDER + 1)), lp_flt_coeffs);
439*15dc779aSAndroid Build Coastguard Worker iusace_lpc_mdct(lp_flt_coeffs, gain2, ((FDNS_RESOLUTION * len_subfrm) / LEN_FRAME) << 1,
440*15dc779aSAndroid Build Coastguard Worker pstr_scratch);
441*15dc779aSAndroid Build Coastguard Worker
442*15dc779aSAndroid Build Coastguard Worker iusace_pre_shaping(x, lg, ((FDNS_RESOLUTION * len_subfrm) / LEN_FRAME), gain1, gain2);
443*15dc779aSAndroid Build Coastguard Worker
444*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < lg; i++) {
445*15dc779aSAndroid Build Coastguard Worker x_tmp[i] = x[i];
446*15dc779aSAndroid Build Coastguard Worker }
447*15dc779aSAndroid Build Coastguard Worker
448*15dc779aSAndroid Build Coastguard Worker iusace_adapt_lo_freq_emph(x, lg);
449*15dc779aSAndroid Build Coastguard Worker
450*15dc779aSAndroid Build Coastguard Worker sq_gain = iusace_calc_sq_gain(x, target_bits, lg, pstr_scratch->p_sq_gain_en);
451*15dc779aSAndroid Build Coastguard Worker
452*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < lg; i++) {
453*15dc779aSAndroid Build Coastguard Worker sq_enc[i] = x[i] / sq_gain;
454*15dc779aSAndroid Build Coastguard Worker
455*15dc779aSAndroid Build Coastguard Worker if (sq_enc[i] > 0.f)
456*15dc779aSAndroid Build Coastguard Worker sq_quant[i] = ((WORD32)(0.5f + sq_enc[i]));
457*15dc779aSAndroid Build Coastguard Worker else
458*15dc779aSAndroid Build Coastguard Worker sq_quant[i] = ((WORD32)(-0.5f + sq_enc[i]));
459*15dc779aSAndroid Build Coastguard Worker }
460*15dc779aSAndroid Build Coastguard Worker
461*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < lg; i++) {
462*15dc779aSAndroid Build Coastguard Worker params[i + 2] = sq_quant[i];
463*15dc779aSAndroid Build Coastguard Worker x[i] = (FLOAT32)sq_quant[i];
464*15dc779aSAndroid Build Coastguard Worker }
465*15dc779aSAndroid Build Coastguard Worker
466*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < lg; i++) {
467*15dc779aSAndroid Build Coastguard Worker en[i] = x[i] * x[i];
468*15dc779aSAndroid Build Coastguard Worker }
469*15dc779aSAndroid Build Coastguard Worker if (mode == 3) {
470*15dc779aSAndroid Build Coastguard Worker tmp = 0.9441f;
471*15dc779aSAndroid Build Coastguard Worker } else if (mode == 2) {
472*15dc779aSAndroid Build Coastguard Worker tmp = 0.8913f;
473*15dc779aSAndroid Build Coastguard Worker } else {
474*15dc779aSAndroid Build Coastguard Worker tmp = 0.7943f;
475*15dc779aSAndroid Build Coastguard Worker }
476*15dc779aSAndroid Build Coastguard Worker energy = 0.0f;
477*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < lg; i++) {
478*15dc779aSAndroid Build Coastguard Worker if (en[i] > energy) {
479*15dc779aSAndroid Build Coastguard Worker energy = en[i];
480*15dc779aSAndroid Build Coastguard Worker }
481*15dc779aSAndroid Build Coastguard Worker en[i] = energy;
482*15dc779aSAndroid Build Coastguard Worker energy *= tmp;
483*15dc779aSAndroid Build Coastguard Worker }
484*15dc779aSAndroid Build Coastguard Worker energy = 0.0f;
485*15dc779aSAndroid Build Coastguard Worker for (i = lg - 1; i >= 0; i--) {
486*15dc779aSAndroid Build Coastguard Worker if (en[i] > energy) {
487*15dc779aSAndroid Build Coastguard Worker energy = en[i];
488*15dc779aSAndroid Build Coastguard Worker }
489*15dc779aSAndroid Build Coastguard Worker en[i] = energy;
490*15dc779aSAndroid Build Coastguard Worker energy *= tmp;
491*15dc779aSAndroid Build Coastguard Worker }
492*15dc779aSAndroid Build Coastguard Worker
493*15dc779aSAndroid Build Coastguard Worker nsfill_en_thres = 0.707f;
494*15dc779aSAndroid Build Coastguard Worker
495*15dc779aSAndroid Build Coastguard Worker tmp = 0.0625f;
496*15dc779aSAndroid Build Coastguard Worker k = 1;
497*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < lg; i++) {
498*15dc779aSAndroid Build Coastguard Worker if (en[i] <= nsfill_en_thres) {
499*15dc779aSAndroid Build Coastguard Worker tmp += sq_enc[i] * sq_enc[i];
500*15dc779aSAndroid Build Coastguard Worker k++;
501*15dc779aSAndroid Build Coastguard Worker }
502*15dc779aSAndroid Build Coastguard Worker }
503*15dc779aSAndroid Build Coastguard Worker
504*15dc779aSAndroid Build Coastguard Worker iusace_adapt_lo_freq_deemph(x, lg, alfd_gains);
505*15dc779aSAndroid Build Coastguard Worker
506*15dc779aSAndroid Build Coastguard Worker energy = 1e-6f;
507*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < lg; i++) {
508*15dc779aSAndroid Build Coastguard Worker corr += x_tmp[i] * x[i];
509*15dc779aSAndroid Build Coastguard Worker energy += x[i] * x[i];
510*15dc779aSAndroid Build Coastguard Worker }
511*15dc779aSAndroid Build Coastguard Worker gain_tcx = (corr / energy);
512*15dc779aSAndroid Build Coastguard Worker
513*15dc779aSAndroid Build Coastguard Worker if (gain_tcx == 0.0f) {
514*15dc779aSAndroid Build Coastguard Worker gain_tcx = sq_gain;
515*15dc779aSAndroid Build Coastguard Worker }
516*15dc779aSAndroid Build Coastguard Worker
517*15dc779aSAndroid Build Coastguard Worker energy = 0.0001f;
518*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < lg; i++) {
519*15dc779aSAndroid Build Coastguard Worker tmp = x_tmp[i] - gain_tcx * x[i];
520*15dc779aSAndroid Build Coastguard Worker energy += tmp * tmp;
521*15dc779aSAndroid Build Coastguard Worker }
522*15dc779aSAndroid Build Coastguard Worker
523*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)sqrt((energy * (2.0f / (FLOAT32)lg)) / (FLOAT32)lg);
524*15dc779aSAndroid Build Coastguard Worker
525*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < frame_len; i++) {
526*15dc779aSAndroid Build Coastguard Worker wsynth[i] = weighted_sig[i] + tmp;
527*15dc779aSAndroid Build Coastguard Worker }
528*15dc779aSAndroid Build Coastguard Worker
529*15dc779aSAndroid Build Coastguard Worker energy = 0.01f;
530*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < lg; i++) {
531*15dc779aSAndroid Build Coastguard Worker energy += x[i] * x[i];
532*15dc779aSAndroid Build Coastguard Worker }
533*15dc779aSAndroid Build Coastguard Worker
534*15dc779aSAndroid Build Coastguard Worker tmp = (FLOAT32)(2.0f * sqrt(energy) / (FLOAT32)lg);
535*15dc779aSAndroid Build Coastguard Worker gain = gain_tcx * tmp;
536*15dc779aSAndroid Build Coastguard Worker
537*15dc779aSAndroid Build Coastguard Worker index = (WORD32)floor(0.5f + (28.0f * (FLOAT32)log10(gain)));
538*15dc779aSAndroid Build Coastguard Worker if (index < 0) {
539*15dc779aSAndroid Build Coastguard Worker index = 0;
540*15dc779aSAndroid Build Coastguard Worker }
541*15dc779aSAndroid Build Coastguard Worker if (index > 127) {
542*15dc779aSAndroid Build Coastguard Worker index = 127;
543*15dc779aSAndroid Build Coastguard Worker }
544*15dc779aSAndroid Build Coastguard Worker params[1] = index;
545*15dc779aSAndroid Build Coastguard Worker
546*15dc779aSAndroid Build Coastguard Worker gain_tcx = (FLOAT32)pow(10.0f, ((FLOAT32)index) / 28.0f) / tmp;
547*15dc779aSAndroid Build Coastguard Worker st->gain_tcx = gain_tcx;
548*15dc779aSAndroid Build Coastguard Worker
549*15dc779aSAndroid Build Coastguard Worker sq_err_energy = 0.f;
550*15dc779aSAndroid Build Coastguard Worker n = 0;
551*15dc779aSAndroid Build Coastguard Worker for (k = lg / 2; k < lg;) {
552*15dc779aSAndroid Build Coastguard Worker tmp = 0.f;
553*15dc779aSAndroid Build Coastguard Worker
554*15dc779aSAndroid Build Coastguard Worker max_k = MIN(lg, k + 8);
555*15dc779aSAndroid Build Coastguard Worker for (i = k; i < max_k; i++) {
556*15dc779aSAndroid Build Coastguard Worker tmp += (FLOAT32)sq_quant[i] * sq_quant[i];
557*15dc779aSAndroid Build Coastguard Worker }
558*15dc779aSAndroid Build Coastguard Worker if (tmp == 0.f) {
559*15dc779aSAndroid Build Coastguard Worker tmp = 0.f;
560*15dc779aSAndroid Build Coastguard Worker for (i = k; i < max_k; i++) {
561*15dc779aSAndroid Build Coastguard Worker tmp += sq_enc[i] * sq_enc[i];
562*15dc779aSAndroid Build Coastguard Worker }
563*15dc779aSAndroid Build Coastguard Worker
564*15dc779aSAndroid Build Coastguard Worker sq_err_energy += (FLOAT32)log10((tmp / (FLOAT64)8) + 0.000000001);
565*15dc779aSAndroid Build Coastguard Worker n += 1;
566*15dc779aSAndroid Build Coastguard Worker }
567*15dc779aSAndroid Build Coastguard Worker k = max_k;
568*15dc779aSAndroid Build Coastguard Worker }
569*15dc779aSAndroid Build Coastguard Worker if (n > 0) {
570*15dc779aSAndroid Build Coastguard Worker fac_ns = (FLOAT32)pow(10., sq_err_energy / (FLOAT64)(2 * n));
571*15dc779aSAndroid Build Coastguard Worker } else {
572*15dc779aSAndroid Build Coastguard Worker fac_ns = 0.f;
573*15dc779aSAndroid Build Coastguard Worker }
574*15dc779aSAndroid Build Coastguard Worker
575*15dc779aSAndroid Build Coastguard Worker tmp = 8.0f - (16.0f * fac_ns);
576*15dc779aSAndroid Build Coastguard Worker
577*15dc779aSAndroid Build Coastguard Worker index = (WORD32)floor(tmp + 0.5);
578*15dc779aSAndroid Build Coastguard Worker if (index < 0) {
579*15dc779aSAndroid Build Coastguard Worker index = 0;
580*15dc779aSAndroid Build Coastguard Worker }
581*15dc779aSAndroid Build Coastguard Worker if (index > 7) {
582*15dc779aSAndroid Build Coastguard Worker index = 7;
583*15dc779aSAndroid Build Coastguard Worker }
584*15dc779aSAndroid Build Coastguard Worker
585*15dc779aSAndroid Build Coastguard Worker params[0] = index;
586*15dc779aSAndroid Build Coastguard Worker
587*15dc779aSAndroid Build Coastguard Worker iusace_noise_shaping(x, lg, ((FDNS_RESOLUTION * len_subfrm) / LEN_FRAME), gain1, gain2);
588*15dc779aSAndroid Build Coastguard Worker
589*15dc779aSAndroid Build Coastguard Worker iusace_tcx_imdct(x, xn_buf, (2 * fac_length), frame_len - (2 * fac_length), (2 * fac_length),
590*15dc779aSAndroid Build Coastguard Worker pstr_scratch);
591*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < frame_len + (2 * fac_length); i++) {
592*15dc779aSAndroid Build Coastguard Worker xn_buf[i] = xn_buf[i] * (2.0f / lg);
593*15dc779aSAndroid Build Coastguard Worker }
594*15dc779aSAndroid Build Coastguard Worker
595*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len_prev; i++) {
596*15dc779aSAndroid Build Coastguard Worker fac_window[i] = sine_window_prev[i] * sine_window_prev[(2 * fac_len_prev) - 1 - i];
597*15dc779aSAndroid Build Coastguard Worker fac_window[fac_len_prev + i] =
598*15dc779aSAndroid Build Coastguard Worker 1.0f - (sine_window_prev[fac_len_prev + i] * sine_window_prev[fac_len_prev + i]);
599*15dc779aSAndroid Build Coastguard Worker }
600*15dc779aSAndroid Build Coastguard Worker
601*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len_prev; i++) {
602*15dc779aSAndroid Build Coastguard Worker xn1[ORDER + i] -= sq_gain * xn_buf[fac_length + i] * sine_window_prev[fac_len_prev + i];
603*15dc779aSAndroid Build Coastguard Worker }
604*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len; i++) {
605*15dc779aSAndroid Build Coastguard Worker xn2[ORDER + i] -= sq_gain * xn_buf[i + frame_len] * sine_window[(2 * fac_len) - 1 - i];
606*15dc779aSAndroid Build Coastguard Worker }
607*15dc779aSAndroid Build Coastguard Worker
608*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ORDER; i++) {
609*15dc779aSAndroid Build Coastguard Worker xn1[i] -= lpd_state->tcx_quant[1 + 128 - ORDER + i];
610*15dc779aSAndroid Build Coastguard Worker xn2[i] -= sq_gain * xn_buf[frame_len - ORDER + i];
611*15dc779aSAndroid Build Coastguard Worker }
612*15dc779aSAndroid Build Coastguard Worker
613*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len_prev; i++) {
614*15dc779aSAndroid Build Coastguard Worker facelp[i] = lpd_state->tcx_quant[1 + 128 + i] * fac_window[fac_len_prev + i] +
615*15dc779aSAndroid Build Coastguard Worker lpd_state->tcx_quant[1 + 128 - 1 - i] * fac_window[fac_len_prev - 1 - i];
616*15dc779aSAndroid Build Coastguard Worker }
617*15dc779aSAndroid Build Coastguard Worker
618*15dc779aSAndroid Build Coastguard Worker energy = 0.0f;
619*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len_prev; i++) energy += xn1[ORDER + i] * xn1[ORDER + i];
620*15dc779aSAndroid Build Coastguard Worker energy *= 2.0f;
621*15dc779aSAndroid Build Coastguard Worker tmp = 0.0f;
622*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len_prev; i++) tmp += facelp[i] * facelp[i];
623*15dc779aSAndroid Build Coastguard Worker if (tmp > energy)
624*15dc779aSAndroid Build Coastguard Worker gain = (FLOAT32)sqrt(energy / tmp);
625*15dc779aSAndroid Build Coastguard Worker else
626*15dc779aSAndroid Build Coastguard Worker gain = 1.0f;
627*15dc779aSAndroid Build Coastguard Worker
628*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len_prev; i++) {
629*15dc779aSAndroid Build Coastguard Worker xn1[ORDER + i] -= gain * facelp[i];
630*15dc779aSAndroid Build Coastguard Worker }
631*15dc779aSAndroid Build Coastguard Worker
632*15dc779aSAndroid Build Coastguard Worker iusace_get_weighted_lpc(lpc_coeffs_quant + (ORDER + 1), lp_flt_coeffs);
633*15dc779aSAndroid Build Coastguard Worker iusace_compute_lp_residual(lp_flt_coeffs, xn1 + ORDER, x1, fac_len_prev);
634*15dc779aSAndroid Build Coastguard Worker
635*15dc779aSAndroid Build Coastguard Worker iusace_get_weighted_lpc(lpc_coeffs_quant + (2 * (ORDER + 1)), lp_flt_coeffs);
636*15dc779aSAndroid Build Coastguard Worker iusace_compute_lp_residual(lp_flt_coeffs, xn2 + ORDER, x2, fac_len);
637*15dc779aSAndroid Build Coastguard Worker
638*15dc779aSAndroid Build Coastguard Worker iusace_tcx_mdct(x1, x1, fac_len_prev, pstr_scratch);
639*15dc779aSAndroid Build Coastguard Worker iusace_tcx_mdct(x2, x2, fac_len, pstr_scratch);
640*15dc779aSAndroid Build Coastguard Worker
641*15dc779aSAndroid Build Coastguard Worker gain_prev = (FLOAT32)(sq_gain * 0.5f * sqrt(((FLOAT32)fac_len_prev) / (FLOAT32)frame_len));
642*15dc779aSAndroid Build Coastguard Worker gain_next = (FLOAT32)(sq_gain * 0.5f * sqrt(((FLOAT32)fac_len) / (FLOAT32)frame_len));
643*15dc779aSAndroid Build Coastguard Worker
644*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len_prev; i++) {
645*15dc779aSAndroid Build Coastguard Worker x1[i] /= gain_prev;
646*15dc779aSAndroid Build Coastguard Worker }
647*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len; i++) {
648*15dc779aSAndroid Build Coastguard Worker x2[i] /= gain_next;
649*15dc779aSAndroid Build Coastguard Worker }
650*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len_prev / 4; i++) {
651*15dc779aSAndroid Build Coastguard Worker k = i * lg / (8 * fac_len_prev);
652*15dc779aSAndroid Build Coastguard Worker x1[i] /= alfd_gains[k];
653*15dc779aSAndroid Build Coastguard Worker }
654*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len / 4; i++) {
655*15dc779aSAndroid Build Coastguard Worker k = i * lg / (8 * fac_len);
656*15dc779aSAndroid Build Coastguard Worker x2[i] /= alfd_gains[k];
657*15dc779aSAndroid Build Coastguard Worker }
658*15dc779aSAndroid Build Coastguard Worker
659*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len; i += 8) {
660*15dc779aSAndroid Build Coastguard Worker iusace_find_nearest_neighbor(&x2[i], &y[i]);
661*15dc779aSAndroid Build Coastguard Worker }
662*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len; i++) {
663*15dc779aSAndroid Build Coastguard Worker lpd_state->avq_params[i] = y[i];
664*15dc779aSAndroid Build Coastguard Worker x2[i] = (FLOAT32)y[i];
665*15dc779aSAndroid Build Coastguard Worker }
666*15dc779aSAndroid Build Coastguard Worker
667*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len_prev; i += 8) {
668*15dc779aSAndroid Build Coastguard Worker iusace_find_nearest_neighbor(&x1[i], &y[i]);
669*15dc779aSAndroid Build Coastguard Worker }
670*15dc779aSAndroid Build Coastguard Worker
671*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len_prev; i++) {
672*15dc779aSAndroid Build Coastguard Worker x1[i] = (FLOAT32)y[i];
673*15dc779aSAndroid Build Coastguard Worker }
674*15dc779aSAndroid Build Coastguard Worker
675*15dc779aSAndroid Build Coastguard Worker gain_prev = (FLOAT32)(gain_tcx * 0.5f * sqrt(((FLOAT32)fac_len_prev) / (FLOAT32)frame_len));
676*15dc779aSAndroid Build Coastguard Worker gain_next = (FLOAT32)(gain_tcx * 0.5f * sqrt(((FLOAT32)fac_len) / (FLOAT32)frame_len));
677*15dc779aSAndroid Build Coastguard Worker
678*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len_prev; i++) {
679*15dc779aSAndroid Build Coastguard Worker x1[i] *= gain_prev;
680*15dc779aSAndroid Build Coastguard Worker }
681*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len; i++) {
682*15dc779aSAndroid Build Coastguard Worker x2[i] *= gain_next;
683*15dc779aSAndroid Build Coastguard Worker }
684*15dc779aSAndroid Build Coastguard Worker for (i = 0; i<fac_len_prev>> 2; i++) {
685*15dc779aSAndroid Build Coastguard Worker k = i * lg / (fac_len_prev << 3);
686*15dc779aSAndroid Build Coastguard Worker x1[i] *= alfd_gains[k];
687*15dc779aSAndroid Build Coastguard Worker }
688*15dc779aSAndroid Build Coastguard Worker for (i = 0; i<fac_len>> 2; i++) {
689*15dc779aSAndroid Build Coastguard Worker k = i * lg / (fac_len << 3);
690*15dc779aSAndroid Build Coastguard Worker x2[i] *= alfd_gains[k];
691*15dc779aSAndroid Build Coastguard Worker }
692*15dc779aSAndroid Build Coastguard Worker iusace_tcx_mdct(x1, xn1, fac_len_prev, pstr_scratch);
693*15dc779aSAndroid Build Coastguard Worker iusace_tcx_mdct(x2, xn2, fac_len, pstr_scratch);
694*15dc779aSAndroid Build Coastguard Worker
695*15dc779aSAndroid Build Coastguard Worker FLOAT32 coeff1 = (2.0f / (FLOAT32)fac_len_prev), coeff2 = (2.0f / (FLOAT32)fac_len);
696*15dc779aSAndroid Build Coastguard Worker
697*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len_prev; i++) {
698*15dc779aSAndroid Build Coastguard Worker xn1[i] = xn1[i] * coeff1;
699*15dc779aSAndroid Build Coastguard Worker }
700*15dc779aSAndroid Build Coastguard Worker
701*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len; i++) {
702*15dc779aSAndroid Build Coastguard Worker xn2[i] = xn2[i] * coeff2;
703*15dc779aSAndroid Build Coastguard Worker }
704*15dc779aSAndroid Build Coastguard Worker
705*15dc779aSAndroid Build Coastguard Worker memset(xn1 + fac_len_prev, 0, fac_len_prev * sizeof(FLOAT32));
706*15dc779aSAndroid Build Coastguard Worker memset(xn2 + fac_len, 0, fac_len * sizeof(FLOAT32));
707*15dc779aSAndroid Build Coastguard Worker
708*15dc779aSAndroid Build Coastguard Worker iusace_get_weighted_lpc(lpc_coeffs_quant + (ORDER + 1), lp_flt_coeffs);
709*15dc779aSAndroid Build Coastguard Worker iusace_synthesis_tool_float(lp_flt_coeffs, xn1, xn1, 2 * fac_len_prev, xn1 + fac_len_prev,
710*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_buf_synthesis_tool);
711*15dc779aSAndroid Build Coastguard Worker
712*15dc779aSAndroid Build Coastguard Worker iusace_get_weighted_lpc(lpc_coeffs_quant + (2 * (ORDER + 1)), lp_flt_coeffs);
713*15dc779aSAndroid Build Coastguard Worker iusace_synthesis_tool_float(lp_flt_coeffs, xn2, xn2, fac_len, xn2 + fac_len,
714*15dc779aSAndroid Build Coastguard Worker pstr_scratch->p_buf_synthesis_tool);
715*15dc779aSAndroid Build Coastguard Worker
716*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len_prev; i++) {
717*15dc779aSAndroid Build Coastguard Worker xn1[i] += facelp[i];
718*15dc779aSAndroid Build Coastguard Worker }
719*15dc779aSAndroid Build Coastguard Worker
720*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < frame_len + (fac_length << 1); i++) {
721*15dc779aSAndroid Build Coastguard Worker xn_buf[i] *= gain_tcx;
722*15dc779aSAndroid Build Coastguard Worker }
723*15dc779aSAndroid Build Coastguard Worker
724*15dc779aSAndroid Build Coastguard Worker if (lpd_state->mode >= -1) {
725*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < (2 * fac_len_prev); i++) {
726*15dc779aSAndroid Build Coastguard Worker xn_buf[i + fac_length - fac_len_prev] *= sine_window_prev[i];
727*15dc779aSAndroid Build Coastguard Worker }
728*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_length - fac_len_prev; i++) {
729*15dc779aSAndroid Build Coastguard Worker xn_buf[i] = 0.0f;
730*15dc779aSAndroid Build Coastguard Worker }
731*15dc779aSAndroid Build Coastguard Worker }
732*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < (2 * fac_len); i++) {
733*15dc779aSAndroid Build Coastguard Worker xn_buf[i + frame_len + fac_length - fac_len] *= sine_window[(2 * fac_len) - 1 - i];
734*15dc779aSAndroid Build Coastguard Worker }
735*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_length - fac_len; i++) {
736*15dc779aSAndroid Build Coastguard Worker xn_buf[i + frame_len + fac_length + fac_len] = 0.0f;
737*15dc779aSAndroid Build Coastguard Worker }
738*15dc779aSAndroid Build Coastguard Worker
739*15dc779aSAndroid Build Coastguard Worker if (lpd_state->mode != 0) {
740*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < (2 * fac_length); i++) {
741*15dc779aSAndroid Build Coastguard Worker xn_buf[i] += lpd_state->tcx_quant[1 + 128 - fac_length + i];
742*15dc779aSAndroid Build Coastguard Worker }
743*15dc779aSAndroid Build Coastguard Worker
744*15dc779aSAndroid Build Coastguard Worker mem_tcx_q = lpd_state->tcx_quant[128 - fac_length];
745*15dc779aSAndroid Build Coastguard Worker } else {
746*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len_prev; i++) {
747*15dc779aSAndroid Build Coastguard Worker params[i - fac_len_prev] = y[i];
748*15dc779aSAndroid Build Coastguard Worker }
749*15dc779aSAndroid Build Coastguard Worker
750*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < (2 * fac_len_prev); i++) {
751*15dc779aSAndroid Build Coastguard Worker xn_buf[i + fac_length] += xn1[i];
752*15dc779aSAndroid Build Coastguard Worker }
753*15dc779aSAndroid Build Coastguard Worker mem_tcx_q = lpd_state->tcx_quant[128];
754*15dc779aSAndroid Build Coastguard Worker }
755*15dc779aSAndroid Build Coastguard Worker
756*15dc779aSAndroid Build Coastguard Worker memcpy(lpd_state->tcx_quant, xn_buf + frame_len + fac_length - 128 - 1,
757*15dc779aSAndroid Build Coastguard Worker (1 + 256) * sizeof(FLOAT32));
758*15dc779aSAndroid Build Coastguard Worker
759*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_len; i++) {
760*15dc779aSAndroid Build Coastguard Worker xn_buf[i + frame_len + (fac_length - fac_len)] += xn2[i];
761*15dc779aSAndroid Build Coastguard Worker }
762*15dc779aSAndroid Build Coastguard Worker
763*15dc779aSAndroid Build Coastguard Worker if (lpd_state->mode > 0) {
764*15dc779aSAndroid Build Coastguard Worker iusace_apply_preemph(xn_buf, TILT_FAC, fac_length, &mem_tcx_q);
765*15dc779aSAndroid Build Coastguard Worker
766*15dc779aSAndroid Build Coastguard Worker ptr_lp_flt_coeffs = lpd_state->lpc_coeffs_quant;
767*15dc779aSAndroid Build Coastguard Worker
768*15dc779aSAndroid Build Coastguard Worker TTT = fac_length % LEN_SUBFR;
769*15dc779aSAndroid Build Coastguard Worker if (TTT != 0) {
770*15dc779aSAndroid Build Coastguard Worker memcpy(&(lpd_state->synth[ORDER + 128 - fac_length]), &xn_buf[0], TTT * sizeof(FLOAT32));
771*15dc779aSAndroid Build Coastguard Worker iusace_compute_lp_residual(ptr_lp_flt_coeffs, &(lpd_state->synth[ORDER + 128 - fac_length]),
772*15dc779aSAndroid Build Coastguard Worker &(lpd_state->acelp_exc[(2 * len_subfrm) - fac_length]), TTT);
773*15dc779aSAndroid Build Coastguard Worker
774*15dc779aSAndroid Build Coastguard Worker ptr_lp_flt_coeffs += (ORDER + 1);
775*15dc779aSAndroid Build Coastguard Worker }
776*15dc779aSAndroid Build Coastguard Worker
777*15dc779aSAndroid Build Coastguard Worker for (i_subfr = TTT; i_subfr < fac_length; i_subfr += LEN_SUBFR) {
778*15dc779aSAndroid Build Coastguard Worker memcpy(&(lpd_state->synth[ORDER + 128 - fac_length + i_subfr]), &xn_buf[i_subfr],
779*15dc779aSAndroid Build Coastguard Worker LEN_SUBFR * sizeof(FLOAT32));
780*15dc779aSAndroid Build Coastguard Worker iusace_compute_lp_residual(
781*15dc779aSAndroid Build Coastguard Worker ptr_lp_flt_coeffs, &(lpd_state->synth[ORDER + 128 - fac_length + i_subfr]),
782*15dc779aSAndroid Build Coastguard Worker &(lpd_state->acelp_exc[(2 * len_subfrm) - fac_length + i_subfr]), LEN_SUBFR);
783*15dc779aSAndroid Build Coastguard Worker ptr_lp_flt_coeffs += (ORDER + 1);
784*15dc779aSAndroid Build Coastguard Worker }
785*15dc779aSAndroid Build Coastguard Worker
786*15dc779aSAndroid Build Coastguard Worker ptr_lp_flt_coeffs = lpd_state->lpc_coeffs;
787*15dc779aSAndroid Build Coastguard Worker for (i_subfr = 0; i_subfr < fac_length; i_subfr += LEN_SUBFR) {
788*15dc779aSAndroid Build Coastguard Worker iusace_get_weighted_lpc(ptr_lp_flt_coeffs, lp_flt_coeffs);
789*15dc779aSAndroid Build Coastguard Worker iusace_compute_lp_residual(lp_flt_coeffs,
790*15dc779aSAndroid Build Coastguard Worker &(lpd_state->synth[ORDER + 128 - fac_length + i_subfr]),
791*15dc779aSAndroid Build Coastguard Worker &(lpd_state->wsynth[1 + 128 - fac_length + i_subfr]), LEN_SUBFR);
792*15dc779aSAndroid Build Coastguard Worker ptr_lp_flt_coeffs += (ORDER + 1);
793*15dc779aSAndroid Build Coastguard Worker }
794*15dc779aSAndroid Build Coastguard Worker tmp = lpd_state->wsynth[0 + 128 - fac_length];
795*15dc779aSAndroid Build Coastguard Worker iusace_apply_deemph(&(lpd_state->wsynth[1 + 128 - fac_length]), TILT_FAC, fac_length, &tmp);
796*15dc779aSAndroid Build Coastguard Worker }
797*15dc779aSAndroid Build Coastguard Worker
798*15dc779aSAndroid Build Coastguard Worker k = ((frame_len / LEN_SUBFR) - 2) * (ORDER + 1);
799*15dc779aSAndroid Build Coastguard Worker memcpy(lpd_state->lpc_coeffs, lpc_coeffs + k, 2 * (ORDER + 1) * sizeof(FLOAT32));
800*15dc779aSAndroid Build Coastguard Worker
801*15dc779aSAndroid Build Coastguard Worker memcpy(lpd_state->lpc_coeffs_quant, lpc_coeffs_quant + (2 * (ORDER + 1)),
802*15dc779aSAndroid Build Coastguard Worker (ORDER + 1) * sizeof(FLOAT32));
803*15dc779aSAndroid Build Coastguard Worker memcpy(lpd_state->lpc_coeffs_quant + (ORDER + 1), lpd_state->lpc_coeffs_quant,
804*15dc779aSAndroid Build Coastguard Worker (ORDER + 1) * sizeof(FLOAT32));
805*15dc779aSAndroid Build Coastguard Worker
806*15dc779aSAndroid Build Coastguard Worker memcpy(synth - 128, &(lpd_state->synth[ORDER]), 128 * sizeof(FLOAT32));
807*15dc779aSAndroid Build Coastguard Worker lpd_state->tcx_fac = xn[frame_len - 1];
808*15dc779aSAndroid Build Coastguard Worker
809*15dc779aSAndroid Build Coastguard Worker iusace_apply_preemph(xn, TILT_FAC, frame_len, &mem_tcx_q);
810*15dc779aSAndroid Build Coastguard Worker for (i_subfr = 0; i_subfr < frame_len; i_subfr += LEN_SUBFR) {
811*15dc779aSAndroid Build Coastguard Worker memcpy(&synth[i_subfr], &xn[i_subfr], LEN_SUBFR * sizeof(FLOAT32));
812*15dc779aSAndroid Build Coastguard Worker iusace_compute_lp_residual(lpc_coeffs_quant + (2 * (ORDER + 1)), &synth[i_subfr],
813*15dc779aSAndroid Build Coastguard Worker &xn[i_subfr], LEN_SUBFR);
814*15dc779aSAndroid Build Coastguard Worker }
815*15dc779aSAndroid Build Coastguard Worker memcpy(lpd_state->synth, synth + frame_len - (ORDER + 128), (ORDER + 128) * sizeof(FLOAT32));
816*15dc779aSAndroid Build Coastguard Worker
817*15dc779aSAndroid Build Coastguard Worker if (frame_len == len_subfrm) {
818*15dc779aSAndroid Build Coastguard Worker memcpy(x, lpd_state->acelp_exc + len_subfrm, len_subfrm * sizeof(FLOAT32));
819*15dc779aSAndroid Build Coastguard Worker memcpy(lpd_state->acelp_exc, x, len_subfrm * sizeof(FLOAT32));
820*15dc779aSAndroid Build Coastguard Worker memcpy(lpd_state->acelp_exc + len_subfrm, xn, len_subfrm * sizeof(FLOAT32));
821*15dc779aSAndroid Build Coastguard Worker } else {
822*15dc779aSAndroid Build Coastguard Worker memcpy(lpd_state->acelp_exc, xn + frame_len - (2 * len_subfrm),
823*15dc779aSAndroid Build Coastguard Worker 2 * len_subfrm * sizeof(FLOAT32));
824*15dc779aSAndroid Build Coastguard Worker }
825*15dc779aSAndroid Build Coastguard Worker
826*15dc779aSAndroid Build Coastguard Worker memcpy(wsynth - 128, &(lpd_state->wsynth[1]), 128 * sizeof(FLOAT32));
827*15dc779aSAndroid Build Coastguard Worker
828*15dc779aSAndroid Build Coastguard Worker ptr_lp_flt_coeffs = lpc_coeffs;
829*15dc779aSAndroid Build Coastguard Worker for (i_subfr = 0; i_subfr < frame_len; i_subfr += LEN_SUBFR) {
830*15dc779aSAndroid Build Coastguard Worker iusace_get_weighted_lpc(ptr_lp_flt_coeffs, lp_flt_coeffs);
831*15dc779aSAndroid Build Coastguard Worker iusace_compute_lp_residual(lp_flt_coeffs, &synth[i_subfr], &wsynth[i_subfr], LEN_SUBFR);
832*15dc779aSAndroid Build Coastguard Worker ptr_lp_flt_coeffs += (ORDER + 1);
833*15dc779aSAndroid Build Coastguard Worker }
834*15dc779aSAndroid Build Coastguard Worker tmp = wsynth[-1];
835*15dc779aSAndroid Build Coastguard Worker iusace_apply_deemph(wsynth, TILT_FAC, frame_len, &tmp);
836*15dc779aSAndroid Build Coastguard Worker
837*15dc779aSAndroid Build Coastguard Worker memcpy(lpd_state->wsynth, wsynth + frame_len - (1 + 128), (1 + 128) * sizeof(FLOAT32));
838*15dc779aSAndroid Build Coastguard Worker
839*15dc779aSAndroid Build Coastguard Worker lpd_state->mode = mode;
840*15dc779aSAndroid Build Coastguard Worker
841*15dc779aSAndroid Build Coastguard Worker lpd_state->num_bits = 10 + target_bits;
842*15dc779aSAndroid Build Coastguard Worker
843*15dc779aSAndroid Build Coastguard Worker return;
844*15dc779aSAndroid Build Coastguard Worker }
845