Coverage Report

Created: 2026-01-10 06:30

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