Coverage Report

Created: 2025-10-10 06:12

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/encoder/iusace_acelp_tools.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 "iusace_cnst.h"
25
#include "iusace_lpd_rom.h"
26
27
static VOID iusace_acelp_ir_vec_corr1(FLOAT32 *ir, FLOAT32 *vec, UWORD8 track, FLOAT32 *sign,
28
                                      FLOAT32 (*corr_ir)[16], FLOAT32 *corr_out, WORD32 *dn2_pos,
29
35.3M
                                      WORD32 num_pluse_pos) {
30
35.3M
  WORD16 i, j;
31
35.3M
  WORD32 dn;
32
35.3M
  WORD32 *dn2;
33
35.3M
  FLOAT32 *p0;
34
35.3M
  FLOAT32 s;
35
35.3M
  dn2 = &dn2_pos[track * 8];
36
35.3M
  p0 = corr_ir[track];
37
249M
  for (i = 0; i < num_pluse_pos; i++) {
38
214M
    dn = dn2[i];
39
214M
    s = 0.0F;
40
8.81G
    for (j = 0; j < (LEN_SUBFR - dn); j++) {
41
8.60G
      s += ir[j] * vec[dn + j];
42
8.60G
    }
43
214M
    corr_out[dn >> 2] = sign[dn] * s + p0[dn >> 2];
44
214M
  }
45
35.3M
}
46
47
static VOID iusace_acelp_ir_vec_corr2(FLOAT32 *ir, FLOAT32 *vec, UWORD8 track, FLOAT32 *sign,
48
35.3M
                                      FLOAT32 (*corr_ir)[16], FLOAT32 *corr_out) {
49
35.3M
  WORD32 i, j;
50
35.3M
  FLOAT32 *p0;
51
35.3M
  FLOAT32 s;
52
35.3M
  p0 = corr_ir[track];
53
600M
  for (i = 0; i < 16; i++) {
54
565M
    s = 0.0F;
55
18.9G
    for (j = 0; j < LEN_SUBFR - track; j++) {
56
18.4G
      s += ir[j] * vec[track + j];
57
18.4G
    }
58
565M
    corr_out[i] = s * sign[track] + p0[i];
59
565M
    track += 4;
60
565M
  }
61
35.3M
}
62
63
static VOID iusace_acelp_get_2p_pos(WORD32 nb_pos_ix, UWORD8 track_p1, UWORD8 track_p2,
64
                                    FLOAT32 *corr_pulses, FLOAT32 *ener_pulses, WORD32 *pos_p1,
65
                                    WORD32 *pos_p2, FLOAT32 *dn, WORD32 *dn2, FLOAT32 *corr_p1,
66
35.3M
                                    FLOAT32 *corr_p2, FLOAT32 (*corr_p1p2)[256]) {
67
35.3M
  WORD32 x, x2, y, x_save = 0, y_save = 0, i, *pos_x;
68
35.3M
  FLOAT32 ps0, alp0;
69
35.3M
  FLOAT32 ps1, ps2, sq, sqk;
70
35.3M
  FLOAT32 alp1, alp2, alpk;
71
35.3M
  FLOAT32 *p1, *p2;
72
35.3M
  FLOAT32 s;
73
35.3M
  pos_x = &dn2[track_p1 << 3];
74
35.3M
  ps0 = *corr_pulses;
75
35.3M
  alp0 = *ener_pulses;
76
35.3M
  sqk = -1.0F;
77
35.3M
  alpk = 1.0F;
78
79
249M
  for (i = 0; i < nb_pos_ix; i++) {
80
214M
    x = pos_x[i];
81
214M
    x2 = x >> 2;
82
83
214M
    ps1 = ps0 + dn[x];
84
214M
    alp1 = alp0 + corr_p1[x2];
85
214M
    p1 = corr_p2;
86
214M
    p2 = &corr_p1p2[track_p1][x2 << 4];
87
3.64G
    for (y = track_p2; y < LEN_SUBFR; y += 4) {
88
3.42G
      ps2 = ps1 + dn[y];
89
3.42G
      alp2 = alp1 + (*p1++) + (*p2++);
90
3.42G
      sq = ps2 * ps2;
91
3.42G
      s = (alpk * sq) - (sqk * alp2);
92
3.42G
      if (s > 0.0F) {
93
204M
        sqk = sq;
94
204M
        alpk = alp2;
95
204M
        y_save = y;
96
204M
        x_save = x;
97
204M
      }
98
3.42G
    }
99
214M
  }
100
35.3M
  *corr_pulses = ps0 + dn[x_save] + dn[y_save];
101
35.3M
  *ener_pulses = alpk;
102
35.3M
  *pos_p1 = x_save;
103
35.3M
  *pos_p2 = y_save;
104
35.3M
}
105
106
static VOID iusace_acelp_get_1p_pos(UWORD8 track_p1, UWORD8 track_p2, FLOAT32 *corr_pulses,
107
                                    FLOAT32 *alp, WORD32 *pos_p1, FLOAT32 *dn, FLOAT32 *corr_p1,
108
0
                                    FLOAT32 *corr_p2) {
109
0
  WORD32 x, x_save = 0;
110
0
  FLOAT32 ps0, alp0;
111
0
  FLOAT32 ps1, sq, sqk;
112
0
  FLOAT32 alp1, alpk;
113
0
  FLOAT32 s;
114
115
0
  ps0 = *corr_pulses;
116
0
  alp0 = *alp;
117
0
  sqk = -1.0F;
118
0
  alpk = 1.0F;
119
120
0
  for (x = track_p1; x < LEN_SUBFR; x += 4) {
121
0
    ps1 = ps0 + dn[x];
122
0
    alp1 = alp0 + corr_p1[x >> 2];
123
0
    sq = ps1 * ps1;
124
0
    s = (alpk * sq) - (sqk * alp1);
125
0
    if (s > 0.0F) {
126
0
      sqk = sq;
127
0
      alpk = alp1;
128
0
      x_save = x;
129
0
    }
130
0
  }
131
132
0
  if (track_p2 != track_p1) {
133
0
    for (x = track_p2; x < LEN_SUBFR; x += 4) {
134
0
      ps1 = ps0 + dn[x];
135
0
      alp1 = alp0 + corr_p2[x >> 2];
136
0
      sq = ps1 * ps1;
137
0
      s = (alpk * sq) - (sqk * alp1);
138
0
      if (s > 0.0F) {
139
0
        sqk = sq;
140
0
        alpk = alp1;
141
0
        x_save = x;
142
0
      }
143
0
    }
144
0
  }
145
146
0
  *corr_pulses = ps0 + dn[x_save];
147
0
  *alp = alpk;
148
0
  *pos_p1 = x_save;
149
0
}
150
151
6.11M
static WORD32 iusace_acelp_quant_1p_n1bits(WORD32 pos_pulse, WORD32 num_bits_pos) {
152
6.11M
  WORD32 mask;
153
6.11M
  WORD32 index;
154
6.11M
  mask = ((1 << num_bits_pos) - 1);
155
156
6.11M
  index = (pos_pulse & mask);
157
6.11M
  if ((pos_pulse & 16) != 0) {
158
3.06M
    index += 1 << num_bits_pos;
159
3.06M
  }
160
6.11M
  return (index);
161
6.11M
}
162
163
12.2M
static WORD32 iusace_acelp_quant_2p_2n1bits(WORD32 pos_p1, WORD32 pos_p2, WORD32 num_bits_pos) {
164
12.2M
  WORD32 mask;
165
12.2M
  WORD32 index;
166
12.2M
  mask = ((1 << num_bits_pos) - 1);
167
168
12.2M
  if (((pos_p2 ^ pos_p1) & 16) == 0) {
169
8.53M
    if ((pos_p1 - pos_p2) <= 0) {
170
6.25M
      index = ((pos_p1 & mask) << num_bits_pos) + (pos_p2 & mask);
171
6.25M
    } else {
172
2.28M
      index = ((pos_p2 & mask) << num_bits_pos) + (pos_p1 & mask);
173
2.28M
    }
174
8.53M
    if ((pos_p1 & 16) != 0) {
175
4.26M
      index += 1 << (2 * num_bits_pos);
176
4.26M
    }
177
8.53M
  } else {
178
3.74M
    if (((pos_p1 & mask) - (pos_p2 & mask)) <= 0) {
179
2.14M
      index = ((pos_p2 & mask) << num_bits_pos) + (pos_p1 & mask);
180
2.14M
      if ((pos_p2 & 16) != 0) {
181
1.07M
        index += 1 << (2 * num_bits_pos);
182
1.07M
      }
183
2.14M
    } else {
184
1.60M
      index = ((pos_p1 & mask) << num_bits_pos) + (pos_p2 & mask);
185
1.60M
      if ((pos_p1 & 16) != 0) {
186
811k
        index += 1 << (2 * num_bits_pos);
187
811k
      }
188
1.60M
    }
189
3.74M
  }
190
12.2M
  return (index);
191
12.2M
}
192
193
static WORD32 iusace_acelp_quant_3p_3n1bits(WORD32 pos_p1, WORD32 pos_p2, WORD32 pos_p3,
194
3.07M
                                            WORD32 num_bits_pos) {
195
3.07M
  WORD32 nb_pos;
196
3.07M
  WORD32 index;
197
3.07M
  nb_pos = (1 << (num_bits_pos - 1));
198
199
3.07M
  if (((pos_p1 ^ pos_p2) & nb_pos) == 0) {
200
1.66M
    index = iusace_acelp_quant_2p_2n1bits(pos_p1, pos_p2, (num_bits_pos - 1));
201
1.66M
    index += (pos_p1 & nb_pos) << num_bits_pos;
202
1.66M
    index += iusace_acelp_quant_1p_n1bits(pos_p3, num_bits_pos) << (2 * num_bits_pos);
203
1.66M
  } else if (((pos_p1 ^ pos_p3) & nb_pos) == 0) {
204
778k
    index = iusace_acelp_quant_2p_2n1bits(pos_p1, pos_p3, (num_bits_pos - 1));
205
778k
    index += (pos_p1 & nb_pos) << num_bits_pos;
206
778k
    index += iusace_acelp_quant_1p_n1bits(pos_p2, num_bits_pos) << (2 * num_bits_pos);
207
778k
  } else {
208
631k
    index = iusace_acelp_quant_2p_2n1bits(pos_p2, pos_p3, (num_bits_pos - 1));
209
631k
    index += (pos_p2 & nb_pos) << num_bits_pos;
210
631k
    index += iusace_acelp_quant_1p_n1bits(pos_p1, num_bits_pos) << (2 * num_bits_pos);
211
631k
  }
212
3.07M
  return (index);
213
3.07M
}
214
215
static WORD32 iusace_acelp_quant_4p_4n1bits(WORD32 pos_p1, WORD32 pos_p2, WORD32 pos_p3,
216
2.04M
                                            WORD32 pos_p4, WORD32 num_bits_pos) {
217
2.04M
  WORD32 nb_pos;
218
2.04M
  WORD32 index;
219
2.04M
  nb_pos = (1 << (num_bits_pos - 1));
220
221
2.04M
  if (((pos_p1 ^ pos_p2) & nb_pos) == 0) {
222
1.36M
    index = iusace_acelp_quant_2p_2n1bits(pos_p1, pos_p2, (num_bits_pos - 1));
223
1.36M
    index += (pos_p1 & nb_pos) << num_bits_pos;
224
1.36M
    index += iusace_acelp_quant_2p_2n1bits(pos_p3, pos_p4, num_bits_pos) << (2 * num_bits_pos);
225
1.36M
  } else if (((pos_p1 ^ pos_p3) & nb_pos) == 0) {
226
451k
    index = iusace_acelp_quant_2p_2n1bits(pos_p1, pos_p3, (num_bits_pos - 1));
227
451k
    index += (pos_p1 & nb_pos) << num_bits_pos;
228
451k
    index += iusace_acelp_quant_2p_2n1bits(pos_p2, pos_p4, num_bits_pos) << (2 * num_bits_pos);
229
451k
  } else {
230
233k
    index = iusace_acelp_quant_2p_2n1bits(pos_p2, pos_p3, (num_bits_pos - 1));
231
233k
    index += (pos_p2 & nb_pos) << num_bits_pos;
232
233k
    index += iusace_acelp_quant_2p_2n1bits(pos_p1, pos_p4, num_bits_pos) << (2 * num_bits_pos);
233
233k
  }
234
2.04M
  return (index);
235
2.04M
}
236
237
7.09M
static WORD32 iusace_acelp_quant_4p_4nbits(WORD32 *pos_pulses, WORD32 num_bits_pos) {
238
7.09M
  WORD32 i, j, k, nb_pos, n_1;
239
7.09M
  WORD32 pos_a[4], pos_b[4];
240
7.09M
  WORD32 index = 0;
241
7.09M
  n_1 = num_bits_pos - 1;
242
7.09M
  nb_pos = (1 << n_1);
243
7.09M
  i = 0;
244
7.09M
  j = 0;
245
35.4M
  for (k = 0; k < 4; k++) {
246
28.3M
    if ((pos_pulses[k] & nb_pos) == 0) {
247
18.9M
      pos_a[i++] = pos_pulses[k];
248
18.9M
    } else {
249
9.48M
      pos_b[j++] = pos_pulses[k];
250
9.48M
    }
251
28.3M
  }
252
7.09M
  switch (i) {
253
168k
    case 0:
254
168k
      index = 1 << ((4 * num_bits_pos) - 3);
255
168k
      index += iusace_acelp_quant_4p_4n1bits(pos_b[0], pos_b[1], pos_b[2], pos_b[3], n_1);
256
168k
      break;
257
869k
    case 1:
258
869k
      index = iusace_acelp_quant_1p_n1bits(pos_a[0], n_1) << ((3 * n_1) + 1);
259
869k
      index += iusace_acelp_quant_3p_3n1bits(pos_b[0], pos_b[1], pos_b[2], n_1);
260
869k
      break;
261
2.01M
    case 2:
262
2.01M
      index = iusace_acelp_quant_2p_2n1bits(pos_a[0], pos_a[1], n_1) << ((2 * n_1) + 1);
263
2.01M
      index += iusace_acelp_quant_2p_2n1bits(pos_b[0], pos_b[1], n_1);
264
2.01M
      break;
265
2.16M
    case 3:
266
2.16M
      index = iusace_acelp_quant_3p_3n1bits(pos_a[0], pos_a[1], pos_a[2], n_1) << num_bits_pos;
267
2.16M
      index += iusace_acelp_quant_1p_n1bits(pos_b[0], n_1);
268
2.16M
      break;
269
1.87M
    case 4:
270
1.87M
      index = iusace_acelp_quant_4p_4n1bits(pos_a[0], pos_a[1], pos_a[2], pos_a[3], n_1);
271
1.87M
      break;
272
7.09M
  }
273
7.09M
  index += (i & 3) << ((4 * num_bits_pos) - 2);
274
7.09M
  return (index);
275
7.09M
}
276
277
0
static WORD32 iusace_acelp_quant_5p_5nbits(WORD32 *pos_pulses, WORD32 num_bits_pos) {
278
0
  WORD32 i, j, k, nb_pos, n_1;
279
0
  WORD32 pos_a[5], pos_b[5];
280
0
  WORD32 index = 0;
281
0
  n_1 = num_bits_pos - 1;
282
0
  nb_pos = (1 << n_1);
283
0
  i = 0;
284
0
  j = 0;
285
0
  for (k = 0; k < 5; k++) {
286
0
    if ((pos_pulses[k] & nb_pos) == 0) {
287
0
      pos_a[i++] = pos_pulses[k];
288
0
    } else {
289
0
      pos_b[j++] = pos_pulses[k];
290
0
    }
291
0
  }
292
0
  switch (i) {
293
0
    case 0:
294
0
      index = 1 << ((5 * num_bits_pos) - 1);
295
0
      index += iusace_acelp_quant_3p_3n1bits(pos_b[0], pos_b[1], pos_b[2], n_1)
296
0
               << ((2 * num_bits_pos) + 1);
297
0
      index += iusace_acelp_quant_2p_2n1bits(pos_b[3], pos_b[4], num_bits_pos);
298
0
      break;
299
0
    case 1:
300
0
      index = 1 << ((5 * num_bits_pos) - 1);
301
0
      index += iusace_acelp_quant_3p_3n1bits(pos_b[0], pos_b[1], pos_b[2], n_1)
302
0
               << ((2 * num_bits_pos) + 1);
303
0
      index += iusace_acelp_quant_2p_2n1bits(pos_b[3], pos_a[0], num_bits_pos);
304
0
      break;
305
0
    case 2:
306
0
      index = 1 << ((5 * num_bits_pos) - 1);
307
0
      index += iusace_acelp_quant_3p_3n1bits(pos_b[0], pos_b[1], pos_b[2], n_1)
308
0
               << ((2 * num_bits_pos) + 1);
309
0
      index += iusace_acelp_quant_2p_2n1bits(pos_a[0], pos_a[1], num_bits_pos);
310
0
      break;
311
0
    case 3:
312
0
      index = iusace_acelp_quant_3p_3n1bits(pos_a[0], pos_a[1], pos_a[2], n_1)
313
0
              << ((2 * num_bits_pos) + 1);
314
0
      index += iusace_acelp_quant_2p_2n1bits(pos_b[0], pos_b[1], num_bits_pos);
315
0
      break;
316
0
    case 4:
317
0
      index = iusace_acelp_quant_3p_3n1bits(pos_a[0], pos_a[1], pos_a[2], n_1)
318
0
              << ((2 * num_bits_pos) + 1);
319
0
      index += iusace_acelp_quant_2p_2n1bits(pos_a[3], pos_b[0], num_bits_pos);
320
0
      break;
321
0
    case 5:
322
0
      index = iusace_acelp_quant_3p_3n1bits(pos_a[0], pos_a[1], pos_a[2], n_1)
323
0
              << ((2 * num_bits_pos) + 1);
324
0
      index += iusace_acelp_quant_2p_2n1bits(pos_a[3], pos_a[4], num_bits_pos);
325
0
      break;
326
0
  }
327
0
  return (index);
328
0
}
329
330
0
static WORD32 iusace_acelp_quant_6p_6n_2bits(WORD32 *pos_pulses, WORD32 num_bits_pos) {
331
0
  WORD32 i, j, k, nb_pos, n_1;
332
0
  WORD32 pos_a[6], pos_b[6];
333
0
  WORD32 index = 0;
334
0
  n_1 = num_bits_pos - 1;
335
0
  nb_pos = 1 << n_1;
336
0
  i = 0;
337
0
  j = 0;
338
0
  for (k = 0; k < 6; k++) {
339
0
    if ((pos_pulses[k] & nb_pos) == 0) {
340
0
      pos_a[i++] = pos_pulses[k];
341
0
    } else {
342
0
      pos_b[j++] = pos_pulses[k];
343
0
    }
344
0
  }
345
346
0
  switch (i) {
347
0
    case 0:
348
0
      index = 1 << ((6 * num_bits_pos) - 5);
349
0
      index += iusace_acelp_quant_5p_5nbits(pos_b, n_1) << num_bits_pos;
350
0
      index += iusace_acelp_quant_1p_n1bits(pos_b[5], n_1);
351
0
      break;
352
0
    case 1:
353
0
      index = 1 << ((6 * num_bits_pos) - 5);
354
0
      index += iusace_acelp_quant_5p_5nbits(pos_b, n_1) << num_bits_pos;
355
0
      index += iusace_acelp_quant_1p_n1bits(pos_a[0], n_1);
356
0
      break;
357
0
    case 2:
358
0
      index = 1 << ((6 * num_bits_pos) - 5);
359
0
      index += iusace_acelp_quant_4p_4nbits(pos_b, n_1) << ((2 * n_1) + 1);
360
0
      index += iusace_acelp_quant_2p_2n1bits(pos_a[0], pos_a[1], n_1);
361
0
      break;
362
0
    case 3:
363
0
      index = iusace_acelp_quant_3p_3n1bits(pos_a[0], pos_a[1], pos_a[2], n_1) << ((3 * n_1) + 1);
364
0
      index += iusace_acelp_quant_3p_3n1bits(pos_b[0], pos_b[1], pos_b[2], n_1);
365
0
      break;
366
0
    case 4:
367
0
      i = 2;
368
0
      index = iusace_acelp_quant_4p_4nbits(pos_a, n_1) << ((2 * n_1) + 1);
369
0
      index += iusace_acelp_quant_2p_2n1bits(pos_b[0], pos_b[1], n_1);
370
0
      break;
371
0
    case 5:
372
0
      i = 1;
373
0
      index = iusace_acelp_quant_5p_5nbits(pos_a, n_1) << num_bits_pos;
374
0
      index += iusace_acelp_quant_1p_n1bits(pos_b[0], n_1);
375
0
      break;
376
0
    case 6:
377
0
      i = 0;
378
0
      index = iusace_acelp_quant_5p_5nbits(pos_a, n_1) << num_bits_pos;
379
0
      index += iusace_acelp_quant_1p_n1bits(pos_a[5], n_1);
380
0
      break;
381
0
  }
382
0
  index += (i & 3) << ((6 * num_bits_pos) - 4);
383
0
  return (index);
384
0
}
385
386
2.05M
VOID iusace_acelp_tgt_ir_corr(FLOAT32 *x, FLOAT32 *ir_wsyn, FLOAT32 *corr_out) {
387
2.05M
  WORD16 i, j;
388
2.05M
  FLOAT32 sum;
389
133M
  for (i = 0; i < LEN_SUBFR; i++) {
390
131M
    sum = 0.0F;
391
4.40G
    for (j = i; j < LEN_SUBFR; j++) {
392
4.27G
      sum += x[j] * ir_wsyn[j - i];
393
4.27G
    }
394
131M
    corr_out[i] = sum;
395
131M
  }
396
2.05M
}
397
398
4.10M
FLOAT32 iusace_acelp_tgt_cb_corr2(FLOAT32 *xn, FLOAT32 *y1, FLOAT32 *corr_out) {
399
4.10M
  FLOAT32 gain;
400
4.10M
  FLOAT32 t0, t1;
401
4.10M
  WORD16 i;
402
4.10M
  t0 = xn[0] * y1[0];
403
4.10M
  t1 = y1[0] * y1[0];
404
41.0M
  for (i = 1; i < LEN_SUBFR; i += 7) {
405
36.9M
    t0 += xn[i] * y1[i];
406
36.9M
    t1 += y1[i] * y1[i];
407
36.9M
    t0 += xn[i + 1] * y1[i + 1];
408
36.9M
    t1 += y1[i + 1] * y1[i + 1];
409
36.9M
    t0 += xn[i + 2] * y1[i + 2];
410
36.9M
    t1 += y1[i + 2] * y1[i + 2];
411
36.9M
    t0 += xn[i + 3] * y1[i + 3];
412
36.9M
    t1 += y1[i + 3] * y1[i + 3];
413
36.9M
    t0 += xn[i + 4] * y1[i + 4];
414
36.9M
    t1 += y1[i + 4] * y1[i + 4];
415
36.9M
    t0 += xn[i + 5] * y1[i + 5];
416
36.9M
    t1 += y1[i + 5] * y1[i + 5];
417
36.9M
    t0 += xn[i + 6] * y1[i + 6];
418
36.9M
    t1 += y1[i + 6] * y1[i + 6];
419
36.9M
  }
420
4.10M
  corr_out[0] = t1;
421
4.10M
  corr_out[1] = -2.0F * t0 + 0.01F;
422
423
4.10M
  if (t1) {
424
4.07M
    gain = t0 / t1;
425
4.07M
  } else {
426
38.5k
    gain = 1.0F;
427
38.5k
  }
428
4.10M
  if (gain < 0.0) {
429
841k
    gain = 0.0;
430
3.26M
  } else if (gain > 1.2F) {
431
480k
    gain = 1.2F;
432
480k
  }
433
4.10M
  return gain;
434
4.10M
}
435
436
2.05M
VOID iusace_acelp_tgt_cb_corr1(FLOAT32 *xn, FLOAT32 *y1, FLOAT32 *y2, FLOAT32 *corr_out) {
437
2.05M
  WORD32 i;
438
2.05M
  FLOAT32 temp1, temp2, temp3;
439
2.05M
  temp1 = 0.01F + y2[0] * y2[0];
440
2.05M
  temp2 = 0.01F + xn[0] * y2[0];
441
2.05M
  temp3 = 0.01F + y1[0] * y2[0];
442
2.05M
  temp1 += y2[1] * y2[1];
443
2.05M
  temp2 += xn[1] * y2[1];
444
2.05M
  temp3 += y1[1] * y2[1];
445
2.05M
  temp1 += y2[2] * y2[2];
446
2.05M
  temp2 += xn[2] * y2[2];
447
2.05M
  temp3 += y1[2] * y2[2];
448
2.05M
  temp1 += y2[3] * y2[3];
449
2.05M
  temp2 += xn[3] * y2[3];
450
2.05M
  temp3 += y1[3] * y2[3];
451
22.5M
  for (i = 4; i < LEN_SUBFR; i += 6) {
452
20.5M
    temp1 += y2[i] * y2[i];
453
20.5M
    temp2 += xn[i] * y2[i];
454
20.5M
    temp3 += y1[i] * y2[i];
455
20.5M
    temp1 += y2[i + 1] * y2[i + 1];
456
20.5M
    temp2 += xn[i + 1] * y2[i + 1];
457
20.5M
    temp3 += y1[i + 1] * y2[i + 1];
458
20.5M
    temp1 += y2[i + 2] * y2[i + 2];
459
20.5M
    temp2 += xn[i + 2] * y2[i + 2];
460
20.5M
    temp3 += y1[i + 2] * y2[i + 2];
461
20.5M
    temp1 += y2[i + 3] * y2[i + 3];
462
20.5M
    temp2 += xn[i + 3] * y2[i + 3];
463
20.5M
    temp3 += y1[i + 3] * y2[i + 3];
464
20.5M
    temp1 += y2[i + 4] * y2[i + 4];
465
20.5M
    temp2 += xn[i + 4] * y2[i + 4];
466
20.5M
    temp3 += y1[i + 4] * y2[i + 4];
467
20.5M
    temp1 += y2[i + 5] * y2[i + 5];
468
20.5M
    temp2 += xn[i + 5] * y2[i + 5];
469
20.5M
    temp3 += y1[i + 5] * y2[i + 5];
470
20.5M
  }
471
2.05M
  corr_out[2] = temp1;
472
2.05M
  corr_out[3] = -2.0F * temp2;
473
2.05M
  corr_out[4] = 2.0F * temp3;
474
2.05M
}
475
476
8.21M
VOID iusace_acelp_cb_target_update(FLOAT32 *x, FLOAT32 *new_x, FLOAT32 *cb_vec, FLOAT32 gain) {
477
8.21M
  WORD16 i;
478
534M
  for (i = 0; i < LEN_SUBFR; i++) {
479
525M
    new_x[i] = x[i] - gain * cb_vec[i];
480
525M
  }
481
8.21M
}
482
483
VOID iusace_acelp_cb_exc(FLOAT32 *corr_input, FLOAT32 *lp_residual, FLOAT32 *ir_wsyn,
484
                         WORD16 *alg_cb_exc_out, FLOAT32 *filt_cb_exc, WORD32 num_bits_cb,
485
2.05M
                         WORD32 *acelp_param_out, FLOAT32 *scratch_acelp_ir_buf) {
486
2.05M
  FLOAT32 sign[LEN_SUBFR], vec[LEN_SUBFR];
487
2.05M
  FLOAT32 corr_x[16], corr_y[16];
488
2.05M
  FLOAT32 *ir_buf = scratch_acelp_ir_buf;
489
2.05M
  FLOAT32 corr_ir[4][16];
490
2.05M
  FLOAT32 corr_p1p2[4][256];
491
2.05M
  FLOAT32 dn2[LEN_SUBFR];
492
2.05M
  WORD32 pulse_pos[NPMAXPT * 4] = {0};
493
2.05M
  WORD32 codvec[MAX_NUM_PULSES] = {0};
494
2.05M
  WORD32 num_pulse_position[10] = {0};
495
2.05M
  WORD32 pos_max[4];
496
2.05M
  WORD32 dn2_pos[8 * 4];
497
2.05M
  UWORD8 ipos[MAX_NUM_PULSES] = {0};
498
2.05M
  WORD32 i, j, k, st, pos = 0, index, track, num_pulses = 0, num_iter = 4;
499
2.05M
  WORD32 l_index;
500
2.05M
  FLOAT32 psk, ps, alpk, alp = 0.0F;
501
2.05M
  FLOAT32 val;
502
2.05M
  FLOAT32 s, cor;
503
2.05M
  FLOAT32 *p0, *p1, *p2, *p3, *psign;
504
2.05M
  FLOAT32 *p1_ir_buf, *p2_ir_buf, *p3_ir_buf, *p4_ir_buf, *ir_sign_inv;
505
2.05M
  switch (num_bits_cb) {
506
0
    case ACELP_NUM_BITS_20:
507
0
      num_iter = 4;
508
0
      alp = 2.0;
509
0
      num_pulses = 4;
510
0
      num_pulse_position[0] = 4;
511
0
      num_pulse_position[1] = 8;
512
0
      break;
513
0
    case ACELP_NUM_BITS_28:
514
0
      num_iter = 4;
515
0
      alp = 1.5;
516
0
      num_pulses = 6;
517
0
      num_pulse_position[0] = 4;
518
0
      num_pulse_position[1] = 8;
519
0
      num_pulse_position[2] = 8;
520
0
      break;
521
522
270k
    case ACELP_NUM_BITS_36:
523
270k
      num_iter = 4;
524
270k
      alp = 1.0;
525
270k
      num_pulses = 8;
526
270k
      num_pulse_position[0] = 4;
527
270k
      num_pulse_position[1] = 8;
528
270k
      num_pulse_position[2] = 8;
529
270k
      break;
530
0
    case ACELP_NUM_BITS_44:
531
0
      num_iter = 4;
532
0
      alp = 1.0;
533
0
      num_pulses = 10;
534
0
      num_pulse_position[0] = 4;
535
0
      num_pulse_position[1] = 6;
536
0
      num_pulse_position[2] = 8;
537
0
      num_pulse_position[3] = 8;
538
0
      break;
539
9.52k
    case ACELP_NUM_BITS_52:
540
9.52k
      num_iter = 4;
541
9.52k
      alp = 1.0;
542
9.52k
      num_pulses = 12;
543
9.52k
      num_pulse_position[0] = 4;
544
9.52k
      num_pulse_position[1] = 6;
545
9.52k
      num_pulse_position[2] = 8;
546
9.52k
      num_pulse_position[3] = 8;
547
9.52k
      break;
548
1.77M
    case ACELP_NUM_BITS_64:
549
1.77M
      num_iter = 3;
550
1.77M
      alp = 0.8F;
551
1.77M
      num_pulses = 16;
552
1.77M
      num_pulse_position[0] = 4;
553
1.77M
      num_pulse_position[1] = 4;
554
1.77M
      num_pulse_position[2] = 6;
555
1.77M
      num_pulse_position[3] = 6;
556
1.77M
      num_pulse_position[4] = 8;
557
1.77M
      num_pulse_position[5] = 8;
558
1.77M
      break;
559
2.05M
  }
560
561
2.05M
  val = (lp_residual[0] * lp_residual[0]) + 1.0F;
562
2.05M
  cor = (corr_input[0] * corr_input[0]) + 1.0F;
563
20.5M
  for (i = 1; i < LEN_SUBFR; i += 7) {
564
18.4M
    val += (lp_residual[i] * lp_residual[i]);
565
18.4M
    cor += (corr_input[i] * corr_input[i]);
566
18.4M
    val += (lp_residual[i + 1] * lp_residual[i + 1]);
567
18.4M
    cor += (corr_input[i + 1] * corr_input[i + 1]);
568
18.4M
    val += (lp_residual[i + 2] * lp_residual[i + 2]);
569
18.4M
    cor += (corr_input[i + 2] * corr_input[i + 2]);
570
18.4M
    val += (lp_residual[i + 3] * lp_residual[i + 3]);
571
18.4M
    cor += (corr_input[i + 3] * corr_input[i + 3]);
572
18.4M
    val += (lp_residual[i + 4] * lp_residual[i + 4]);
573
18.4M
    cor += (corr_input[i + 4] * corr_input[i + 4]);
574
18.4M
    val += (lp_residual[i + 5] * lp_residual[i + 5]);
575
18.4M
    cor += (corr_input[i + 5] * corr_input[i + 5]);
576
18.4M
    val += (lp_residual[i + 6] * lp_residual[i + 6]);
577
18.4M
    cor += (corr_input[i + 6] * corr_input[i + 6]);
578
18.4M
  }
579
2.05M
  s = (FLOAT32)sqrt(cor / val);
580
133M
  for (j = 0; j < LEN_SUBFR; j++) {
581
131M
    cor = (s * lp_residual[j]) + (alp * corr_input[j]);
582
131M
    if (cor >= 0.0F) {
583
65.4M
      sign[j] = 1.0F;
584
65.4M
      vec[j] = -1.0F;
585
65.4M
      dn2[j] = cor;
586
66.0M
    } else {
587
66.0M
      sign[j] = -1.0F;
588
66.0M
      vec[j] = 1.0F;
589
66.0M
      corr_input[j] = -corr_input[j];
590
66.0M
      dn2[j] = -cor;
591
66.0M
    }
592
131M
  }
593
10.2M
  for (i = 0; i < 4; i++) {
594
73.9M
    for (k = 0; k < 8; k++) {
595
65.7M
      ps = -1;
596
1.11G
      for (j = i; j < LEN_SUBFR; j += 4) {
597
1.05G
        if (dn2[j] > ps) {
598
168M
          ps = dn2[j];
599
168M
          pos = j;
600
168M
        }
601
1.05G
      }
602
65.7M
      dn2[pos] = (FLOAT32)k - 8;
603
65.7M
      dn2_pos[i * 8 + k] = pos;
604
65.7M
    }
605
8.21M
    pos_max[i] = dn2_pos[i * 8];
606
8.21M
  }
607
608
2.05M
  memset(ir_buf, 0, LEN_SUBFR * sizeof(FLOAT32));
609
2.05M
  memset(ir_buf + (2 * LEN_SUBFR), 0, LEN_SUBFR * sizeof(FLOAT32));
610
2.05M
  p1_ir_buf = ir_buf + LEN_SUBFR;
611
2.05M
  ir_sign_inv = ir_buf + (3 * LEN_SUBFR);
612
2.05M
  memcpy(p1_ir_buf, ir_wsyn, LEN_SUBFR * sizeof(FLOAT32));
613
2.05M
  ir_sign_inv[0] = -p1_ir_buf[0];
614
2.05M
  ir_sign_inv[1] = -p1_ir_buf[1];
615
2.05M
  ir_sign_inv[2] = -p1_ir_buf[2];
616
2.05M
  ir_sign_inv[3] = -p1_ir_buf[3];
617
22.5M
  for (i = 4; i < LEN_SUBFR; i += 6) {
618
20.5M
    ir_sign_inv[i] = -p1_ir_buf[i];
619
20.5M
    ir_sign_inv[i + 1] = -p1_ir_buf[i + 1];
620
20.5M
    ir_sign_inv[i + 2] = -p1_ir_buf[i + 2];
621
20.5M
    ir_sign_inv[i + 3] = -p1_ir_buf[i + 3];
622
20.5M
    ir_sign_inv[i + 4] = -p1_ir_buf[i + 4];
623
20.5M
    ir_sign_inv[i + 5] = -p1_ir_buf[i + 5];
624
20.5M
  }
625
626
2.05M
  p0 = &corr_ir[0][16 - 1];
627
2.05M
  p1 = &corr_ir[1][16 - 1];
628
2.05M
  p2 = &corr_ir[2][16 - 1];
629
2.05M
  p3 = &corr_ir[3][16 - 1];
630
2.05M
  p2_ir_buf = p1_ir_buf;
631
2.05M
  cor = 0.0F;
632
34.9M
  for (i = 0; i < 16; i++) {
633
32.8M
    cor += (*p2_ir_buf) * (*p2_ir_buf);
634
32.8M
    p2_ir_buf++;
635
32.8M
    *p3-- = cor * 0.5F;
636
32.8M
    cor += (*p2_ir_buf) * (*p2_ir_buf);
637
32.8M
    p2_ir_buf++;
638
32.8M
    *p2-- = cor * 0.5F;
639
32.8M
    cor += (*p2_ir_buf) * (*p2_ir_buf);
640
32.8M
    p2_ir_buf++;
641
32.8M
    *p1-- = cor * 0.5F;
642
32.8M
    cor += (*p2_ir_buf) * (*p2_ir_buf);
643
32.8M
    p2_ir_buf++;
644
32.8M
    *p0-- = cor * 0.5F;
645
32.8M
  }
646
2.05M
  pos = 256 - 1;
647
2.05M
  p4_ir_buf = p1_ir_buf + 1;
648
34.9M
  for (k = 0; k < 16; k++) {
649
32.8M
    p3 = &corr_p1p2[2][pos];
650
32.8M
    p2 = &corr_p1p2[1][pos];
651
32.8M
    p1 = &corr_p1p2[0][pos];
652
32.8M
    if (k == 15) {
653
2.05M
      p0 = &corr_p1p2[3][pos - 15];
654
30.8M
    } else {
655
30.8M
      p0 = &corr_p1p2[3][pos - 16];
656
30.8M
    }
657
32.8M
    cor = 0.0F;
658
32.8M
    p2_ir_buf = p1_ir_buf;
659
32.8M
    p3_ir_buf = p4_ir_buf;
660
279M
    for (i = k + 1; i < 16; i++) {
661
246M
      cor += (*p2_ir_buf) * (*p3_ir_buf);
662
246M
      p2_ir_buf++;
663
246M
      p3_ir_buf++;
664
246M
      *p3 = cor;
665
246M
      cor += (*p2_ir_buf) * (*p3_ir_buf);
666
246M
      p2_ir_buf++;
667
246M
      p3_ir_buf++;
668
246M
      *p2 = cor;
669
246M
      cor += (*p2_ir_buf) * (*p3_ir_buf);
670
246M
      p2_ir_buf++;
671
246M
      p3_ir_buf++;
672
246M
      *p1 = cor;
673
246M
      cor += (*p2_ir_buf) * (*p3_ir_buf);
674
246M
      p2_ir_buf++;
675
246M
      p3_ir_buf++;
676
246M
      *p0 = cor;
677
246M
      p3 -= (16 + 1);
678
246M
      p2 -= (16 + 1);
679
246M
      p1 -= (16 + 1);
680
246M
      p0 -= (16 + 1);
681
246M
    }
682
32.8M
    cor += (*p2_ir_buf) * (*p3_ir_buf);
683
32.8M
    p2_ir_buf++;
684
32.8M
    p3_ir_buf++;
685
32.8M
    *p3 = cor;
686
32.8M
    cor += (*p2_ir_buf) * (*p3_ir_buf);
687
32.8M
    p2_ir_buf++;
688
32.8M
    p3_ir_buf++;
689
32.8M
    *p2 = cor;
690
32.8M
    cor += (*p2_ir_buf) * (*p3_ir_buf);
691
32.8M
    p2_ir_buf++;
692
32.8M
    p3_ir_buf++;
693
32.8M
    *p1 = cor;
694
32.8M
    pos -= 16;
695
32.8M
    p4_ir_buf += 4;
696
32.8M
  }
697
2.05M
  pos = 256 - 1;
698
2.05M
  p4_ir_buf = p1_ir_buf + 3;
699
34.9M
  for (k = 0; k < 16; k++) {
700
32.8M
    p3 = &corr_p1p2[3][pos];
701
32.8M
    p2 = &corr_p1p2[2][pos - 1];
702
32.8M
    p1 = &corr_p1p2[1][pos - 1];
703
32.8M
    p0 = &corr_p1p2[0][pos - 1];
704
32.8M
    cor = 0.0F;
705
32.8M
    p2_ir_buf = p1_ir_buf;
706
32.8M
    p3_ir_buf = p4_ir_buf;
707
279M
    for (i = k + 1; i < 16; i++) {
708
246M
      cor += (*p2_ir_buf) * (*p3_ir_buf);
709
246M
      p2_ir_buf++;
710
246M
      p3_ir_buf++;
711
246M
      *p3 = cor;
712
246M
      cor += (*p2_ir_buf) * (*p3_ir_buf);
713
246M
      p2_ir_buf++;
714
246M
      p3_ir_buf++;
715
246M
      *p2 = cor;
716
246M
      cor += (*p2_ir_buf) * (*p3_ir_buf);
717
246M
      p2_ir_buf++;
718
246M
      p3_ir_buf++;
719
246M
      *p1 = cor;
720
246M
      cor += (*p2_ir_buf) * (*p3_ir_buf);
721
246M
      p2_ir_buf++;
722
246M
      p3_ir_buf++;
723
246M
      *p0 = cor;
724
246M
      p3 -= (16 + 1);
725
246M
      p2 -= (16 + 1);
726
246M
      p1 -= (16 + 1);
727
246M
      p0 -= (16 + 1);
728
246M
    }
729
32.8M
    cor += (*p2_ir_buf) * (*p3_ir_buf);
730
32.8M
    p2_ir_buf++;
731
32.8M
    p3_ir_buf++;
732
32.8M
    *p3 = cor;
733
32.8M
    pos--;
734
32.8M
    p4_ir_buf += 4;
735
32.8M
  }
736
737
2.05M
  p0 = &corr_p1p2[0][0];
738
10.2M
  for (k = 0; k < 4; k++) {
739
139M
    for (i = k; i < LEN_SUBFR; i += 4) {
740
131M
      psign = sign;
741
131M
      if (psign[i] < 0.0F) {
742
66.0M
        psign = vec;
743
66.0M
      }
744
131M
      j = (k + 1) % 4;
745
131M
      p0[0] = p0[0] * psign[j];
746
131M
      p0[1] = p0[1] * psign[j + 4];
747
131M
      p0[2] = p0[2] * psign[j + 8];
748
131M
      p0[3] = p0[3] * psign[j + 12];
749
131M
      p0[4] = p0[4] * psign[j + 16];
750
131M
      p0[5] = p0[5] * psign[j + 20];
751
131M
      p0[6] = p0[6] * psign[j + 24];
752
131M
      p0[7] = p0[7] * psign[j + 28];
753
131M
      p0[8] = p0[8] * psign[j + 32];
754
131M
      p0[9] = p0[9] * psign[j + 36];
755
131M
      p0[10] = p0[10] * psign[j + 40];
756
131M
      p0[11] = p0[11] * psign[j + 44];
757
131M
      p0[12] = p0[12] * psign[j + 48];
758
131M
      p0[13] = p0[13] * psign[j + 52];
759
131M
      p0[14] = p0[14] * psign[j + 56];
760
131M
      p0[15] = p0[15] * psign[j + 60];
761
131M
      p0 += 16;
762
131M
    }
763
8.21M
  }
764
2.05M
  psk = -1.0;
765
2.05M
  alpk = 1.0;
766
8.49M
  for (k = 0; k < num_iter; k++) {
767
35.3M
    for (i = 0; i < num_pulses - (num_pulses % 3); i += 3) {
768
28.9M
      ipos[i] = iusace_acelp_ipos[(k * 4) + i];
769
28.9M
      ipos[i + 1] = iusace_acelp_ipos[(k * 4) + i + 1];
770
28.9M
      ipos[i + 2] = iusace_acelp_ipos[(k * 4) + i + 2];
771
28.9M
    }
772
13.9M
    for (; i < num_pulses; i++) {
773
7.48M
      ipos[i] = iusace_acelp_ipos[(k * 4) + i];
774
7.48M
    }
775
776
6.44M
    if ((num_bits_cb == 20) | (num_bits_cb == 28) | (num_bits_cb == 12) | (num_bits_cb == 16)) {
777
0
      pos = 0;
778
0
      ps = 0.0F;
779
0
      alp = 0.0F;
780
0
      memset(vec, 0, LEN_SUBFR * sizeof(FLOAT32));
781
0
      if (num_bits_cb == 28) {
782
0
        ipos[4] = 0;
783
0
        ipos[5] = 1;
784
0
      }
785
786
0
      if (num_bits_cb == 16) {
787
0
        ipos[0] = 0;
788
0
        ipos[1] = 2;
789
0
        ipos[2] = 1;
790
0
        ipos[3] = 3;
791
0
      }
792
6.44M
    } else if ((num_bits_cb == 36) | (num_bits_cb == 44)) {
793
1.08M
      pos = 2;
794
1.08M
      pulse_pos[0] = pos_max[ipos[0]];
795
1.08M
      pulse_pos[1] = pos_max[ipos[1]];
796
1.08M
      ps = corr_input[pulse_pos[0]] + corr_input[pulse_pos[1]];
797
1.08M
      alp = corr_ir[ipos[0]][pulse_pos[0] >> 2] + corr_ir[ipos[1]][pulse_pos[1] >> 2] +
798
1.08M
            corr_p1p2[ipos[0]][((pulse_pos[0] >> 2) << 4) + (pulse_pos[1] >> 2)];
799
1.08M
      if (sign[pulse_pos[0]] < 0.0) {
800
554k
        p0 = ir_sign_inv - pulse_pos[0];
801
554k
      } else {
802
528k
        p0 = p1_ir_buf - pulse_pos[0];
803
528k
      }
804
1.08M
      if (sign[pulse_pos[1]] < 0.0) {
805
554k
        p1 = ir_sign_inv - pulse_pos[1];
806
554k
      } else {
807
528k
        p1 = p1_ir_buf - pulse_pos[1];
808
528k
      }
809
1.08M
      vec[0] = p0[0] + p1[0];
810
1.08M
      vec[1] = p0[1] + p1[1];
811
1.08M
      vec[2] = p0[2] + p1[2];
812
1.08M
      vec[3] = p0[3] + p1[3];
813
11.9M
      for (i = 4; i < LEN_SUBFR; i += 6) {
814
10.8M
        vec[i] = p0[i] + p1[i];
815
10.8M
        vec[i + 1] = p0[i + 1] + p1[i + 1];
816
10.8M
        vec[i + 2] = p0[i + 2] + p1[i + 2];
817
10.8M
        vec[i + 3] = p0[i + 3] + p1[i + 3];
818
10.8M
        vec[i + 4] = p0[i + 4] + p1[i + 4];
819
10.8M
        vec[i + 5] = p0[i + 5] + p1[i + 5];
820
10.8M
      }
821
1.08M
      if (num_bits_cb == 44) {
822
0
        ipos[8] = 0;
823
0
        ipos[9] = 1;
824
0
      }
825
5.36M
    } else {
826
5.36M
      pos = 4;
827
5.36M
      pulse_pos[0] = pos_max[ipos[0]];
828
5.36M
      pulse_pos[1] = pos_max[ipos[1]];
829
5.36M
      pulse_pos[2] = pos_max[ipos[2]];
830
5.36M
      pulse_pos[3] = pos_max[ipos[3]];
831
5.36M
      ps = corr_input[pulse_pos[0]] + corr_input[pulse_pos[1]] + corr_input[pulse_pos[2]] +
832
5.36M
           corr_input[pulse_pos[3]];
833
5.36M
      p0 = p1_ir_buf - pulse_pos[0];
834
5.36M
      if (sign[pulse_pos[0]] < 0.0) {
835
2.67M
        p0 = ir_sign_inv - pulse_pos[0];
836
2.67M
      }
837
5.36M
      p1 = p1_ir_buf - pulse_pos[1];
838
5.36M
      if (sign[pulse_pos[1]] < 0.0) {
839
2.68M
        p1 = ir_sign_inv - pulse_pos[1];
840
2.68M
      }
841
5.36M
      p2 = p1_ir_buf - pulse_pos[2];
842
5.36M
      if (sign[pulse_pos[2]] < 0.0) {
843
2.68M
        p2 = ir_sign_inv - pulse_pos[2];
844
2.68M
      }
845
5.36M
      p3 = p1_ir_buf - pulse_pos[3];
846
5.36M
      if (sign[pulse_pos[3]] < 0.0) {
847
2.67M
        p3 = ir_sign_inv - pulse_pos[3];
848
2.67M
      }
849
5.36M
      vec[0] = p0[0] + p1[0] + p2[0] + p3[0];
850
117M
      for (i = 1; i < LEN_SUBFR; i += 3) {
851
112M
        vec[i] = p0[i] + p1[i] + p2[i] + p3[i];
852
112M
        vec[i + 1] = p0[i + 1] + p1[i + 1] + p2[i + 1] + p3[i + 1];
853
112M
        vec[i + 2] = p0[i + 2] + p1[i + 2] + p2[i + 2] + p3[i + 2];
854
112M
      }
855
5.36M
      alp = 0.0F;
856
5.36M
      alp += vec[0] * vec[0] + vec[1] * vec[1];
857
5.36M
      alp += vec[2] * vec[2] + vec[3] * vec[3];
858
58.9M
      for (i = 4; i < LEN_SUBFR; i += 6) {
859
53.6M
        alp += vec[i] * vec[i];
860
53.6M
        alp += vec[i + 1] * vec[i + 1];
861
53.6M
        alp += vec[i + 2] * vec[i + 2];
862
53.6M
        alp += vec[i + 3] * vec[i + 3];
863
53.6M
        alp += vec[i + 4] * vec[i + 4];
864
53.6M
        alp += vec[i + 5] * vec[i + 5];
865
53.6M
      }
866
5.36M
      alp *= 0.5F;
867
5.36M
      if (num_bits_cb == 72) {
868
0
        ipos[16] = 0;
869
0
        ipos[17] = 1;
870
0
      }
871
5.36M
    }
872
873
41.7M
    for (j = pos, st = 0; j < num_pulses; j += 2, st++) {
874
35.3M
      if ((num_pulses - j) >= 2) {
875
35.3M
        iusace_acelp_ir_vec_corr1(p1_ir_buf, vec, ipos[j], sign, corr_ir, corr_x, dn2_pos,
876
35.3M
                                  num_pulse_position[st]);
877
35.3M
        iusace_acelp_ir_vec_corr2(p1_ir_buf, vec, ipos[j + 1], sign, corr_ir, corr_y);
878
879
35.3M
        iusace_acelp_get_2p_pos(num_pulse_position[st], ipos[j], ipos[j + 1], &ps, &alp,
880
35.3M
                                &pulse_pos[j], &pulse_pos[j + 1], corr_input, dn2_pos, corr_x,
881
35.3M
                                corr_y, corr_p1p2);
882
35.3M
      } else {
883
0
        iusace_acelp_ir_vec_corr2(p1_ir_buf, vec, ipos[j], sign, corr_ir, corr_x);
884
0
        iusace_acelp_ir_vec_corr2(p1_ir_buf, vec, ipos[j + 1], sign, corr_ir, corr_y);
885
0
        iusace_acelp_get_1p_pos(ipos[j], ipos[j + 1], &ps, &alp, &pulse_pos[j], corr_input,
886
0
                                corr_x, corr_y);
887
0
      }
888
35.3M
      if (j < (num_pulses - 2)) {
889
28.8M
        p0 = p1_ir_buf - pulse_pos[j];
890
28.8M
        if (sign[pulse_pos[j]] < 0.0) {
891
14.4M
          p0 = ir_sign_inv - pulse_pos[j];
892
14.4M
        }
893
28.8M
        p1 = p1_ir_buf - pulse_pos[j + 1];
894
28.8M
        if (sign[pulse_pos[j + 1]] < 0.0) {
895
14.4M
          p1 = ir_sign_inv - pulse_pos[j + 1];
896
14.4M
        }
897
28.8M
        vec[0] += p0[0] + p1[0];
898
28.8M
        vec[1] += p0[1] + p1[1];
899
28.8M
        vec[2] += p0[2] + p1[2];
900
28.8M
        vec[3] += p0[3] + p1[3];
901
317M
        for (i = 4; i < LEN_SUBFR; i += 6) {
902
288M
          vec[i] += p0[i] + p1[i];
903
288M
          vec[i + 1] += p0[i + 1] + p1[i + 1];
904
288M
          vec[i + 2] += p0[i + 2] + p1[i + 2];
905
288M
          vec[i + 3] += p0[i + 3] + p1[i + 3];
906
288M
          vec[i + 4] += p0[i + 4] + p1[i + 4];
907
288M
          vec[i + 5] += p0[i + 5] + p1[i + 5];
908
288M
        }
909
28.8M
      }
910
35.3M
    }
911
6.44M
    ps = ps * ps;
912
6.44M
    s = (alpk * ps) - (psk * alp);
913
6.44M
    if (s > 0.0F) {
914
3.73M
      psk = ps;
915
3.73M
      alpk = alp;
916
3.73M
      memcpy(codvec, pulse_pos, num_pulses * sizeof(WORD32));
917
3.73M
    }
918
6.44M
  }
919
920
2.05M
  memset(alg_cb_exc_out, 0, LEN_SUBFR * sizeof(WORD16));
921
2.05M
  memset(filt_cb_exc, 0, LEN_SUBFR * sizeof(FLOAT32));
922
2.05M
  memset(pulse_pos, 0xffffffff, NPMAXPT * 4 * sizeof(WORD32));
923
32.7M
  for (k = 0; k < num_pulses; k++) {
924
30.6M
    i = codvec[k];
925
30.6M
    val = sign[i];
926
30.6M
    index = i / 4;
927
30.6M
    track = i % 4;
928
30.6M
    if (val > 0) {
929
15.3M
      alg_cb_exc_out[i] += 512;
930
15.3M
      codvec[k] += (2 * LEN_SUBFR);
931
15.3M
    } else {
932
15.3M
      alg_cb_exc_out[i] -= 512;
933
15.3M
      index += 16;
934
15.3M
    }
935
30.6M
    i = track * NPMAXPT;
936
74.4M
    while (pulse_pos[i] >= 0) {
937
43.7M
      i++;
938
43.7M
    }
939
30.6M
    pulse_pos[i] = index;
940
30.6M
    p0 = ir_sign_inv - codvec[k];
941
30.6M
    filt_cb_exc[0] += p0[0];
942
674M
    for (i = 1; i < LEN_SUBFR; i += 3) {
943
643M
      filt_cb_exc[i] += p0[i];
944
643M
      filt_cb_exc[i + 1] += p0[i + 1];
945
643M
      filt_cb_exc[i + 2] += p0[i + 2];
946
643M
    }
947
30.6M
  }
948
949
2.05M
  if (num_bits_cb == ACELP_NUM_BITS_20) {
950
0
    for (track = 0; track < 4; track++) {
951
0
      k = track * NPMAXPT;
952
0
      acelp_param_out[track] = iusace_acelp_quant_1p_n1bits(pulse_pos[k], 4);
953
0
    }
954
2.05M
  } else if (num_bits_cb == ACELP_NUM_BITS_28) {
955
0
    for (track = 0; track < (4 - 2); track++) {
956
0
      k = track * NPMAXPT;
957
0
      acelp_param_out[track] = iusace_acelp_quant_2p_2n1bits(pulse_pos[k], pulse_pos[k + 1], 4);
958
0
    }
959
0
    for (track = 2; track < 4; track++) {
960
0
      k = track * NPMAXPT;
961
0
      acelp_param_out[track] = iusace_acelp_quant_1p_n1bits(pulse_pos[k], 4);
962
0
    }
963
2.05M
  } else if (num_bits_cb == ACELP_NUM_BITS_36) {
964
1.35M
    for (track = 0; track < 4; track++) {
965
1.08M
      k = track * NPMAXPT;
966
1.08M
      acelp_param_out[track] = iusace_acelp_quant_2p_2n1bits(pulse_pos[k], pulse_pos[k + 1], 4);
967
1.08M
    }
968
1.78M
  } else if (num_bits_cb == ACELP_NUM_BITS_44) {
969
0
    for (track = 0; track < (4 - 2); track++) {
970
0
      k = track * NPMAXPT;
971
0
      acelp_param_out[track] =
972
0
          iusace_acelp_quant_3p_3n1bits(pulse_pos[k], pulse_pos[k + 1], pulse_pos[k + 2], 4);
973
0
    }
974
0
    for (track = 2; track < 4; track++) {
975
0
      k = track * NPMAXPT;
976
0
      acelp_param_out[track] = iusace_acelp_quant_2p_2n1bits(pulse_pos[k], pulse_pos[k + 1], 4);
977
0
    }
978
1.78M
  } else if (num_bits_cb == ACELP_NUM_BITS_52) {
979
47.6k
    for (track = 0; track < 4; track++) {
980
38.0k
      k = track * NPMAXPT;
981
38.0k
      acelp_param_out[track] =
982
38.0k
          iusace_acelp_quant_3p_3n1bits(pulse_pos[k], pulse_pos[k + 1], pulse_pos[k + 2], 4);
983
38.0k
    }
984
1.77M
  } else if (num_bits_cb == ACELP_NUM_BITS_64) {
985
8.87M
    for (track = 0; track < 4; track++) {
986
7.09M
      k = track * NPMAXPT;
987
7.09M
      l_index = iusace_acelp_quant_4p_4nbits(&pulse_pos[k], 4);
988
7.09M
      acelp_param_out[track] = ((l_index >> 14) & 3);
989
7.09M
      acelp_param_out[track + 4] = (l_index & 0x3FFF);
990
7.09M
    }
991
1.77M
  } else if (num_bits_cb == ACELP_NUM_BITS_72) {
992
0
    for (track = 0; track < (4 - 2); track++) {
993
0
      k = track * NPMAXPT;
994
0
      l_index = iusace_acelp_quant_5p_5nbits(&pulse_pos[k], 4);
995
0
      acelp_param_out[track] = ((l_index >> 10) & 0x03FF);
996
0
      acelp_param_out[track + 4] = (l_index & 0x03FF);
997
0
    }
998
0
    for (track = 2; track < 4; track++) {
999
0
      k = track * NPMAXPT;
1000
0
      l_index = iusace_acelp_quant_4p_4nbits(&pulse_pos[k], 4);
1001
0
      acelp_param_out[track] = ((l_index >> 14) & 3);
1002
0
      acelp_param_out[track + 4] = (l_index & 0x3FFF);
1003
0
    }
1004
0
  } else if (num_bits_cb == ACELP_NUM_BITS_88) {
1005
0
    for (track = 0; track < 4; track++) {
1006
0
      k = track * NPMAXPT;
1007
0
      l_index = iusace_acelp_quant_6p_6n_2bits(&pulse_pos[k], 4);
1008
0
      acelp_param_out[track] = ((l_index >> 11) & 0x07FF);
1009
0
      acelp_param_out[track + 4] = (l_index & 0x07FF);
1010
0
    }
1011
0
  }
1012
2.05M
  return;
1013
2.05M
}
1014
1015
2.05M
VOID iusace_acelp_ltpred_cb_exc(FLOAT32 *exc, WORD32 t0, WORD32 t0_frac, WORD32 len_subfrm) {
1016
2.05M
  WORD32 i, j;
1017
2.05M
  FLOAT32 s, *x0, *x1, *x2;
1018
2.05M
  const FLOAT32 *c1, *c2;
1019
1020
2.05M
  x0 = &exc[-t0];
1021
2.05M
  t0_frac = -t0_frac;
1022
2.05M
  if (t0_frac < 0) {
1023
1.03M
    t0_frac += T_UP_SAMP;
1024
1.03M
    x0--;
1025
1.03M
  }
1026
135M
  for (j = 0; j < len_subfrm; j++) {
1027
133M
    x1 = x0++;
1028
133M
    x2 = x1 + 1;
1029
133M
    c1 = &iusace_res_interp_filter1_4[t0_frac];
1030
133M
    c2 = &iusace_res_interp_filter1_4[T_UP_SAMP - t0_frac];
1031
133M
    s = 0.0;
1032
2.27G
    for (i = 0; i < INTER_LP_FIL_ORDER; i++, c1 += T_UP_SAMP, c2 += T_UP_SAMP) {
1033
2.13G
      s += (*x1--) * (*c1) + (*x2++) * (*c2);
1034
2.13G
    }
1035
133M
    exc[j] = s;
1036
133M
  }
1037
2.05M
}
1038
1039
VOID iusace_acelp_quant_gain(FLOAT32 *code, FLOAT32 *pitch_gain, FLOAT32 *code_gain,
1040
2.05M
                             FLOAT32 *tgt_cb_corr_data, FLOAT32 mean_energy, WORD32 *qunt_idx) {
1041
2.05M
  WORD32 i, indice = 0, min_pitch_idx;
1042
2.05M
  FLOAT32 ener_code, pred_code_gain;
1043
2.05M
  FLOAT32 dist, dist_min, g_pitch, g_code;
1044
2.05M
  const FLOAT32 *p1_qua_gain_table, *p2_qua_gain_table;
1045
1046
2.05M
  p1_qua_gain_table = iusace_acelp_quant_gain_table;
1047
2.05M
  p2_qua_gain_table = (const FLOAT32 *)(iusace_acelp_quant_gain_table + ACELP_GAIN_TBL_OFFSET);
1048
2.05M
  min_pitch_idx = 0;
1049
2.05M
  g_pitch = *pitch_gain;
1050
133M
  for (i = 0; i < ACELP_RANGE_GAIN_PT_IDX_SEARCH; i++, p2_qua_gain_table += 2) {
1051
131M
    if (g_pitch > *p2_qua_gain_table) {
1052
39.3M
      continue;
1053
39.3M
    }
1054
131M
  }
1055
2.05M
  ener_code = 0.01F;
1056
1057
133M
  for (i = 0; i < LEN_SUBFR; i++) {
1058
131M
    ener_code += code[i] * code[i];
1059
131M
  }
1060
1061
2.05M
  ener_code = (FLOAT32)(10.0 * log10(ener_code / (FLOAT32)LEN_SUBFR));
1062
2.05M
  pred_code_gain = mean_energy - ener_code;
1063
2.05M
  pred_code_gain = (FLOAT32)pow(10.0, pred_code_gain / 20.0);
1064
1065
2.05M
  dist_min = MAX_FLT_VAL;
1066
2.05M
  p2_qua_gain_table = (const FLOAT32 *)(p1_qua_gain_table + min_pitch_idx * 2);
1067
265M
  for (i = 0; i < ACELP_SEARCH_RANGE_QUANTIZER_IDX; i++) {
1068
262M
    g_pitch = *p2_qua_gain_table++;
1069
262M
    g_code = pred_code_gain * *p2_qua_gain_table++;
1070
262M
    dist = g_pitch * g_pitch * tgt_cb_corr_data[0] + g_pitch * tgt_cb_corr_data[1] +
1071
262M
           g_code * g_code * tgt_cb_corr_data[2] + g_code * tgt_cb_corr_data[3] +
1072
262M
           g_pitch * g_code * tgt_cb_corr_data[4];
1073
262M
    if (dist < dist_min) {
1074
14.9M
      dist_min = dist;
1075
14.9M
      indice = i;
1076
14.9M
    }
1077
262M
  }
1078
2.05M
  indice += min_pitch_idx;
1079
2.05M
  *pitch_gain = p1_qua_gain_table[indice * 2];
1080
2.05M
  *code_gain = p1_qua_gain_table[indice * 2 + 1] * pred_code_gain;
1081
2.05M
  *qunt_idx = indice;
1082
2.05M
}