/src/libxaac/encoder/iusace_lpd_enc.c
Line | Count | Source (jump to first uncovered line) |
1 | | /****************************************************************************** |
2 | | * * |
3 | | * Copyright (C) 2023 The Android Open Source Project |
4 | | * |
5 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
6 | | * you may not use this file except in compliance with the License. |
7 | | * You may obtain a copy of the License at: |
8 | | * |
9 | | * http://www.apache.org/licenses/LICENSE-2.0 |
10 | | * |
11 | | * Unless required by applicable law or agreed to in writing, software |
12 | | * distributed under the License is distributed on an "AS IS" BASIS, |
13 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
14 | | * See the License for the specific language governing permissions and |
15 | | * limitations under the License. |
16 | | * |
17 | | ***************************************************************************** |
18 | | * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
19 | | */ |
20 | | |
21 | | #include <string.h> |
22 | | #include <math.h> |
23 | | #include "ixheaac_type_def.h" |
24 | | #include "ixheaace_adjust_threshold_data.h" |
25 | | #include "iusace_bitbuffer.h" |
26 | | |
27 | | /* DRC */ |
28 | | #include "impd_drc_common_enc.h" |
29 | | #include "impd_drc_uni_drc.h" |
30 | | #include "impd_drc_tables.h" |
31 | | #include "impd_drc_api.h" |
32 | | #include "impd_drc_uni_drc_eq.h" |
33 | | #include "impd_drc_uni_drc_filter_bank.h" |
34 | | #include "impd_drc_gain_enc.h" |
35 | | #include "impd_drc_struct_def.h" |
36 | | |
37 | | #include "iusace_cnst.h" |
38 | | #include "iusace_tns_usac.h" |
39 | | #include "iusace_psy_mod.h" |
40 | | #include "iusace_psy_utils.h" |
41 | | #include "iusace_tns_usac.h" |
42 | | #include "iusace_config.h" |
43 | | #include "iusace_arith_enc.h" |
44 | | #include "iusace_fd_qc_util.h" |
45 | | #include "iusace_fd_quant.h" |
46 | | #include "iusace_block_switch_const.h" |
47 | | #include "iusace_block_switch_struct_def.h" |
48 | | #include "iusace_ms.h" |
49 | | #include "iusace_signal_classifier.h" |
50 | | #include "ixheaace_sbr_header.h" |
51 | | #include "ixheaace_config.h" |
52 | | #include "ixheaace_asc_write.h" |
53 | | #include "iusace_main.h" |
54 | | #include "iusace_lpd_rom.h" |
55 | | #include "iusace_lpd.h" |
56 | | #include "iusace_func_prototypes.h" |
57 | | #include "ixheaac_error_standards.h" |
58 | | |
59 | 2.81k | VOID iusace_init_td_data(ia_usac_td_encoder_struct *st, WORD32 len_frame) { |
60 | 2.81k | WORD32 len_window; |
61 | 2.81k | WORD32 num_frames = NUM_FRAMES; |
62 | 2.81k | st->len_subfrm = len_frame / num_frames; |
63 | | |
64 | 2.81k | st->len_frame = len_frame; |
65 | 2.81k | st->num_subfrm = (MAX_NUM_SUBFR * len_frame) / LEN_SUPERFRAME; |
66 | | |
67 | 2.81k | iusace_reset_td_enc(st); |
68 | 2.81k | st->prev_mode = -1; |
69 | 2.81k | st->arith_reset_flag = 1; |
70 | | |
71 | 2.81k | if (st->fscale <= FSCALE_DENOM) { |
72 | 819 | len_window = (LEN_LP_WINDOW * len_frame) / LEN_SUPERFRAME; |
73 | 1.99k | } else { |
74 | 1.99k | len_window = (LEN_LP_WINDOW_HIGH_RATE * len_frame) / LEN_SUPERFRAME; |
75 | 1.99k | } |
76 | | |
77 | 2.81k | switch (len_window) { |
78 | 1.41k | case 512: |
79 | 1.41k | st->lp_analysis_window = iusace_cos_window_512; |
80 | 1.41k | break; |
81 | 701 | case 448: |
82 | 701 | st->lp_analysis_window = iusace_cos_window_448; |
83 | 701 | break; |
84 | 586 | case 384: |
85 | 586 | st->lp_analysis_window = iexheaac_cos_window_384; |
86 | 586 | break; |
87 | 118 | default: |
88 | 118 | st->lp_analysis_window = iusace_cos_window_512; |
89 | 118 | break; |
90 | 2.81k | } |
91 | 2.81k | return; |
92 | 2.81k | } |
93 | | |
94 | | VOID iusace_config_acelp_core_mode(ia_usac_td_encoder_struct *st, WORD32 sampling_rate, |
95 | 2.81k | WORD32 bitrate) { |
96 | 2.81k | WORD32 max_bits, coder_bits; |
97 | 2.81k | const WORD32 *p_acelp_core_numbits_table; |
98 | | |
99 | 2.81k | p_acelp_core_numbits_table = (WORD32 *)iusace_acelp_core_numbits_1024; |
100 | | |
101 | 2.81k | max_bits = (WORD32)((FLOAT32)(bitrate * LEN_SUPERFRAME) / (FLOAT32)sampling_rate); |
102 | | |
103 | 3.92k | for (st->acelp_core_mode = 5; st->acelp_core_mode >= 0; st->acelp_core_mode--) { |
104 | 3.92k | coder_bits = p_acelp_core_numbits_table[st->acelp_core_mode]; |
105 | 3.92k | if (coder_bits <= max_bits) { |
106 | 2.81k | return; |
107 | 2.81k | } |
108 | 3.92k | } |
109 | 0 | if (st->acelp_core_mode == -1) { |
110 | 0 | st->acelp_core_mode = 0; |
111 | 0 | } |
112 | 0 | return; |
113 | 2.81k | } |
114 | | |
115 | 6.84k | VOID iusace_reset_td_enc(ia_usac_td_encoder_struct *st) { |
116 | 6.84k | WORD32 i; |
117 | | |
118 | 6.84k | memset(st->old_speech_pe, 0, (ORDER + LEN_NEXT_HIGH_RATE) * sizeof(FLOAT32)); |
119 | 6.84k | memset(st->prev_exc, 0, (MAX_PITCH + LEN_INTERPOL) * sizeof(FLOAT32)); |
120 | 6.84k | memset(st->prev_wsp, 0, (MAX_PITCH / OPL_DECIM) * sizeof(FLOAT32)); |
121 | 6.84k | memset(st->mem_lp_decim2, 0, 3 * sizeof(FLOAT32)); |
122 | 6.84k | memset(st->weighted_sig, 0, 128 * sizeof(FLOAT32)); |
123 | | |
124 | 6.84k | st->lpd_state.mode = -1; |
125 | 6.84k | st->lpd_state.num_bits = 0; |
126 | 6.84k | memset(st->lpd_state.lpc_coeffs_quant, 0, (2 * (ORDER + 1)) * sizeof(FLOAT32)); |
127 | 6.84k | memset(st->lpd_state.lpc_coeffs, 0, (2 * (ORDER + 1)) * sizeof(FLOAT32)); |
128 | 6.84k | memset(st->lpd_state.synth, 0, (ORDER + 128) * sizeof(FLOAT32)); |
129 | 6.84k | memset(st->lpd_state.wsynth, 0, (1 + 128) * sizeof(FLOAT32)); |
130 | | |
131 | 6.84k | memset(st->lpd_state.acelp_exc, 0, (2 * LEN_FRAME) * sizeof(FLOAT32)); |
132 | | |
133 | 6.84k | memset(st->lpd_state.tcx_mem, 0, 128 * sizeof(FLOAT32)); |
134 | 6.84k | memset(st->lpd_state.tcx_quant, 0, (1 + 256) * sizeof(FLOAT32)); |
135 | 6.84k | st->lpd_state.tcx_fac = 0.0f; |
136 | | |
137 | 6.84k | memset(st->prev_hp_wsp, 0, |
138 | 6.84k | (LEN_SUPERFRAME / OPL_DECIM + (MAX_PITCH / OPL_DECIM)) * sizeof(FLOAT32)); |
139 | | |
140 | 6.84k | memset(st->hp_ol_ltp_mem, 0, (3 * 2 + 1) * sizeof(FLOAT32)); |
141 | 41.0k | for (i = 0; i < 5; i++) st->prev_ol_lags[i] = 40; |
142 | 6.84k | st->prev_wsyn_mem = 0.0; |
143 | 6.84k | st->prev_wsp_mem = 0.0; |
144 | 6.84k | st->prev_xnq_mem = 0.0; |
145 | 6.84k | st->mem_wsp = 0.0; |
146 | 6.84k | st->prev_ovlp_size = 0; |
147 | 6.84k | st->prev_pitch_med = 40; |
148 | 6.84k | st->ol_wght_flg = 0; |
149 | 6.84k | st->ada_w = 0.0; |
150 | | |
151 | 6.84k | memcpy(st->isf_old, iusace_lsf_init, ORDER * sizeof(FLOAT32)); |
152 | 6.84k | memcpy(st->isp_old, iusace_ispold_init, ORDER * sizeof(FLOAT32)); |
153 | 6.84k | memcpy(st->isp_old_q, st->isp_old, ORDER * sizeof(FLOAT32)); |
154 | | |
155 | 6.84k | st->mem_preemph = 0.0; |
156 | 6.84k | memset(st->mem_sig_in, 0, 4 * sizeof(FLOAT32)); |
157 | 6.84k | memset(st->xn_buffer, 0, 128 * sizeof(FLOAT32)); |
158 | | |
159 | 6.84k | return; |
160 | 6.84k | } |
161 | | |
162 | | VOID iusace_highpass_prev_wsp(ia_usac_td_encoder_struct *st, FLOAT32 *decim_sig, |
163 | 4.03k | WORD32 pitch_max) { |
164 | 4.03k | WORD32 i, k; |
165 | 4.03k | WORD32 wsp_offset = pitch_max / OPL_DECIM; |
166 | 4.03k | WORD32 num_frames = (2 * LEN_SUBFR) / OPL_DECIM; |
167 | 4.03k | FLOAT32 *hp_wsp_mem = st->hp_ol_ltp_mem; |
168 | 4.03k | FLOAT32 *prev_hp_wsp = st->prev_hp_wsp; |
169 | 19.2k | for (i = 0; i < 2 * st->len_subfrm / OPL_DECIM; i += num_frames) { |
170 | 15.2k | FLOAT32 *data_a, *data_b, *hp_wsp, o; |
171 | 15.2k | FLOAT32 *wsp = decim_sig + ORDER + i; |
172 | 15.2k | data_a = hp_wsp_mem; |
173 | 15.2k | data_b = hp_wsp_mem + HP_ORDER; |
174 | 15.2k | hp_wsp = prev_hp_wsp + wsp_offset; |
175 | 988k | for (k = 0; k < num_frames; k++) { |
176 | 973k | data_b[0] = data_b[1]; |
177 | 973k | data_b[1] = data_b[2]; |
178 | 973k | data_b[2] = data_b[3]; |
179 | 973k | data_b[HP_ORDER] = wsp[k]; |
180 | 973k | o = data_b[0] * 0.83787057505665F; |
181 | 973k | o += data_b[1] * -2.50975570071058F; |
182 | 973k | o += data_b[2] * 2.50975570071058F; |
183 | 973k | o += data_b[3] * -0.83787057505665F; |
184 | 973k | o -= data_a[0] * -2.64436711600664F; |
185 | 973k | o -= data_a[1] * 2.35087386625360F; |
186 | 973k | o -= data_a[2] * -0.70001156927424F; |
187 | 973k | data_a[2] = data_a[1]; |
188 | 973k | data_a[1] = data_a[0]; |
189 | 973k | data_a[0] = o; |
190 | 973k | hp_wsp[k] = o; |
191 | 973k | } |
192 | 15.2k | memmove(prev_hp_wsp, &prev_hp_wsp[num_frames], wsp_offset * sizeof(FLOAT32)); |
193 | 15.2k | } |
194 | 4.03k | } |
195 | | |
196 | | VOID iusace_find_weighted_speech(FLOAT32 *filter_coef, FLOAT32 *speech, FLOAT32 *wsp, |
197 | 2.44M | FLOAT32 *mem_wsp, WORD32 length) { |
198 | 2.44M | WORD32 i_subfr; |
199 | 2.44M | FLOAT32 weighted_lpc[ORDER + 1]; |
200 | 15.1M | for (i_subfr = 0; i_subfr < length; i_subfr += LEN_SUBFR) { |
201 | 12.6M | iusace_get_weighted_lpc(filter_coef, weighted_lpc); |
202 | 12.6M | iusace_compute_lp_residual(weighted_lpc, &speech[i_subfr], &wsp[i_subfr], LEN_SUBFR); |
203 | 12.6M | filter_coef += (ORDER + 1); |
204 | 12.6M | } |
205 | 2.44M | iusace_apply_deemph(wsp, TILT_FAC, length, mem_wsp); |
206 | 2.44M | return; |
207 | 2.44M | } |
208 | | |
209 | | VOID iusace_get_interpolated_lpc(FLOAT32 *lsp_old, FLOAT32 *lsp_new, FLOAT32 *lpc, |
210 | 4.03k | WORD32 num_subfrm) { |
211 | 4.03k | FLOAT32 lsp[ORDER], *p_lpc, inc, fnew, fold; |
212 | 4.03k | WORD32 i, k; |
213 | | |
214 | 4.03k | inc = 1.0f / (FLOAT32)num_subfrm; |
215 | 4.03k | p_lpc = lpc; |
216 | 4.03k | fnew = 0.0f; |
217 | | |
218 | 34.4k | for (k = 0; k < num_subfrm; k++) { |
219 | 30.4k | fold = 1.0f - fnew; |
220 | 517k | for (i = 0; i < ORDER; i++) { |
221 | 486k | lsp[i] = (FLOAT32)(lsp_old[i] * fold + lsp_new[i] * fnew); |
222 | 486k | } |
223 | 30.4k | fnew += inc; |
224 | 30.4k | iusace_lsp_to_lp_conversion(lsp, p_lpc); |
225 | 30.4k | p_lpc += (ORDER + 1); |
226 | 30.4k | } |
227 | | |
228 | 4.03k | iusace_lsp_to_lp_conversion(lsp_new, p_lpc); |
229 | 4.03k | } |
230 | | |
231 | | VOID iusace_core_lpd_encode(ia_usac_data_struct *usac_data, FLOAT32 *speech, WORD32 *mode, |
232 | 169k | WORD32 *num_tcx_param, WORD32 ch_idx) { |
233 | 169k | WORD32 first_lpd_flag = (usac_data->core_mode_prev[ch_idx] == CORE_MODE_FD); |
234 | 169k | iusace_scratch_mem *pstr_scratch = &usac_data->str_scratch; |
235 | 169k | WORD32 pit_adj = usac_data->td_encoder[ch_idx]->fscale; |
236 | 169k | WORD32 *num_fac_bits = &usac_data->num_td_fac_bits[ch_idx]; |
237 | 169k | WORD16 *serial_fac_out = usac_data->fac_out_stream[ch_idx]; |
238 | 169k | WORD32 *lpc_params = usac_data->param_buf + (NUM_FRAMES * MAX_NUM_TCX_PRM_PER_DIV); |
239 | 169k | ia_usac_td_encoder_struct *st = usac_data->td_encoder[ch_idx]; |
240 | 169k | WORD32 *acelp_tcx_params = usac_data->param_buf; |
241 | 169k | WORD16 *codec_mode = &st->acelp_core_mode; |
242 | 169k | const FLOAT32 *lp_analysis_window = st->lp_analysis_window; |
243 | 169k | FLOAT32 *lp_filter_coeff = pstr_scratch->p_lp_filter_coeff; |
244 | 169k | FLOAT32 *lp_filter_coeff_q = pstr_scratch->p_lp_filter_coeff_q; |
245 | | |
246 | 169k | FLOAT32 *ptr_stack_mem = (FLOAT32 *)pstr_scratch->ptr_stack_mem; |
247 | | |
248 | 169k | FLOAT32 *auto_corr_vector = ptr_stack_mem; |
249 | 169k | ptr_stack_mem += (ORDER + 1); |
250 | 169k | memset(auto_corr_vector, 0, sizeof(*auto_corr_vector) * (ORDER + 1)); |
251 | | |
252 | 169k | FLOAT32 *isp_new = ptr_stack_mem; |
253 | 169k | ptr_stack_mem += ORDER; |
254 | 169k | memset(isp_new, 0, sizeof(*isp_new) * (ORDER)); |
255 | | |
256 | 169k | FLOAT32 *isp_curr = ptr_stack_mem; |
257 | 169k | ptr_stack_mem += ((NUM_FRAMES + 1) * ORDER); |
258 | 169k | memset(isp_curr, 0, sizeof(*isp_curr) * ((NUM_FRAMES + 1) * ORDER)); |
259 | | |
260 | 169k | FLOAT32 *isp_curr_q = ptr_stack_mem; |
261 | 169k | ptr_stack_mem += ((NUM_FRAMES + 1) * ORDER); |
262 | 169k | memset(isp_curr_q, 0, sizeof(*isp_curr_q) * ((NUM_FRAMES + 1) * ORDER)); |
263 | | |
264 | 169k | FLOAT32 *isf_curr = ptr_stack_mem; |
265 | 169k | ptr_stack_mem += ((NUM_FRAMES + 1) * ORDER); |
266 | 169k | memset(isf_curr, 0, sizeof(*isf_curr) * ((NUM_FRAMES + 1) * ORDER)); |
267 | | |
268 | 169k | FLOAT32 *isf_curr_q = ptr_stack_mem; |
269 | 169k | ptr_stack_mem += ((NUM_FRAMES + 1) * ORDER); |
270 | 169k | memset(isf_curr_q, 0, sizeof(*isf_curr_q) * ((NUM_FRAMES + 1) * ORDER)); |
271 | | |
272 | 169k | FLOAT32 *auto_corr_lp_filter_coeff = ptr_stack_mem; |
273 | 169k | ptr_stack_mem += (ORDER + 1); |
274 | 169k | memset(auto_corr_lp_filter_coeff, 0, sizeof(*auto_corr_lp_filter_coeff) * (ORDER + 1)); |
275 | | |
276 | 169k | WORD32 num_indices = 0, num_bits = 0; |
277 | 169k | WORD32 *prm_tcx = pstr_scratch->p_prm_tcx; |
278 | 169k | FLOAT32 *p_wsp_prev_buf; |
279 | 169k | FLOAT32 *wsp_prev_buf = pstr_scratch->p_wsp_prev_buf; |
280 | 169k | memset(lp_filter_coeff, 0, ((NUM_SUBFR_SUPERFRAME + 1) * (ORDER + 1)) * sizeof(FLOAT32)); |
281 | 169k | memset(lp_filter_coeff_q, 0, ((NUM_SUBFR_SUPERFRAME + 1) * (ORDER + 1)) * sizeof(FLOAT32)); |
282 | 169k | memset(wsp_prev_buf, 0, ((MAX_PITCH1 / OPL_DECIM) + LEN_FRAME) * sizeof(FLOAT32)); |
283 | 169k | WORD32 i, j, k, i1, i2; |
284 | 169k | WORD32 *p_params; |
285 | 169k | FLOAT32 energy = 0, max_corr = 0, t0 = 0, *p, *p1; |
286 | 169k | WORD32 ol_pitch_lag[2 * NUM_FRAMES] = {0}; |
287 | 169k | FLOAT32 norm_corr[2 * NUM_FRAMES] = {0}; |
288 | 169k | WORD32 num_params, pitch_min, pitch_max; |
289 | | |
290 | 169k | ia_usac_lpd_state_struct *lpd_state[6], *lpd_state_temp; |
291 | 169k | lpd_state_temp = (ia_usac_lpd_state_struct *)ptr_stack_mem; |
292 | 169k | ptr_stack_mem += |
293 | 169k | (sizeof(ia_usac_lpd_state_struct) + sizeof(*ptr_stack_mem)) / (sizeof(*ptr_stack_mem)); |
294 | 169k | memset(lpd_state_temp, 0, sizeof(*lpd_state_temp)); |
295 | 1.18M | for (j = 0; j < 6; j++) { |
296 | 1.01M | lpd_state[j] = (ia_usac_lpd_state_struct *)ptr_stack_mem; |
297 | 1.01M | ptr_stack_mem += |
298 | 1.01M | (sizeof(ia_usac_lpd_state_struct) + sizeof(*ptr_stack_mem)) / (sizeof(*ptr_stack_mem)); |
299 | 1.01M | memset(lpd_state[j], 0, sizeof(*lpd_state[0])); |
300 | 1.01M | } |
301 | | |
302 | 169k | WORD32 num_bits_acelp = 0, num_bits_tcx = 0; |
303 | 169k | WORD32 range_pitch_search = 0; |
304 | 169k | WORD32 len_subfrm = 0; |
305 | 169k | WORD32 num_subfrm = 0; |
306 | 169k | WORD32 num_sbfrm_per_supfrm = 0; |
307 | 169k | WORD32 window_len = 0; |
308 | 169k | WORD32 len = (MAX_PITCH / OPL_DECIM); |
309 | 169k | FLOAT32 mem_wsyn; |
310 | 169k | FLOAT32 ssnr_256 = 0.0f, ssnr_512 = 0.0f, ssnr_1024 = 0.0f; |
311 | 169k | FLOAT32 tmp_ssnr = 0.0f; |
312 | | |
313 | 169k | len_subfrm = st->len_subfrm; |
314 | 169k | num_subfrm = st->num_subfrm; |
315 | 169k | num_sbfrm_per_supfrm = NUM_FRAMES * num_subfrm; |
316 | | |
317 | 169k | if (pit_adj <= FSCALE_DENOM) { |
318 | 52.8k | window_len = (LEN_LP_WINDOW * len_subfrm) / LEN_FRAME; |
319 | 116k | } else { |
320 | 116k | window_len = (LEN_LP_WINDOW_HIGH_RATE * len_subfrm) / LEN_FRAME; |
321 | 116k | } |
322 | | |
323 | 169k | memcpy(pstr_scratch->p_wsig_buf, st->weighted_sig, 128 * sizeof(FLOAT32)); |
324 | | |
325 | 169k | num_bits_acelp = (iusace_acelp_core_numbits_1024[*codec_mode] - NBITS_MODE) >> 2; |
326 | | |
327 | 169k | num_bits_tcx = (WORD32)(0.85f * num_bits_acelp - NBITS_LPC); |
328 | | |
329 | 169k | if (pit_adj == 0) { |
330 | 0 | pitch_min = TMIN; |
331 | 0 | pitch_max = TMAX; |
332 | 169k | } else { |
333 | 169k | i = (((pit_adj * TMIN) + (FSCALE_DENOM / 2)) / FSCALE_DENOM) - TMIN; |
334 | 169k | pitch_min = TMIN + i; |
335 | 169k | pitch_max = TMAX + (6 * i); |
336 | 169k | } |
337 | | |
338 | 169k | p_wsp_prev_buf = wsp_prev_buf + MAX_PITCH1 / OPL_DECIM; |
339 | 169k | memcpy(wsp_prev_buf, st->prev_wsp, (WORD32)((MAX_PITCH / OPL_DECIM) * sizeof(FLOAT32))); |
340 | | |
341 | 169k | if (first_lpd_flag) { |
342 | 4.03k | memcpy(st->isp_old, iusace_ispold_init, ORDER * sizeof(FLOAT32)); |
343 | | |
344 | 4.03k | iusace_autocorr_plus(&speech[-(window_len / 2)], auto_corr_vector, window_len, |
345 | 4.03k | (FLOAT32 *)lp_analysis_window, pstr_scratch->p_buf_aut_corr); |
346 | | |
347 | 72.5k | for (j = 0; j <= ORDER; j++) { |
348 | 68.5k | auto_corr_vector[j] *= (FLOAT32)iusace_lag_window[j]; |
349 | 68.5k | } |
350 | | |
351 | 4.03k | iusace_levinson_durbin_algo(auto_corr_vector, auto_corr_lp_filter_coeff); |
352 | 4.03k | iusace_lpc_2_lsp_conversion(auto_corr_lp_filter_coeff, isp_new, st->isp_old); |
353 | 4.03k | memcpy(st->isp_old, isp_new, ORDER * sizeof(FLOAT32)); |
354 | 4.03k | iusace_lsp_2_lsf_conversion(isp_new, isf_curr); |
355 | 4.03k | memcpy(st->isf_old, isf_curr, ORDER * sizeof(FLOAT32)); |
356 | 4.03k | } |
357 | | |
358 | 169k | memcpy(isp_curr, st->isp_old, ORDER * sizeof(FLOAT32)); |
359 | | |
360 | 845k | for (i = 0; i < NUM_FRAMES; i++) { |
361 | 676k | iusace_autocorr_plus(&speech[((i + 1) * len_subfrm) - (window_len / 2)], auto_corr_vector, |
362 | 676k | window_len, (FLOAT32 *)lp_analysis_window, pstr_scratch->p_buf_aut_corr); |
363 | | |
364 | 12.1M | for (j = 0; j <= ORDER; j++) { |
365 | 11.4M | auto_corr_vector[j] *= (FLOAT32)iusace_lag_window[j]; |
366 | 11.4M | } |
367 | | |
368 | 676k | iusace_levinson_durbin_algo(auto_corr_vector, auto_corr_lp_filter_coeff); |
369 | 676k | iusace_lpc_2_lsp_conversion(auto_corr_lp_filter_coeff, isp_new, st->isp_old); |
370 | 676k | memcpy(&isp_curr[(i + 1) * ORDER], isp_new, ORDER * sizeof(FLOAT32)); |
371 | 676k | iusace_interpolation_lsp_params(st->isp_old, isp_new, |
372 | 676k | &lp_filter_coeff[i * num_subfrm * (ORDER + 1)], num_subfrm); |
373 | 676k | iusace_lsp_2_lsf_conversion(&isp_curr[(i + 1) * ORDER], &isf_curr[(i + 1) * ORDER]); |
374 | 676k | memcpy(st->isp_old, isp_new, ORDER * sizeof(FLOAT32)); |
375 | 676k | } |
376 | | |
377 | 169k | memcpy(isf_curr, st->isf_old, ORDER * sizeof(FLOAT32)); |
378 | 169k | memcpy(st->isf_old, &isf_curr[NUM_FRAMES * ORDER], ORDER * sizeof(FLOAT32)); |
379 | | |
380 | 169k | if (!first_lpd_flag) { |
381 | 165k | iusace_lsp_2_lsf_conversion(st->isp_old_q, isf_curr_q); |
382 | 165k | } |
383 | | |
384 | 169k | iusace_quantize_lpc_avq(&isf_curr[ORDER], &isf_curr_q[ORDER], first_lpd_flag, &lpc_params[0], |
385 | 169k | &num_indices, &num_bits); |
386 | | |
387 | 845k | for (i = 0; i < NUM_FRAMES; i++) { |
388 | 676k | iusace_lsf_2_lsp_conversion(&isf_curr_q[(i + 1) * ORDER], &isp_curr_q[(i + 1) * ORDER]); |
389 | 676k | } |
390 | | |
391 | 169k | if (first_lpd_flag) { |
392 | 4.03k | iusace_lsf_2_lsp_conversion(isf_curr_q, isp_curr_q); |
393 | 4.03k | memcpy(st->isp_old_q, isp_curr_q, ORDER * sizeof(FLOAT32)); |
394 | 4.03k | } |
395 | | |
396 | 169k | *num_fac_bits = 0; |
397 | 169k | if (first_lpd_flag) { |
398 | 4.03k | FLOAT32 *temp_speech = pstr_scratch->p_buf_speech; |
399 | 4.03k | FLOAT32 *temp_res = pstr_scratch->p_buf_res; |
400 | 4.03k | FLOAT32 lpc[9 * (ORDER + 1)]; |
401 | 4.03k | FLOAT32 hp_mem[4]; |
402 | 4.03k | FLOAT32 premph_mem = 0.0f; |
403 | 4.03k | WORD32 fac_length; |
404 | 4.03k | WORD32 num_bits_fac = (WORD32)((FLOAT32)num_bits_tcx / 2.f); |
405 | 4.03k | FLOAT32 *temp_signal = pstr_scratch->p_buf_signal; |
406 | | |
407 | 4.03k | if (st->last_was_short) { |
408 | 0 | fac_length = (st->len_frame) / 16; |
409 | 4.03k | } else { |
410 | 4.03k | fac_length = len_subfrm / 2; |
411 | 4.03k | } |
412 | | |
413 | 4.03k | iusace_get_interpolated_lpc(st->isp_old_q, st->isp_old_q, lpc, (2 * len_subfrm) / LEN_SUBFR); |
414 | | |
415 | 4.03k | memset(temp_speech, 0, (ORDER + 2 * len_subfrm) * sizeof(FLOAT32)); |
416 | 4.03k | memset(temp_res, 0, (2 * len_subfrm) * sizeof(FLOAT32)); |
417 | | |
418 | 4.03k | iusace_fac_apply(&st->fd_orig[1 + ORDER], len_subfrm, fac_length, st->low_pass_line, |
419 | 4.03k | num_bits_fac, &st->fd_synth[1 + ORDER], lpc, serial_fac_out, num_fac_bits, |
420 | 4.03k | pstr_scratch); |
421 | 4.03k | memset(hp_mem, 0, 4 * sizeof(FLOAT32)); |
422 | 4.03k | iusace_highpass_50hz_12k8(st->fd_orig, 2 * len_subfrm + 1 + ORDER, hp_mem, pit_adj); |
423 | 4.03k | premph_mem = 0.0f; |
424 | 4.03k | iusace_apply_preemph(st->fd_orig, PREEMPH_FILT_FAC, 2 * len_subfrm + 1 + ORDER, &premph_mem); |
425 | | |
426 | 4.03k | memcpy(temp_signal, st->fd_orig + len_subfrm + 1, (len_subfrm + ORDER) * sizeof(FLOAT32)); |
427 | 4.03k | premph_mem = temp_signal[0]; |
428 | 4.03k | iusace_apply_deemph(temp_signal, PREEMPH_FILT_FAC, len_subfrm + ORDER, &premph_mem); |
429 | 4.03k | memcpy(st->lpd_state.tcx_mem, &temp_signal[len_subfrm + ORDER - 128], 128 * sizeof(FLOAT32)); |
430 | | |
431 | 4.03k | premph_mem = 0.0f; |
432 | 4.03k | iusace_apply_preemph(st->fd_synth, PREEMPH_FILT_FAC, 2 * len_subfrm + 1 + ORDER, &premph_mem); |
433 | 4.03k | memcpy(st->lpd_state.synth, st->fd_synth + 2 * len_subfrm - ORDER - 128 + 1 + ORDER, |
434 | 4.03k | (ORDER + 128) * sizeof(FLOAT32)); |
435 | 4.03k | memcpy(temp_speech + ORDER, st->fd_synth + 1 + ORDER, 2 * len_subfrm * sizeof(FLOAT32)); |
436 | | |
437 | 4.03k | premph_mem = 0.0f; |
438 | 4.03k | iusace_find_weighted_speech(lpc, temp_speech + ORDER, temp_res, &premph_mem, 2 * len_subfrm); |
439 | 4.03k | st->prev_wsyn_mem = premph_mem; |
440 | 4.03k | memcpy(st->lpd_state.wsynth, temp_res + 2 * len_subfrm - ORDER - 128, |
441 | 4.03k | (ORDER + 128) * sizeof(FLOAT32)); |
442 | 4.03k | memcpy(temp_speech + ORDER, st->fd_synth + 1 + ORDER, 2 * len_subfrm * sizeof(FLOAT32)); |
443 | 4.03k | memset(temp_res, 0, 2 * len_subfrm * sizeof(FLOAT32)); |
444 | 34.4k | for (i = 0; i < 2 * len_subfrm; i += LEN_SUBFR) { |
445 | 30.4k | iusace_compute_lp_residual(lpc, &temp_speech[ORDER + i], &temp_res[i], LEN_SUBFR); |
446 | 30.4k | } |
447 | 4.03k | memcpy(st->lpd_state.acelp_exc, temp_res, 2 * len_subfrm * sizeof(FLOAT32)); |
448 | 4.03k | premph_mem = 0.0f; |
449 | 4.03k | iusace_find_weighted_speech(lp_filter_coeff, st->fd_orig + 1 + ORDER, temp_speech + ORDER, |
450 | 4.03k | &(st->mem_wsp), 2 * len_subfrm); |
451 | 4.03k | memcpy(st->weighted_sig, temp_speech + ORDER + 2 * len_subfrm - 128, 128 * sizeof(FLOAT32)); |
452 | 4.03k | memcpy(pstr_scratch->p_wsig_buf, st->weighted_sig, 128 * sizeof(FLOAT32)); |
453 | 12.0k | for (i = 0; i < 2 * len_subfrm; i += len_subfrm) { |
454 | 8.06k | iusace_decim2_fir_filter(&temp_speech[i + ORDER], len_subfrm, st->mem_lp_decim2, |
455 | 8.06k | pstr_scratch->p_fir_sig_buf); |
456 | 8.06k | memcpy(temp_speech + ORDER + i / OPL_DECIM, temp_speech + ORDER + i, |
457 | 8.06k | (len_subfrm / OPL_DECIM) * sizeof(FLOAT32)); |
458 | 8.06k | } |
459 | 4.03k | memcpy(wsp_prev_buf, temp_speech + ORDER + 2 * len_subfrm / OPL_DECIM - MAX_PITCH / OPL_DECIM, |
460 | 4.03k | (WORD32)((MAX_PITCH / OPL_DECIM) * sizeof(FLOAT32))); |
461 | 4.03k | iusace_highpass_prev_wsp(st, temp_speech, pitch_max); |
462 | 4.03k | } |
463 | 169k | memcpy(isp_curr_q, st->isp_old_q, ORDER * sizeof(FLOAT32)); |
464 | 169k | memcpy(st->isp_old_q, &isp_curr_q[NUM_FRAMES * ORDER], ORDER * sizeof(FLOAT32)); |
465 | | |
466 | 845k | for (i = 0; i < NUM_FRAMES; i++) { |
467 | 676k | iusace_find_weighted_speech( |
468 | 676k | &lp_filter_coeff[i * (num_sbfrm_per_supfrm / NUM_FRAMES) * (ORDER + 1)], |
469 | 676k | &speech[i * len_subfrm], &pstr_scratch->p_wsig_buf[i * len_subfrm], &(st->mem_wsp), |
470 | 676k | len_subfrm); |
471 | 676k | memcpy(p_wsp_prev_buf, &pstr_scratch->p_wsig_buf[i * len_subfrm], |
472 | 676k | len_subfrm * sizeof(FLOAT32)); |
473 | | |
474 | 676k | iusace_decim2_fir_filter(p_wsp_prev_buf, len_subfrm, st->mem_lp_decim2, |
475 | 676k | pstr_scratch->p_fir_sig_buf); |
476 | 676k | range_pitch_search = 2 * LEN_SUBFR; |
477 | 676k | if (num_subfrm < 4) { |
478 | 248k | range_pitch_search = 3 * LEN_SUBFR; |
479 | 248k | } |
480 | | |
481 | 676k | iusace_open_loop_search(p_wsp_prev_buf, (pitch_min / OPL_DECIM) + 1, pitch_max / OPL_DECIM, |
482 | 676k | range_pitch_search / OPL_DECIM, &ol_pitch_lag[i * 2], st); |
483 | | |
484 | 676k | if (st->ol_gain > 0.6) { |
485 | 124k | st->prev_pitch_med = iusace_get_ol_lag_median(ol_pitch_lag[i * 2], st->prev_ol_lags); |
486 | 124k | st->ada_w = 1.0; |
487 | 551k | } else { |
488 | 551k | st->ada_w = st->ada_w * 0.9f; |
489 | 551k | } |
490 | 676k | if (st->ada_w < 0.8) { |
491 | 461k | st->ol_wght_flg = 0; |
492 | 461k | } else { |
493 | 215k | st->ol_wght_flg = 1; |
494 | 215k | } |
495 | | |
496 | 676k | max_corr = 0.0f; |
497 | 676k | p = &p_wsp_prev_buf[0]; |
498 | 676k | p1 = p_wsp_prev_buf - ol_pitch_lag[i * 2]; |
499 | 51.9M | for (j = 0; j < range_pitch_search / OPL_DECIM; j++) { |
500 | 51.2M | max_corr += *p++ * *p1++; |
501 | 51.2M | } |
502 | | |
503 | 676k | t0 = 0.01f; |
504 | 676k | p = p_wsp_prev_buf - ol_pitch_lag[i * 2]; |
505 | 51.9M | for (j = 0; j < range_pitch_search / OPL_DECIM; j++, p++) { |
506 | 51.2M | t0 += *p * *p; |
507 | 51.2M | } |
508 | 676k | t0 = (FLOAT32)(1.0 / sqrt(t0)); |
509 | 676k | norm_corr[i * 2] = max_corr * t0; |
510 | | |
511 | 676k | energy = 0.01f; |
512 | 51.9M | for (j = 0; j < range_pitch_search / OPL_DECIM; j++) { |
513 | 51.2M | energy += p_wsp_prev_buf[j] * p_wsp_prev_buf[j]; |
514 | 51.2M | } |
515 | 676k | energy = (FLOAT32)(1.0 / sqrt(energy)); |
516 | 676k | norm_corr[i * 2] *= energy; |
517 | | |
518 | 676k | if (num_subfrm < 4) { |
519 | 248k | ol_pitch_lag[(i * 2) + 1] = ol_pitch_lag[i * 2]; |
520 | 248k | norm_corr[(i * 2) + 1] = norm_corr[i * 2]; |
521 | 427k | } else { |
522 | 427k | iusace_open_loop_search(p_wsp_prev_buf + ((2 * LEN_SUBFR) / OPL_DECIM), |
523 | 427k | (pitch_min / OPL_DECIM) + 1, pitch_max / OPL_DECIM, |
524 | 427k | (2 * LEN_SUBFR) / OPL_DECIM, &ol_pitch_lag[(i * 2) + 1], st); |
525 | | |
526 | 427k | if (st->ol_gain > 0.6) { |
527 | 80.8k | st->prev_pitch_med = |
528 | 80.8k | iusace_get_ol_lag_median(ol_pitch_lag[(i * 2) + 1], st->prev_ol_lags); |
529 | 80.8k | st->ada_w = 1.0; |
530 | 346k | } else { |
531 | 346k | st->ada_w = st->ada_w * 0.9f; |
532 | 346k | } |
533 | 427k | if (st->ada_w < 0.8) { |
534 | 290k | st->ol_wght_flg = 0; |
535 | 290k | } else { |
536 | 137k | st->ol_wght_flg = 1; |
537 | 137k | } |
538 | 427k | max_corr = 0.0f; |
539 | 427k | p = p_wsp_prev_buf + (2 * LEN_SUBFR) / OPL_DECIM; |
540 | 427k | p1 = p_wsp_prev_buf + ((2 * LEN_SUBFR) / OPL_DECIM) - ol_pitch_lag[(i * 2) + 1]; |
541 | 27.7M | for (j = 0; j < (2 * LEN_SUBFR) / OPL_DECIM; j++) { |
542 | 27.3M | max_corr += *p++ * *p1++; |
543 | 27.3M | } |
544 | | |
545 | 427k | t0 = 0.01f; |
546 | 427k | p = p_wsp_prev_buf + ((2 * LEN_SUBFR) / OPL_DECIM) - ol_pitch_lag[(i * 2) + 1]; |
547 | 27.7M | for (j = 0; j < (2 * LEN_SUBFR) / OPL_DECIM; j++, p++) { |
548 | 27.3M | t0 += *p * *p; |
549 | 27.3M | } |
550 | 427k | t0 = (FLOAT32)(1.0 / sqrt(t0)); |
551 | 427k | norm_corr[(i * 2) + 1] = max_corr * t0; |
552 | | |
553 | 427k | energy = 0.01f; |
554 | 27.7M | for (j = 0; j < (2 * LEN_SUBFR) / OPL_DECIM; j++) { |
555 | 27.3M | energy += p_wsp_prev_buf[((2 * LEN_SUBFR) / OPL_DECIM) + j] * |
556 | 27.3M | p_wsp_prev_buf[((2 * LEN_SUBFR) / OPL_DECIM) + j]; |
557 | 27.3M | } |
558 | 427k | energy = (FLOAT32)(1.0 / sqrt(energy)); |
559 | 427k | norm_corr[(i * 2) + 1] *= energy; |
560 | 427k | } |
561 | | |
562 | 676k | memmove(wsp_prev_buf, &wsp_prev_buf[len_subfrm / OPL_DECIM], |
563 | 676k | (WORD32)((MAX_PITCH / OPL_DECIM) * sizeof(FLOAT32))); |
564 | 676k | } |
565 | | |
566 | 169k | memcpy(lpd_state[0], &st->lpd_state, sizeof(*lpd_state[0])); |
567 | | |
568 | 169k | ssnr_1024 = 0; |
569 | 169k | if (usac_data->use_acelp_only) { |
570 | 42.3k | for (i1 = 0; i1 < 2; i1++) { |
571 | 84.6k | for (i2 = 0; i2 < 2; i2++) { |
572 | 56.4k | k = (i1 * 2) + i2; |
573 | 56.4k | p_params = acelp_tcx_params + (k * MAX_NUM_TCX_PRM_PER_DIV); |
574 | | |
575 | 56.4k | iusace_interpolation_lsp_params(&isp_curr_q[k * ORDER], &isp_curr_q[(k + 1) * ORDER], |
576 | 56.4k | lp_filter_coeff_q, st->num_subfrm); |
577 | | |
578 | 56.4k | memcpy(lpd_state[k + 1], lpd_state[k], sizeof(*lpd_state[0])); |
579 | | |
580 | 56.4k | iusace_acelp_encode( |
581 | 56.4k | &lp_filter_coeff[k * (num_sbfrm_per_supfrm / 4) * (ORDER + 1)], lp_filter_coeff_q, |
582 | 56.4k | &speech[k * st->len_subfrm], &pstr_scratch->p_wsig_buf[k * st->len_subfrm], |
583 | 56.4k | &pstr_scratch->p_synth_buf[k * st->len_subfrm], |
584 | 56.4k | &pstr_scratch->p_wsyn_buf[k * st->len_subfrm], *codec_mode, lpd_state[k + 1], |
585 | 56.4k | st->len_subfrm, norm_corr[k * 2], norm_corr[(k * 2) + 1], ol_pitch_lag[k * 2], |
586 | 56.4k | ol_pitch_lag[(k * 2) + 1], pit_adj, p_params, pstr_scratch); |
587 | | |
588 | 56.4k | mem_wsyn = lpd_state[k]->mem_wsyn; |
589 | | |
590 | 56.4k | iusace_find_weighted_speech(&lp_filter_coeff[k * (num_sbfrm_per_supfrm / 4) * |
591 | 56.4k | (ORDER + 1)], &pstr_scratch->p_synth_buf[k * LEN_FRAME], |
592 | 56.4k | pstr_scratch->p_temp_wsyn_buf, &mem_wsyn, LEN_FRAME); |
593 | | |
594 | 56.4k | lpd_state[k + 1]->mem_wsyn = mem_wsyn; |
595 | 56.4k | mode[k] = 0; |
596 | 56.4k | num_tcx_param[k] = 0; |
597 | 56.4k | } |
598 | 28.2k | } |
599 | 14.1k | memcpy(&st->lpd_state, lpd_state[4], sizeof(*lpd_state[4])); |
600 | 14.1k | memcpy(st->weighted_sig, pstr_scratch->p_wsig_buf + (st->len_frame), 128 * sizeof(FLOAT32)); |
601 | 14.1k | memcpy(st->prev_wsp, wsp_prev_buf, (len * sizeof(FLOAT32))); |
602 | 14.1k | return; |
603 | 14.1k | } |
604 | 465k | for (i1 = 0; i1 < 2; i1++) { |
605 | 310k | ssnr_512 = 0; |
606 | 930k | for (i2 = 0; i2 < 2; i2++) { |
607 | 620k | k = (i1 * 2) + i2; |
608 | 620k | p_params = acelp_tcx_params + (k * MAX_NUM_TCX_PRM_PER_DIV); |
609 | | |
610 | 620k | iusace_interpolation_lsp_params(&isp_curr_q[k * ORDER], &isp_curr_q[(k + 1) * ORDER], |
611 | 620k | lp_filter_coeff_q, st->num_subfrm); |
612 | | |
613 | 620k | memcpy(lpd_state[k + 1], lpd_state[k], sizeof(*lpd_state[0])); |
614 | | |
615 | 620k | iusace_acelp_encode( |
616 | 620k | &lp_filter_coeff[k * (num_sbfrm_per_supfrm / 4) * (ORDER + 1)], lp_filter_coeff_q, |
617 | 620k | &speech[k * st->len_subfrm], &pstr_scratch->p_wsig_buf[k * st->len_subfrm], |
618 | 620k | &pstr_scratch->p_synth_buf[k * st->len_subfrm], |
619 | 620k | &pstr_scratch->p_wsyn_buf[k * st->len_subfrm], *codec_mode, lpd_state[k + 1], |
620 | 620k | st->len_subfrm, norm_corr[k * 2], norm_corr[(k * 2) + 1], ol_pitch_lag[k * 2], |
621 | 620k | ol_pitch_lag[(k * 2) + 1], pit_adj, p_params, pstr_scratch); |
622 | | |
623 | 620k | mem_wsyn = lpd_state[k]->mem_wsyn; |
624 | | |
625 | 620k | iusace_find_weighted_speech(&lp_filter_coeff[k * (num_sbfrm_per_supfrm / 4) * (ORDER + 1)], |
626 | 620k | &pstr_scratch->p_synth_buf[k * LEN_FRAME], |
627 | 620k | pstr_scratch->p_temp_wsyn_buf, &mem_wsyn, LEN_FRAME); |
628 | | |
629 | 620k | lpd_state[k + 1]->mem_wsyn = mem_wsyn; |
630 | | |
631 | 620k | ssnr_256 = iusace_cal_segsnr(&pstr_scratch->p_wsig_buf[k * LEN_FRAME], |
632 | 620k | pstr_scratch->p_temp_wsyn_buf, LEN_FRAME, LEN_SUBFR); |
633 | | |
634 | 620k | mode[k] = 0; |
635 | 620k | num_tcx_param[k] = 0; |
636 | | |
637 | 620k | iusace_lpc_coef_gen(&isp_curr_q[k * ORDER], &isp_curr_q[(k + 1) * ORDER], lp_filter_coeff_q, |
638 | 620k | st->num_subfrm, ORDER); |
639 | | |
640 | 620k | memcpy(lpd_state_temp, lpd_state[k], sizeof(*lpd_state[0])); |
641 | | |
642 | 620k | iusace_tcx_fac_encode(usac_data, |
643 | 620k | &lp_filter_coeff[k * (num_sbfrm_per_supfrm / 4) * (ORDER + 1)], |
644 | 620k | lp_filter_coeff_q, &speech[k * st->len_subfrm], st->len_subfrm, |
645 | 620k | num_bits_tcx, lpd_state_temp, prm_tcx, &num_params, ch_idx, k); |
646 | | |
647 | 620k | mem_wsyn = lpd_state[k]->mem_wsyn; |
648 | | |
649 | 620k | iusace_find_weighted_speech(&lp_filter_coeff[k * (num_sbfrm_per_supfrm / 4) * (ORDER + 1)], |
650 | 620k | pstr_scratch->p_synth_tcx_buf, pstr_scratch->p_temp_wsyn_buf, |
651 | 620k | &mem_wsyn, LEN_FRAME); |
652 | | |
653 | 620k | lpd_state_temp->mem_wsyn = mem_wsyn; |
654 | | |
655 | 620k | tmp_ssnr = iusace_cal_segsnr(&pstr_scratch->p_wsig_buf[k * LEN_FRAME], |
656 | 620k | pstr_scratch->p_temp_wsyn_buf, LEN_FRAME, LEN_SUBFR); |
657 | | |
658 | 620k | if (tmp_ssnr > ssnr_256) { |
659 | 364k | ssnr_256 = tmp_ssnr; |
660 | 364k | mode[k] = 1; |
661 | 364k | num_tcx_param[k] = num_params; |
662 | 364k | memcpy(lpd_state[k + 1], lpd_state_temp, sizeof(*lpd_state[0])); |
663 | | |
664 | 364k | memcpy(&pstr_scratch->p_synth_buf[(k * st->len_subfrm) - 128], |
665 | 364k | pstr_scratch->p_synth_tcx_buf - 128, (st->len_subfrm + 128) * sizeof(FLOAT32)); |
666 | | |
667 | 364k | memcpy(&pstr_scratch->p_wsyn_buf[(k * st->len_subfrm) - 128], |
668 | 364k | pstr_scratch->p_wsyn_tcx_buf - 128, (st->len_subfrm + 128) * sizeof(FLOAT32)); |
669 | | |
670 | 364k | memcpy(p_params, prm_tcx, NUM_TCX20_PRM * sizeof(WORD32)); |
671 | 364k | } |
672 | 620k | ssnr_512 += 0.50f * ssnr_256; |
673 | 620k | } |
674 | | |
675 | 310k | k = i1 * 2; |
676 | | |
677 | 310k | p_params = acelp_tcx_params + (k * MAX_NUM_TCX_PRM_PER_DIV); |
678 | | |
679 | 310k | iusace_lpc_coef_gen(&isp_curr_q[2 * i1 * ORDER], &isp_curr_q[(2 * i1 + 2) * ORDER], |
680 | 310k | lp_filter_coeff_q, (num_sbfrm_per_supfrm / 2), ORDER); |
681 | | |
682 | 310k | memcpy(lpd_state_temp, lpd_state[2 * i1], sizeof(*lpd_state[0])); |
683 | 310k | iusace_tcx_fac_encode(usac_data, |
684 | 310k | &lp_filter_coeff[2 * i1 * (num_sbfrm_per_supfrm / 4) * (ORDER + 1)], |
685 | 310k | lp_filter_coeff_q, &speech[2 * i1 * st->len_subfrm], 2 * st->len_subfrm, |
686 | 310k | 2 * num_bits_tcx, lpd_state_temp, prm_tcx, &num_params, ch_idx, 2 * i1); |
687 | | |
688 | 310k | mem_wsyn = lpd_state[2 * i1]->mem_wsyn; |
689 | | |
690 | 310k | iusace_find_weighted_speech( |
691 | 310k | &lp_filter_coeff[2 * i1 * (num_sbfrm_per_supfrm / 4) * (ORDER + 1)], |
692 | 310k | pstr_scratch->p_synth_tcx_buf, pstr_scratch->p_temp_wsyn_buf, &mem_wsyn, LEN_FRAME * 2); |
693 | | |
694 | 310k | lpd_state_temp->mem_wsyn = mem_wsyn; |
695 | | |
696 | 310k | tmp_ssnr = iusace_cal_segsnr(&pstr_scratch->p_wsig_buf[2 * i1 * LEN_FRAME], |
697 | 310k | pstr_scratch->p_temp_wsyn_buf, LEN_FRAME * 2, LEN_SUBFR); |
698 | | |
699 | 310k | if (tmp_ssnr > ssnr_512) { |
700 | 113k | ssnr_512 = tmp_ssnr; |
701 | 339k | for (i = 0; i < 2; i++) { |
702 | 226k | mode[k + i] = 2; |
703 | 226k | num_tcx_param[k + i] = num_params; |
704 | 226k | } |
705 | 113k | memcpy(lpd_state[k + 2], lpd_state_temp, sizeof(*lpd_state[0])); |
706 | | |
707 | 113k | memcpy(&pstr_scratch->p_synth_buf[(2 * i1 * st->len_subfrm) - 128], |
708 | 113k | pstr_scratch->p_synth_tcx_buf - 128, ((2 * st->len_subfrm) + 128) * sizeof(FLOAT32)); |
709 | 113k | memcpy(&pstr_scratch->p_wsyn_buf[(2 * i1 * st->len_subfrm) - 128], |
710 | 113k | pstr_scratch->p_wsyn_tcx_buf - 128, ((2 * st->len_subfrm) + 128) * sizeof(FLOAT32)); |
711 | 113k | memcpy(p_params, prm_tcx, NUM_TCX40_PRM * sizeof(WORD32)); |
712 | 113k | } |
713 | 310k | ssnr_1024 += 0.50f * ssnr_512; |
714 | 310k | } |
715 | | |
716 | 155k | k = 0; |
717 | | |
718 | 155k | p_params = acelp_tcx_params + (k * MAX_NUM_TCX_PRM_PER_DIV); |
719 | | |
720 | 155k | iusace_lpc_coef_gen(&isp_curr_q[k * ORDER], &isp_curr_q[(k + 4) * ORDER], lp_filter_coeff_q, |
721 | 155k | num_sbfrm_per_supfrm, ORDER); |
722 | | |
723 | 155k | memcpy(lpd_state_temp, lpd_state[k], sizeof(*lpd_state[0])); |
724 | | |
725 | 155k | iusace_tcx_fac_encode(usac_data, &lp_filter_coeff[k * (num_sbfrm_per_supfrm / 4) * (ORDER + 1)], |
726 | 155k | lp_filter_coeff_q, &speech[k * st->len_subfrm], 4 * st->len_subfrm, |
727 | 155k | 4 * num_bits_tcx, lpd_state_temp, prm_tcx, &num_params, ch_idx, k); |
728 | | |
729 | 155k | mem_wsyn = lpd_state[k]->mem_wsyn; |
730 | | |
731 | 155k | iusace_find_weighted_speech(&lp_filter_coeff[k * (num_sbfrm_per_supfrm / 4) * (ORDER + 1)], |
732 | 155k | pstr_scratch->p_synth_tcx_buf, pstr_scratch->p_temp_wsyn_buf, |
733 | 155k | &mem_wsyn, LEN_FRAME * 4); |
734 | | |
735 | 155k | lpd_state_temp->mem_wsyn = mem_wsyn; |
736 | | |
737 | 155k | tmp_ssnr = iusace_cal_segsnr(&pstr_scratch->p_wsig_buf[k * LEN_FRAME], |
738 | 155k | pstr_scratch->p_temp_wsyn_buf, LEN_FRAME * 4, LEN_SUBFR); |
739 | | |
740 | 155k | if (tmp_ssnr > ssnr_1024) { |
741 | 322k | for (i = 0; i < 4; i++) { |
742 | 257k | mode[k + i] = 3; |
743 | 257k | num_tcx_param[k + i] = num_params; |
744 | 257k | } |
745 | 64.4k | memcpy(lpd_state[k + 4], lpd_state_temp, sizeof(*lpd_state[0])); |
746 | | |
747 | 64.4k | memcpy(&pstr_scratch->p_synth_buf[(k * st->len_subfrm) - 128], |
748 | 64.4k | pstr_scratch->p_synth_tcx_buf - 128, ((4 * st->len_subfrm) + 128) * sizeof(FLOAT32)); |
749 | 64.4k | memcpy(&pstr_scratch->p_wsyn_buf[(k * st->len_subfrm) - 128], |
750 | 64.4k | pstr_scratch->p_wsyn_tcx_buf - 128, ((4 * st->len_subfrm) + 128) * sizeof(FLOAT32)); |
751 | 64.4k | memcpy(p_params, prm_tcx, NUM_TCX80_PRM * sizeof(WORD32)); |
752 | 64.4k | } |
753 | 155k | memcpy(&st->lpd_state, lpd_state[4], sizeof(*lpd_state[4])); |
754 | | |
755 | 155k | memcpy(st->weighted_sig, pstr_scratch->p_wsig_buf + (st->len_frame), 128 * sizeof(FLOAT32)); |
756 | 155k | memcpy(st->prev_wsp, wsp_prev_buf, (len * sizeof(FLOAT32))); |
757 | | |
758 | 155k | return; |
759 | 169k | } |
760 | | |
761 | | IA_ERRORCODE iusace_lpd_frm_enc(ia_usac_data_struct *usac_data, WORD32 *mod_out, |
762 | | WORD32 const usac_independency_flg, WORD32 len_frame, WORD32 i_ch, |
763 | 169k | ia_bit_buf_struct *pstr_it_bit_buff) { |
764 | 169k | WORD32 i; |
765 | 169k | WORD32 len_next_high_rate = (LEN_NEXT_HIGH_RATE * len_frame) / LEN_SUPERFRAME; |
766 | 169k | WORD32 len_lpc0 = (LEN_LPC0 * len_frame) / LEN_SUPERFRAME; |
767 | 169k | FLOAT32 *input_data = &usac_data->td_in_buf[i_ch][len_next_high_rate]; |
768 | 169k | ia_usac_td_encoder_struct *td_encoder = usac_data->td_encoder[i_ch]; |
769 | 169k | WORD32 fscale = usac_data->td_encoder[i_ch]->fscale; |
770 | 169k | WORD32 first_lpd_flag = (usac_data->core_mode_prev[i_ch] == CORE_MODE_FD); |
771 | 169k | FLOAT32 *speech_buf = usac_data->speech_buf; |
772 | 169k | FLOAT32 *ptr_scratch_buf = usac_data->str_scratch.p_lpd_frm_enc_scratch; |
773 | 169k | FLOAT32 *speech, *new_speech; |
774 | 169k | WORD32 mode_buf[1 + NUM_FRAMES] = {0}, *mode; |
775 | 169k | WORD32 num_tcx_params[NUM_FRAMES] = {0}; |
776 | 169k | WORD32 len_subfrm; |
777 | | |
778 | 169k | len_subfrm = td_encoder->len_subfrm; |
779 | | |
780 | 169k | if (usac_data->core_mode_prev[i_ch] == CORE_MODE_FD) { |
781 | 4.03k | iusace_reset_td_enc(usac_data->td_encoder[i_ch]); |
782 | | |
783 | 4.03k | FLOAT32 *in_data = usac_data->td_in_prev_buf[i_ch]; |
784 | 4.03k | FLOAT32 *ptr_speech = usac_data->speech_buf; |
785 | 4.03k | WORD32 length = len_next_high_rate + len_lpc0; |
786 | 4.03k | ia_usac_td_encoder_struct *st = usac_data->td_encoder[i_ch]; |
787 | 4.03k | memcpy(ptr_speech, in_data, length * sizeof(FLOAT32)); |
788 | | |
789 | 4.03k | iusace_highpass_50hz_12k8(ptr_speech, length, st->mem_sig_in, st->fscale); |
790 | | |
791 | 4.03k | iusace_apply_preemph(ptr_speech, PREEMPH_FILT_FAC, length, &(st->mem_preemph)); |
792 | 4.03k | memcpy(st->old_speech_pe + ORDER, ptr_speech, length * sizeof(FLOAT32)); |
793 | 4.03k | } |
794 | | |
795 | 169k | if (first_lpd_flag) { |
796 | 4.03k | td_encoder->prev_mode = -1; |
797 | 4.03k | } |
798 | | |
799 | 169k | mode = mode_buf + 1; |
800 | 169k | mode[-1] = td_encoder->prev_mode; |
801 | 169k | fscale = (fscale * len_subfrm) / LEN_FRAME; |
802 | | |
803 | 169k | new_speech = speech_buf + ORDER + (LEN_NEXT_HIGH_RATE * len_subfrm) / LEN_FRAME; |
804 | 169k | speech = speech_buf + ORDER; |
805 | 169k | if (first_lpd_flag) { |
806 | 4.03k | new_speech += (LEN_LPC0 * len_subfrm) / LEN_FRAME; |
807 | 4.03k | speech += (LEN_LPC0 * len_subfrm) / LEN_FRAME; |
808 | 4.03k | } |
809 | 169k | memcpy(new_speech, input_data, td_encoder->len_frame * sizeof(FLOAT32)); |
810 | | |
811 | 169k | iusace_highpass_50hz_12k8(new_speech, td_encoder->len_frame, td_encoder->mem_sig_in, fscale); |
812 | 169k | iusace_apply_preemph(new_speech, PREEMPH_FILT_FAC, td_encoder->len_frame, |
813 | 169k | &(td_encoder->mem_preemph)); |
814 | | |
815 | 169k | if (first_lpd_flag) { |
816 | 4.03k | memcpy(speech_buf, td_encoder->old_speech_pe, |
817 | 4.03k | ((ORDER + (((LEN_NEXT_HIGH_RATE + LEN_LPC0) * len_subfrm) / LEN_FRAME))) * |
818 | 4.03k | sizeof(FLOAT32)); |
819 | 981k | for (i = 0; i < (len_subfrm + 1); i++) { |
820 | 977k | ptr_scratch_buf[i] = speech[-len_subfrm - 1 + i]; |
821 | 977k | } |
822 | 4.03k | iusace_apply_deemph(ptr_scratch_buf, PREEMPH_FILT_FAC, len_subfrm + 1, &ptr_scratch_buf[0]); |
823 | 4.03k | memcpy(td_encoder->lpd_state.tcx_mem, &ptr_scratch_buf[len_subfrm - 128 + 1], |
824 | 4.03k | 128 * sizeof(FLOAT32)); |
825 | 165k | } else { |
826 | 165k | memcpy(speech_buf, td_encoder->old_speech_pe, |
827 | 165k | ((ORDER + ((LEN_NEXT_HIGH_RATE * len_subfrm) / LEN_FRAME))) * sizeof(FLOAT32)); |
828 | 165k | } |
829 | | |
830 | 169k | iusace_core_lpd_encode(usac_data, speech, mode, num_tcx_params, i_ch); |
831 | | |
832 | 169k | if (first_lpd_flag) { |
833 | 4.03k | memcpy(td_encoder->old_speech_pe, |
834 | 4.03k | &speech_buf[(td_encoder->len_frame) + (LEN_LPC0 * len_subfrm) / LEN_FRAME], |
835 | 4.03k | (ORDER + ((LEN_NEXT_HIGH_RATE * len_subfrm) / LEN_FRAME)) * sizeof(FLOAT32)); |
836 | 165k | } else { |
837 | 165k | memcpy(td_encoder->old_speech_pe, &speech_buf[(td_encoder->len_frame)], |
838 | 165k | (ORDER + ((LEN_NEXT_HIGH_RATE * len_subfrm) / LEN_FRAME)) * sizeof(FLOAT32)); |
839 | 165k | } |
840 | | |
841 | 169k | iusace_encode_fac_params(mode, num_tcx_params, usac_data, usac_independency_flg, |
842 | 169k | pstr_it_bit_buff, i_ch); |
843 | | |
844 | 169k | td_encoder->prev_mode = (WORD16)mode[3]; |
845 | | |
846 | 169k | memcpy(mod_out, mode, 4 * sizeof(WORD32)); |
847 | 169k | return IA_NO_ERROR; |
848 | 169k | } |