Coverage Report

Created: 2026-08-31 06:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aac/libAACdec/src/usacdec_lpc.cpp
Line
Count
Source
1
/* -----------------------------------------------------------------------------
2
Software License for The Fraunhofer FDK AAC Codec Library for Android
3
4
© Copyright  1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten
5
Forschung e.V. All rights reserved.
6
7
 1.    INTRODUCTION
8
The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9
that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10
scheme for digital audio. This FDK AAC Codec software is intended to be used on
11
a wide variety of Android devices.
12
13
AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14
general perceptual audio codecs. AAC-ELD is considered the best-performing
15
full-bandwidth communications codec by independent studies and is widely
16
deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17
specifications.
18
19
Patent licenses for necessary patent claims for the FDK AAC Codec (including
20
those of Fraunhofer) may be obtained through Via Licensing
21
(www.vialicensing.com) or through the respective patent owners individually for
22
the purpose of encoding or decoding bit streams in products that are compliant
23
with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24
Android devices already license these patent claims through Via Licensing or
25
directly from the patent owners, and therefore FDK AAC Codec software may
26
already be covered under those patent licenses when it is used for those
27
licensed purposes only.
28
29
Commercially-licensed AAC software libraries, including floating-point versions
30
with enhanced sound quality, are also available from Fraunhofer. Users are
31
encouraged to check the Fraunhofer website for additional applications
32
information and documentation.
33
34
2.    COPYRIGHT LICENSE
35
36
Redistribution and use in source and binary forms, with or without modification,
37
are permitted without payment of copyright license fees provided that you
38
satisfy the following conditions:
39
40
You must retain the complete text of this software license in redistributions of
41
the FDK AAC Codec or your modifications thereto in source code form.
42
43
You must retain the complete text of this software license in the documentation
44
and/or other materials provided with redistributions of the FDK AAC Codec or
45
your modifications thereto in binary form. You must make available free of
46
charge copies of the complete source code of the FDK AAC Codec and your
47
modifications thereto to recipients of copies in binary form.
48
49
The name of Fraunhofer may not be used to endorse or promote products derived
50
from this library without prior written permission.
51
52
You may not charge copyright license fees for anyone to use, copy or distribute
53
the FDK AAC Codec software or your modifications thereto.
54
55
Your modified versions of the FDK AAC Codec must carry prominent notices stating
56
that you changed the software and the date of any change. For modified versions
57
of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58
must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59
AAC Codec Library for Android."
60
61
3.    NO PATENT LICENSE
62
63
NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64
limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65
Fraunhofer provides no warranty of patent non-infringement with respect to this
66
software.
67
68
You may use this FDK AAC Codec software or modifications thereto only for
69
purposes that are authorized by appropriate patent licenses.
70
71
4.    DISCLAIMER
72
73
This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74
holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75
including but not limited to the implied warranties of merchantability and
76
fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77
CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78
or consequential damages, including but not limited to procurement of substitute
79
goods or services; loss of use, data, or profits, or business interruption,
80
however caused and on any theory of liability, whether in contract, strict
81
liability, or tort (including negligence), arising in any way out of the use of
82
this software, even if advised of the possibility of such damage.
83
84
5.    CONTACT INFORMATION
85
86
Fraunhofer Institute for Integrated Circuits IIS
87
Attention: Audio and Multimedia Departments - FDK AAC LL
88
Am Wolfsmantel 33
89
91058 Erlangen, Germany
90
91
www.iis.fraunhofer.de/amm
92
amm-info@iis.fraunhofer.de
93
----------------------------------------------------------------------------- */
94
95
/**************************** AAC decoder library ******************************
96
97
   Author(s):   Matthias Hildenbrand, Manuel Jander
98
99
   Description: USAC LPC/AVQ decode
100
101
*******************************************************************************/
102
103
#include "usacdec_lpc.h"
104
105
#include "usacdec_rom.h"
106
#include "FDK_trigFcts.h"
107
108
2.22M
#define NQ_MAX 36
109
110
/*
111
 * Helper functions.
112
 */
113
114
/**
115
 * \brief Read unary code.
116
 * \param hBs bitstream handle as data source.
117
 * \return decoded value.
118
 */
119
1.26M
static int get_vlclbf(HANDLE_FDK_BITSTREAM hBs) {
120
1.26M
  int result = 0;
121
122
1.97M
  while (FDKreadBits(hBs, 1) && result <= NQ_MAX) {
123
708k
    result++;
124
708k
  }
125
1.26M
  return result;
126
1.26M
}
127
128
/**
129
 * \brief Read bit count limited unary code.
130
 * \param hBs bitstream handle as data source
131
 * \param n max amount of bits to be read.
132
 * \return decoded value.
133
 */
134
73.5k
static int get_vlclbf_n(HANDLE_FDK_BITSTREAM hBs, int n) {
135
73.5k
  int result = 0;
136
137
108k
  while (FDKreadBits(hBs, 1)) {
138
45.6k
    result++;
139
45.6k
    n--;
140
45.6k
    if (n <= 0) {
141
10.7k
      break;
142
10.7k
    }
143
45.6k
  }
144
145
73.5k
  return result;
146
73.5k
}
147
148
/*
149
 * Algebraic Vector Quantizer
150
 */
151
152
/* ZF_SCALE must be greater than (number of FIXP_ZF)/2
153
   because the loss of precision caused by fPow2Div2 in RE8_PPV() */
154
//#define ZF_SCALE ((NQ_MAX-3)>>1)
155
7.08M
#define ZF_SCALE ((DFRACT_BITS / 2))
156
1.94M
#define FIXP_ZF FIXP_DBL
157
5.52M
#define INT2ZF(x, s) (FIXP_ZF)((x) << (ZF_SCALE - (s)))
158
1.55M
#define ZF2INT(x) (INT)((x) >> ZF_SCALE)
159
160
/* 1.0 in ZF format format */
161
2.33M
#define ONEZF ((FIXP_ZF)INT2ZF(1, 0))
162
163
/* static */
164
194k
void nearest_neighbor_2D8(FIXP_ZF x[8], int y[8]) {
165
194k
  FIXP_ZF s, em, e[8];
166
194k
  int i, j, sum;
167
168
  /* round x into 2Z^8 i.e. compute y=(y1,...,y8) such that yi = 2[xi/2]
169
     where [.] is the nearest integer operator
170
     in the mean time, compute sum = y1+...+y8
171
  */
172
194k
  sum = 0;
173
1.74M
  for (i = 0; i < 8; i++) {
174
1.55M
    FIXP_ZF tmp;
175
    /* round to ..., -2, 0, 2, ... ([-1..1[ --> 0) */
176
1.55M
    if (x[i] < (FIXP_ZF)0) {
177
492k
      tmp = ONEZF - x[i];
178
492k
      y[i] = -2 * ((ZF2INT(tmp)) >> 1);
179
1.06M
    } else {
180
1.06M
      tmp = ONEZF + x[i];
181
1.06M
      y[i] = 2 * ((ZF2INT(tmp)) >> 1);
182
1.06M
    }
183
1.55M
    sum += y[i];
184
1.55M
  }
185
  /* check if y1+...+y8 is a multiple of 4
186
     if not, y is not round xj in the wrong way where j is defined by
187
        j = arg max_i | xi -yi|
188
     (this is called the Wagner rule)
189
  */
190
194k
  if (sum % 4) {
191
    /* find j = arg max_i | xi -yi| */
192
107k
    em = (FIXP_SGL)0;
193
107k
    j = 0;
194
966k
    for (i = 0; i < 8; i++) {
195
      /* compute ei = xi-yi */
196
858k
      e[i] = x[i] - INT2ZF(y[i], 0);
197
858k
    }
198
966k
    for (i = 0; i < 8; i++) {
199
      /* compute |ei| = | xi-yi | */
200
858k
      if (e[i] < (FIXP_ZF)0) {
201
172k
        s = -e[i];
202
686k
      } else {
203
686k
        s = e[i];
204
686k
      }
205
      /* check if |ei| is maximal, if so, set j=i */
206
858k
      if (em < s) {
207
118k
        em = s;
208
118k
        j = i;
209
118k
      }
210
858k
    }
211
    /* round xj in the "wrong way" */
212
107k
    if (e[j] < (FIXP_ZF)0) {
213
55.3k
      y[j] -= 2;
214
55.3k
    } else {
215
51.9k
      y[j] += 2;
216
51.9k
    }
217
107k
  }
218
194k
}
219
220
/*--------------------------------------------------------------
221
  RE8_PPV(x,y)
222
  NEAREST NEIGHBOR SEARCH IN INFINITE LATTICE RE8
223
  the algorithm is based on the definition of RE8 as
224
      RE8 = (2D8) U (2D8+[1,1,1,1,1,1,1,1])
225
  it applies the coset decoding of Sloane and Conway
226
  (i) x: point in R^8 in 32-ZF_SCALE.ZF_SCALE format
227
  (o) y: point in RE8 (8-dimensional integer vector)
228
  --------------------------------------------------------------
229
*/
230
/* static */
231
97.2k
void RE8_PPV(FIXP_ZF x[], SHORT y[], int r) {
232
97.2k
  int i, y0[8], y1[8];
233
97.2k
  FIXP_ZF x1[8], tmp;
234
97.2k
  INT64 e;
235
236
  /* find the nearest neighbor y0 of x in 2D8 */
237
97.2k
  nearest_neighbor_2D8(x, y0);
238
  /* find the nearest neighbor y1 of x in 2D8+(1,...,1) (by coset decoding) */
239
874k
  for (i = 0; i < 8; i++) {
240
777k
    x1[i] = x[i] - ONEZF;
241
777k
  }
242
97.2k
  nearest_neighbor_2D8(x1, y1);
243
874k
  for (i = 0; i < 8; i++) {
244
777k
    y1[i] += 1;
245
777k
  }
246
247
  /* compute e0=||x-y0||^2 and e1=||x-y1||^2 */
248
97.2k
  e = 0;
249
874k
  for (i = 0; i < 8; i++) {
250
777k
    tmp = x[i] - INT2ZF(y0[i], 0);
251
777k
    e += (INT64)fPow2Div2(
252
777k
        tmp << r); /* shift left to ensure that no fract part bits get lost. */
253
777k
    tmp = x[i] - INT2ZF(y1[i], 0);
254
777k
    e -= (INT64)fPow2Div2(tmp << r);
255
777k
  }
256
  /* select best candidate y0 or y1 to minimize distortion */
257
97.2k
  if (e < 0) {
258
650k
    for (i = 0; i < 8; i++) {
259
577k
      y[i] = y0[i];
260
577k
    }
261
72.2k
  } else {
262
224k
    for (i = 0; i < 8; i++) {
263
199k
      y[i] = y1[i];
264
199k
    }
265
24.9k
  }
266
97.2k
}
267
268
/* table look-up of unsigned value: find i where index >= table[i]
269
   Note: range must be >= 2, index must be >= table[0] */
270
1.13M
static int table_lookup(const USHORT *table, unsigned int index, int range) {
271
1.13M
  int i;
272
273
1.45M
  for (i = 4; i < range; i += 4) {
274
1.28M
    if (index < table[i]) {
275
966k
      break;
276
966k
    }
277
1.28M
  }
278
1.13M
  if (i > range) {
279
120k
    i = range;
280
120k
  }
281
282
1.13M
  if (index < table[i - 2]) {
283
716k
    i -= 2;
284
716k
  }
285
1.13M
  if (index < table[i - 1]) {
286
620k
    i--;
287
620k
  }
288
1.13M
  i--;
289
290
1.13M
  return (i); /* index >= table[i] */
291
1.13M
}
292
293
/*--------------------------------------------------------------------------
294
  re8_decode_rank_of_permutation(rank, xs, x)
295
  DECODING OF THE RANK OF THE PERMUTATION OF xs
296
  (i) rank: index (rank) of a permutation
297
  (i) xs:   signed leader in RE8 (8-dimensional integer vector)
298
  (o) x:    point in RE8 (8-dimensional integer vector)
299
  --------------------------------------------------------------------------
300
 */
301
567k
static void re8_decode_rank_of_permutation(int rank, int *xs, SHORT x[8]) {
302
567k
  INT a[8], w[8], B, fac, fac_B, target;
303
567k
  int i, j;
304
305
  /* --- pre-processing based on the signed leader xs ---
306
     - compute the alphabet a=[a[0] ... a[q-1]] of x (q elements)
307
       such that a[0]!=...!=a[q-1]
308
       it is assumed that xs is sorted in the form of a signed leader
309
       which can be summarized in 2 requirements:
310
          a) |xs[0]| >= |xs[1]| >= |xs[2]| >= ... >= |xs[7]|
311
          b) if |xs[i]|=|xs[i-1]|, xs[i]>=xs[i+1]
312
       where |.| indicates the absolute value operator
313
     - compute q (the number of symbols in the alphabet)
314
     - compute w[0..q-1] where w[j] counts the number of occurences of
315
       the symbol a[j] in xs
316
     - compute B = prod_j=0..q-1 (w[j]!) where .! is the factorial */
317
  /* xs[i], xs[i-1] and ptr_w/a*/
318
567k
  j = 0;
319
567k
  w[j] = 1;
320
567k
  a[j] = xs[0];
321
567k
  B = 1;
322
4.54M
  for (i = 1; i < 8; i++) {
323
3.97M
    if (xs[i] != xs[i - 1]) {
324
858k
      j++;
325
858k
      w[j] = 1;
326
858k
      a[j] = xs[i];
327
3.11M
    } else {
328
3.11M
      w[j]++;
329
3.11M
      B *= w[j];
330
3.11M
    }
331
3.97M
  }
332
333
  /* --- actual rank decoding ---
334
     the rank of x (where x is a permutation of xs) is based on
335
     Schalkwijk's formula
336
     it is given by rank=sum_{k=0..7} (A_k * fac_k/B_k)
337
     the decoding of this rank is sequential and reconstructs x[0..7]
338
     element by element from x[0] to x[7]
339
     [the tricky part is the inference of A_k for each k...]
340
   */
341
342
567k
  if (w[0] == 8) {
343
509k
    for (i = 0; i < 8; i++) {
344
452k
      x[i] = a[0]; /* avoid fac of 40320 */
345
452k
    }
346
511k
  } else {
347
511k
    target = rank * B;
348
511k
    fac_B = 1;
349
    /* decode x element by element */
350
4.60M
    for (i = 0; i < 8; i++) {
351
4.09M
      fac = fac_B * fdk_dec_tab_factorial[i]; /* fac = 1..5040 */
352
4.09M
      j = -1;
353
8.29M
      do {
354
8.29M
        target -= w[++j] * fac;
355
8.29M
      } while (target >= 0); /* max of 30 tests / SV */
356
4.09M
      x[i] = a[j];
357
      /* update rank, denominator B (B_k) and counter w[j] */
358
4.09M
      target += w[j] * fac; /* target = fac_B*B*rank */
359
4.09M
      fac_B *= w[j];
360
4.09M
      w[j]--;
361
4.09M
    }
362
511k
  }
363
567k
}
364
365
/*--------------------------------------------------------------------------
366
  re8_decode_base_index(n, I, y)
367
  DECODING OF AN INDEX IN Qn (n=0,2,3 or 4)
368
  (i) n: codebook number (*n is an integer defined in {0,2,3,4})
369
  (i) I: index of c (pointer to unsigned 16-bit word)
370
  (o) y: point in RE8 (8-dimensional integer vector)
371
  note: the index I is defined as a 32-bit word, but only
372
  16 bits are required (long can be replaced by unsigned integer)
373
  --------------------------------------------------------------------------
374
 */
375
1.51M
static void re8_decode_base_index(int *n, UINT index, SHORT y[8]) {
376
1.51M
  int i, im, t, sign_code, ka, ks, rank, leader[8];
377
378
1.51M
  if (*n < 2) {
379
8.49M
    for (i = 0; i < 8; i++) {
380
7.55M
      y[i] = 0;
381
7.55M
    }
382
944k
  } else {
383
    // index = (unsigned int)*I;
384
    /* search for the identifier ka of the absolute leader (table-lookup)
385
       Q2 is a subset of Q3 - the two cases are considered in the same branch
386
     */
387
567k
    switch (*n) {
388
279k
      case 2:
389
442k
      case 3:
390
442k
        i = table_lookup(fdk_dec_I3, index, NB_LDQ3);
391
442k
        ka = fdk_dec_A3[i];
392
442k
        break;
393
125k
      case 4:
394
125k
        i = table_lookup(fdk_dec_I4, index, NB_LDQ4);
395
125k
        ka = fdk_dec_A4[i];
396
125k
        break;
397
0
      default:
398
0
        FDK_ASSERT(0);
399
0
        return;
400
567k
    }
401
    /* reconstruct the absolute leader */
402
5.11M
    for (i = 0; i < 8; i++) {
403
4.54M
      leader[i] = fdk_dec_Da[ka][i];
404
4.54M
    }
405
    /* search for the identifier ks of the signed leader (table look-up)
406
       (this search is focused based on the identifier ka of the absolute
407
        leader)*/
408
567k
    t = fdk_dec_Ia[ka];
409
567k
    im = fdk_dec_Ns[ka];
410
567k
    ks = table_lookup(fdk_dec_Is + t, index, im);
411
412
    /* reconstruct the signed leader from its sign code */
413
567k
    sign_code = 2 * fdk_dec_Ds[t + ks];
414
5.11M
    for (i = 7; i >= 0; i--) {
415
4.54M
      leader[i] *= (1 - (sign_code & 2));
416
4.54M
      sign_code >>= 1;
417
4.54M
    }
418
419
    /* compute and decode the rank of the permutation */
420
567k
    rank = index - fdk_dec_Is[t + ks]; /* rank = index - cardinality offset */
421
422
567k
    re8_decode_rank_of_permutation(rank, leader, y);
423
567k
  }
424
1.51M
  return;
425
1.51M
}
426
427
/* re8_y2k(y,m,k)
428
   VORONOI INDEXING (INDEX DECODING) k -> y
429
   (i) k: Voronoi index k[0..7]
430
   (i) m: Voronoi modulo (m = 2^r = 1<<r, where r is integer >=2)
431
   (i) r: Voronoi order  (m = 2^r = 1<<r, where r is integer >=2)
432
   (o) y: 8-dimensional point y[0..7] in RE8
433
 */
434
97.2k
static void re8_k2y(int *k, int r, SHORT *y) {
435
97.2k
  int i, tmp, sum;
436
97.2k
  SHORT v[8];
437
97.2k
  FIXP_ZF zf[8];
438
439
97.2k
  FDK_ASSERT(r <= ZF_SCALE);
440
441
  /* compute y = k M and z=(y-a)/m, where
442
     M = [4        ]
443
         [2 2      ]
444
         [|   \    ]
445
         [2     2  ]
446
         [1 1 _ 1 1]
447
     a=(2,0,...,0)
448
     m = 1<<r
449
  */
450
874k
  for (i = 0; i < 8; i++) {
451
777k
    y[i] = k[7];
452
777k
  }
453
97.2k
  zf[7] = INT2ZF(y[7], r);
454
97.2k
  sum = 0;
455
680k
  for (i = 6; i >= 1; i--) {
456
583k
    tmp = 2 * k[i];
457
583k
    sum += tmp;
458
583k
    y[i] += tmp;
459
583k
    zf[i] = INT2ZF(y[i], r);
460
583k
  }
461
97.2k
  y[0] += (4 * k[0] + sum);
462
97.2k
  zf[0] = INT2ZF(y[0] - 2, r);
463
  /* find nearest neighbor v of z in infinite RE8 */
464
97.2k
  RE8_PPV(zf, v, r);
465
  /* compute y -= m v */
466
874k
  for (i = 0; i < 8; i++) {
467
777k
    y[i] -= (SHORT)(v[i] << r);
468
777k
  }
469
97.2k
}
470
471
/*--------------------------------------------------------------------------
472
  RE8_dec(n, I, k, y)
473
  MULTI-RATE INDEXING OF A POINT y in THE LATTICE RE8 (INDEX DECODING)
474
  (i) n: codebook number (*n is an integer defined in {0,2,3,4,..,n_max}). n_max
475
  = 36 (i) I: index of c (pointer to unsigned 16-bit word) (i) k: index of v
476
  (8-dimensional vector of binary indices) = Voronoi index (o) y: point in RE8
477
  (8-dimensional integer vector) note: the index I is defined as a 32-bit word,
478
  but only 16 bits are required (long can be replaced by unsigned integer)
479
480
  return 0 on success, -1 on error.
481
  --------------------------------------------------------------------------
482
 */
483
1.51M
static int RE8_dec(int n, int I, int *k, FIXP_DBL *y) {
484
1.51M
  SHORT v[8];
485
1.51M
  SHORT _y[8];
486
1.51M
  UINT r;
487
1.51M
  int i;
488
489
  /* Check bound of codebook qn */
490
1.51M
  if (n > NQ_MAX) {
491
233
    return -1;
492
233
  }
493
494
  /* decode the sub-indices I and kv[] according to the codebook number n:
495
     if n=0,2,3,4, decode I (no Voronoi extension)
496
     if n>4, Voronoi extension is used, decode I and kv[] */
497
1.51M
  if (n <= 4) {
498
1.41M
    re8_decode_base_index(&n, I, _y);
499
12.7M
    for (i = 0; i < 8; i++) {
500
11.3M
      y[i] = (LONG)_y[i];
501
11.3M
    }
502
1.41M
  } else {
503
    /* compute the Voronoi modulo m = 2^r where r is extension order */
504
97.2k
    r = ((n - 3) >> 1);
505
506
245k
    while (n > 4) {
507
148k
      n -= 2;
508
148k
    }
509
    /* decode base codebook index I into c (c is an element of Q3 or Q4)
510
       [here c is stored in y to save memory] */
511
97.2k
    re8_decode_base_index(&n, I, _y);
512
    /* decode Voronoi index k[] into v */
513
97.2k
    re8_k2y(k, r, v);
514
    /* reconstruct y as y = m c + v (with m=2^r, r integer >=1) */
515
874k
    for (i = 0; i < 8; i++) {
516
777k
      y[i] = (LONG)((_y[i] << r) + v[i]);
517
777k
    }
518
97.2k
  }
519
1.51M
  return 0;
520
1.51M
}
521
522
/**************************/
523
/* start LPC decode stuff */
524
/**************************/
525
//#define M         16
526
#define FREQ_MAX 6400.0f
527
#define FREQ_DIV 400.0f
528
#define LSF_GAP 50.0f
529
530
/**
531
 * \brief calculate inverse weighting factor and add non-weighted residual
532
 *        LSF vector to first stage LSF approximation
533
 * \param lsfq first stage LSF approximation values.
534
 * \param xq weighted residual LSF vector
535
 * \param nk_mode code book number coding mode.
536
 */
537
177k
static void lsf_weight_2st(FIXP_LPC *lsfq, FIXP_DBL *xq, int nk_mode) {
538
177k
  FIXP_LPC d[M_LP_FILTER_ORDER + 1];
539
177k
  FIXP_SGL factor;
540
177k
  LONG w; /* inverse weight factor */
541
177k
  int i;
542
543
  /* compute lsf distance */
544
177k
  d[0] = lsfq[0];
545
177k
  d[M_LP_FILTER_ORDER] =
546
177k
      FL2FXCONST_LPC(FREQ_MAX / (1 << LSF_SCALE)) - lsfq[M_LP_FILTER_ORDER - 1];
547
2.83M
  for (i = 1; i < M_LP_FILTER_ORDER; i++) {
548
2.65M
    d[i] = lsfq[i] - lsfq[i - 1];
549
2.65M
  }
550
551
177k
  switch (nk_mode) {
552
95.5k
    case 0:
553
95.5k
      factor = FL2FXCONST_SGL(2.0f * 60.0f / FREQ_DIV);
554
95.5k
      break; /* abs */
555
29.2k
    case 1:
556
29.2k
      factor = FL2FXCONST_SGL(2.0f * 65.0f / FREQ_DIV);
557
29.2k
      break; /* mid */
558
24.5k
    case 2:
559
24.5k
      factor = FL2FXCONST_SGL(2.0f * 64.0f / FREQ_DIV);
560
24.5k
      break; /* rel1 */
561
27.8k
    default:
562
27.8k
      factor = FL2FXCONST_SGL(2.0f * 63.0f / FREQ_DIV);
563
27.8k
      break; /* rel2 */
564
177k
  }
565
  /* add non-weighted residual LSF vector to LSF1st */
566
3.01M
  for (i = 0; i < M_LP_FILTER_ORDER; i++) {
567
2.83M
    w = (LONG)fMultDiv2(factor, sqrtFixp(fMult(d[i], d[i + 1])));
568
2.83M
    lsfq[i] = fAddSaturate(lsfq[i],
569
2.83M
                           FX_DBL2FX_LPC((FIXP_DBL)((INT64)w * (LONG)xq[i])));
570
2.83M
  }
571
572
177k
  return;
573
177k
}
574
575
/**
576
 * \brief decode nqn amount of code book numbers. These values determine the
577
 * amount of following bits for nqn AVQ RE8 vectors.
578
 * \param nk_mode quantization mode.
579
 * \param nqn amount code book number to read.
580
 * \param qn pointer to output buffer to hold decoded code book numbers qn.
581
 */
582
static void decode_qn(HANDLE_FDK_BITSTREAM hBs, int nk_mode, int nqn,
583
1.33M
                      int qn[]) {
584
1.33M
  int n;
585
586
1.33M
  if (nk_mode == 1) { /* nk mode 1 */
587
    /* Unary code for mid LPC1/LPC3 */
588
    /* Q0=0, Q2=10, Q3=110, ... */
589
2.40M
    for (n = 0; n < nqn; n++) {
590
1.21M
      qn[n] = get_vlclbf(hBs);
591
1.21M
      if (qn[n] > 0) {
592
278k
        qn[n]++;
593
278k
      }
594
1.21M
    }
595
1.18M
  } else { /* nk_mode 0, 3 and 2 */
596
    /* 2 bits to specify Q2,Q3,Q4,ext */
597
444k
    for (n = 0; n < nqn; n++) {
598
296k
      qn[n] = 2 + FDKreadBits(hBs, 2);
599
296k
    }
600
148k
    if (nk_mode == 2) {
601
      /* Unary code for rel LPC1/LPC3 */
602
      /* Q0 = 0, Q5=10, Q6=110, ... */
603
73.6k
      for (n = 0; n < nqn; n++) {
604
49.1k
        if (qn[n] > 4) {
605
6.00k
          qn[n] = get_vlclbf(hBs);
606
6.00k
          if (qn[n] > 0) qn[n] += 4;
607
6.00k
        }
608
49.1k
      }
609
123k
    } else { /* nk_mode == (0 and 3) */
610
      /* Unary code for abs and rel LPC0/LPC2 */
611
      /* Q5 = 0, Q6=10, Q0=110, Q7=1110, ... */
612
370k
      for (n = 0; n < nqn; n++) {
613
246k
        if (qn[n] > 4) {
614
46.3k
          qn[n] = get_vlclbf(hBs);
615
46.3k
          switch (qn[n]) {
616
26.5k
            case 0:
617
26.5k
              qn[n] = 5;
618
26.5k
              break;
619
7.32k
            case 1:
620
7.32k
              qn[n] = 6;
621
7.32k
              break;
622
3.49k
            case 2:
623
3.49k
              qn[n] = 0;
624
3.49k
              break;
625
9.02k
            default:
626
9.02k
              qn[n] += 4;
627
9.02k
              break;
628
46.3k
          }
629
46.3k
        }
630
246k
      }
631
123k
    }
632
148k
  }
633
1.33M
}
634
635
/**
636
 * \brief reorder LSF coefficients to minimum distance.
637
 * \param lsf pointer to buffer containing LSF coefficients and where reordered
638
 * LSF coefficients will be stored into, scaled by LSF_SCALE.
639
 * \param min_dist min distance scaled by LSF_SCALE
640
 * \param n number of LSF/LSP coefficients.
641
 */
642
177k
static void reorder_lsf(FIXP_LPC *lsf, FIXP_LPC min_dist, int n) {
643
177k
  FIXP_LPC lsf_min;
644
177k
  int i;
645
646
177k
  lsf_min = min_dist;
647
3.01M
  for (i = 0; i < n; i++) {
648
2.83M
    if (lsf[i] < lsf_min) {
649
122k
      lsf[i] = lsf_min;
650
122k
    }
651
2.83M
    lsf_min = fAddSaturate(lsf[i], min_dist);
652
2.83M
  }
653
654
  /* reverse */
655
177k
  lsf_min = FL2FXCONST_LPC(FREQ_MAX / (1 << LSF_SCALE)) - min_dist;
656
3.01M
  for (i = n - 1; i >= 0; i--) {
657
2.83M
    if (lsf[i] > lsf_min) {
658
18.6k
      lsf[i] = lsf_min;
659
18.6k
    }
660
661
2.83M
    lsf_min = lsf[i] - min_dist;
662
2.83M
  }
663
177k
}
664
665
/**
666
 * \brief First stage approximation
667
 * \param hBs bitstream handle as data source
668
 * \param lsfq pointer to output buffer to hold LPC coefficients scaled by
669
 * LSF_SCALE.
670
 */
671
static void vlpc_1st_dec(
672
    HANDLE_FDK_BITSTREAM hBs, /* input:  codebook index                  */
673
    FIXP_LPC *lsfq            /* i/o:    i:prediction   o:quantized lsf  */
674
95.5k
) {
675
95.5k
  const FIXP_LPC *p_dico;
676
95.5k
  int i, index;
677
678
95.5k
  index = FDKreadBits(hBs, 8);
679
95.5k
  p_dico = &fdk_dec_dico_lsf_abs_8b[index * M_LP_FILTER_ORDER];
680
1.62M
  for (i = 0; i < M_LP_FILTER_ORDER; i++) {
681
1.52M
    lsfq[i] = p_dico[i];
682
1.52M
  }
683
95.5k
}
684
685
/**
686
 * \brief Do first stage approximation weighting and multiply with AVQ
687
 * refinement.
688
 * \param hBs bitstream handle data ssource.
689
 * \param lsfq buffer holding 1st stage approx, 2nd stage approx is added to
690
 * this values.
691
 * \param nk_mode quantization mode.
692
 * \return 0 on success, -1 on error.
693
 */
694
static int vlpc_2st_dec(
695
    HANDLE_FDK_BITSTREAM hBs,
696
    FIXP_LPC *lsfq, /* i/o:    i:1st stage   o:1st+2nd stage   */
697
    int nk_mode     /* input:  0=abs, >0=rel                   */
698
177k
) {
699
177k
  int err;
700
177k
  FIXP_DBL xq[M_LP_FILTER_ORDER]; /* weighted residual LSF vector */
701
702
  /* Decode AVQ refinement */
703
177k
  { err = CLpc_DecodeAVQ(hBs, xq, nk_mode, 2, 8); }
704
177k
  if (err != 0) {
705
16
    return -1;
706
16
  }
707
708
  /* add non-weighted residual LSF vector to LSF1st */
709
177k
  lsf_weight_2st(lsfq, xq, nk_mode);
710
711
  /* reorder */
712
177k
  reorder_lsf(lsfq, FL2FXCONST_LPC(LSF_GAP / (1 << LSF_SCALE)),
713
177k
              M_LP_FILTER_ORDER);
714
715
177k
  return 0;
716
177k
}
717
718
/*
719
 * Externally visible functions
720
 */
721
722
int CLpc_DecodeAVQ(HANDLE_FDK_BITSTREAM hBs, FIXP_DBL *pOutput, int nk_mode,
723
273k
                   int no_qn, int length) {
724
273k
  int i, l;
725
726
1.60M
  for (i = 0; i < length; i += 8 * no_qn) {
727
1.33M
    int qn[2], nk, n, I;
728
1.33M
    int kv[8] = {0};
729
730
1.33M
    decode_qn(hBs, nk_mode, no_qn, qn);
731
732
2.84M
    for (l = 0; l < no_qn; l++) {
733
1.51M
      if (qn[l] == 0) {
734
944k
        FDKmemclear(&pOutput[i + l * 8], 8 * sizeof(FIXP_DBL));
735
944k
      }
736
737
      /* Voronoi extension order ( nk ) */
738
1.51M
      nk = 0;
739
1.51M
      n = qn[l];
740
1.51M
      if (qn[l] > 4) {
741
97.4k
        nk = (qn[l] - 3) >> 1;
742
97.4k
        n = qn[l] - nk * 2;
743
97.4k
      }
744
745
      /* Base codebook index, in reverse bit group order (!) */
746
1.51M
      I = FDKreadBits(hBs, 4 * n);
747
748
1.51M
      if (nk > 0) {
749
97.4k
        int j;
750
751
877k
        for (j = 0; j < 8; j++) {
752
779k
          kv[j] = FDKreadBits(hBs, nk);
753
779k
        }
754
97.4k
      }
755
756
1.51M
      if (RE8_dec(qn[l], I, kv, &pOutput[i + l * 8]) != 0) {
757
233
        return -1;
758
233
      }
759
1.51M
    }
760
1.33M
  }
761
273k
  return 0;
762
273k
}
763
764
int CLpc_Read(HANDLE_FDK_BITSTREAM hBs, FIXP_LPC lsp[][M_LP_FILTER_ORDER],
765
              FIXP_LPC lpc4_lsf[M_LP_FILTER_ORDER],
766
              FIXP_LPC lsf_adaptive_mean_cand[M_LP_FILTER_ORDER],
767
              FIXP_SGL pStability[], UCHAR *mod, int first_lpd_flag,
768
47.1k
              int last_lpc_lost, int last_frame_ok) {
769
47.1k
  int i, k, err;
770
47.1k
  int mode_lpc_bin = 0; /* mode_lpc bitstream representation */
771
47.1k
  int lpc_present[5] = {0, 0, 0, 0, 0};
772
47.1k
  int lpc0_available = 1;
773
47.1k
  int s = 0;
774
47.1k
  int l = 3;
775
47.1k
  const int nbDiv = NB_DIV;
776
777
47.1k
  lpc_present[4 >> s] = 1; /* LPC4 */
778
779
  /* Decode LPC filters in the following order: LPC 4,0,2,1,3 */
780
781
  /*** Decode LPC4 ***/
782
47.1k
  vlpc_1st_dec(hBs, lsp[4 >> s]);
783
47.1k
  err = vlpc_2st_dec(hBs, lsp[4 >> s], 0); /* nk_mode = 0 */
784
47.1k
  if (err != 0) {
785
3
    return err;
786
3
  }
787
788
  /*** Decode LPC0 and LPC2 ***/
789
47.1k
  k = 0;
790
47.1k
  if (!first_lpd_flag) {
791
29.6k
    lpc_present[0] = 1;
792
29.6k
    lpc0_available = !last_lpc_lost;
793
    /* old LPC4 is new LPC0 */
794
503k
    for (i = 0; i < M_LP_FILTER_ORDER; i++) {
795
474k
      lsp[0][i] = lpc4_lsf[i];
796
474k
    }
797
    /* skip LPC0 and continue with LPC2 */
798
29.6k
    k = 2;
799
29.6k
  }
800
801
111k
  for (; k < l; k += 2) {
802
64.6k
    int nk_mode = 0;
803
804
64.6k
    if ((k == 2) && (mod[0] == 3)) {
805
480
      break; /* skip LPC2 */
806
480
    }
807
808
64.1k
    lpc_present[k >> s] = 1;
809
810
64.1k
    mode_lpc_bin = FDKreadBit(hBs);
811
812
64.1k
    if (mode_lpc_bin == 0) {
813
      /* LPC0/LPC2: Abs */
814
36.2k
      vlpc_1st_dec(hBs, lsp[k >> s]);
815
36.2k
    } else {
816
      /* LPC0/LPC2: RelR */
817
474k
      for (i = 0; i < M_LP_FILTER_ORDER; i++) {
818
446k
        lsp[k >> s][i] = lsp[4 >> s][i];
819
446k
      }
820
27.9k
      nk_mode = 3;
821
27.9k
    }
822
823
64.1k
    err = vlpc_2st_dec(hBs, lsp[k >> s], nk_mode);
824
64.1k
    if (err != 0) {
825
6
      return err;
826
6
    }
827
64.1k
  }
828
829
  /*** Decode LPC1 ***/
830
47.1k
  if (mod[0] < 2) { /* else: skip LPC1 */
831
29.1k
    lpc_present[1] = 1;
832
29.1k
    mode_lpc_bin = get_vlclbf_n(hBs, 2);
833
834
29.1k
    switch (mode_lpc_bin) {
835
4.60k
      case 1:
836
        /* LPC1: abs */
837
4.60k
        vlpc_1st_dec(hBs, lsp[1]);
838
4.60k
        err = vlpc_2st_dec(hBs, lsp[1], 0);
839
4.60k
        if (err != 0) {
840
1
          return err;
841
1
        }
842
4.60k
        break;
843
7.55k
      case 2:
844
        /* LPC1: mid0 (no second stage AVQ quantizer in this case) */
845
7.55k
        if (lpc0_available) { /* LPC0/lsf[0] might be zero some times */
846
128k
          for (i = 0; i < M_LP_FILTER_ORDER; i++) {
847
120k
            lsp[1][i] = (lsp[0][i] >> 1) + (lsp[2][i] >> 1);
848
120k
          }
849
7.55k
        } else {
850
17
          for (i = 0; i < M_LP_FILTER_ORDER; i++) {
851
16
            lsp[1][i] = lsp[2][i];
852
16
          }
853
1
        }
854
7.55k
        break;
855
16.9k
      case 0:
856
        /* LPC1: RelR */
857
288k
        for (i = 0; i < M_LP_FILTER_ORDER; i++) {
858
271k
          lsp[1][i] = lsp[2][i];
859
271k
        }
860
16.9k
        err = vlpc_2st_dec(hBs, lsp[1], 2 << s);
861
16.9k
        if (err != 0) {
862
1
          return err;
863
1
        }
864
16.9k
        break;
865
29.1k
    }
866
29.1k
  }
867
868
  /*** Decode LPC3 ***/
869
47.1k
  if ((mod[2] < 2)) { /* else: skip LPC3 */
870
44.4k
    int nk_mode = 0;
871
44.4k
    lpc_present[3] = 1;
872
873
44.4k
    mode_lpc_bin = get_vlclbf_n(hBs, 3);
874
875
44.4k
    switch (mode_lpc_bin) {
876
7.58k
      case 1:
877
        /* LPC3: abs */
878
7.58k
        vlpc_1st_dec(hBs, lsp[3]);
879
7.58k
        break;
880
29.2k
      case 0:
881
        /* LPC3: mid */
882
497k
        for (i = 0; i < M_LP_FILTER_ORDER; i++) {
883
468k
          lsp[3][i] = (lsp[2][i] >> 1) + (lsp[4][i] >> 1);
884
468k
        }
885
29.2k
        nk_mode = 1;
886
29.2k
        break;
887
4.32k
      case 2:
888
        /* LPC3: relL */
889
73.5k
        for (i = 0; i < M_LP_FILTER_ORDER; i++) {
890
69.2k
          lsp[3][i] = lsp[2][i];
891
69.2k
        }
892
4.32k
        nk_mode = 2;
893
4.32k
        break;
894
3.23k
      case 3:
895
        /* LPC3: relR */
896
54.9k
        for (i = 0; i < M_LP_FILTER_ORDER; i++) {
897
51.6k
          lsp[3][i] = lsp[4][i];
898
51.6k
        }
899
3.23k
        nk_mode = 2;
900
3.23k
        break;
901
44.4k
    }
902
44.4k
    err = vlpc_2st_dec(hBs, lsp[3], nk_mode);
903
44.4k
    if (err != 0) {
904
5
      return err;
905
5
    }
906
44.4k
  }
907
908
47.1k
  if (!lpc0_available && !last_frame_ok) {
909
    /* LPC(0) was lost. Use next available LPC(k) instead */
910
0
    for (k = 1; k < (nbDiv + 1); k++) {
911
0
      if (lpc_present[k]) {
912
0
        for (i = 0; i < M_LP_FILTER_ORDER; i++) {
913
0
#define LSF_INIT_TILT (0.25f)
914
0
          if (mod[0] > 0) {
915
0
            lsp[0][i] = FX_DBL2FX_LPC(
916
0
                fMult(lsp[k][i], FL2FXCONST_SGL(1.0f - LSF_INIT_TILT)) +
917
0
                fMult(fdk_dec_lsf_init[i], FL2FXCONST_SGL(LSF_INIT_TILT)));
918
0
          } else {
919
0
            lsp[0][i] = lsp[k][i];
920
0
          }
921
0
        }
922
0
        break;
923
0
      }
924
0
    }
925
0
  }
926
927
800k
  for (i = 0; i < M_LP_FILTER_ORDER; i++) {
928
753k
    lpc4_lsf[i] = lsp[4 >> s][i];
929
753k
  }
930
931
47.1k
  {
932
47.1k
    FIXP_DBL divFac;
933
47.1k
    int last, numLpc = 0;
934
935
47.1k
    i = nbDiv;
936
144k
    do {
937
144k
      numLpc += lpc_present[i--];
938
144k
    } while (i >= 0 && numLpc < 3);
939
940
47.1k
    last = i;
941
942
47.1k
    switch (numLpc) {
943
46.6k
      case 3:
944
46.6k
        divFac = FL2FXCONST_DBL(1.0f / 3.0f);
945
46.6k
        break;
946
480
      case 2:
947
480
        divFac = FL2FXCONST_DBL(1.0f / 2.0f);
948
480
        break;
949
0
      default:
950
0
        divFac = FL2FXCONST_DBL(1.0f);
951
0
        break;
952
47.1k
    }
953
954
    /* get the adaptive mean for the next (bad) frame */
955
800k
    for (k = 0; k < M_LP_FILTER_ORDER; k++) {
956
753k
      FIXP_DBL tmp = (FIXP_DBL)0;
957
3.07M
      for (i = nbDiv; i > last; i--) {
958
2.31M
        if (lpc_present[i]) {
959
2.25M
          tmp = fMultAdd(tmp >> 1, lsp[i][k], divFac);
960
2.25M
        }
961
2.31M
      }
962
753k
      lsf_adaptive_mean_cand[k] = FX_DBL2FX_LPC(tmp);
963
753k
    }
964
47.1k
  }
965
966
  /* calculate stability factor Theta. Needed for ACELP decoder and concealment
967
   */
968
0
  {
969
47.1k
    FIXP_LPC *lsf_prev, *lsf_curr;
970
47.1k
    k = 0;
971
972
47.1k
    FDK_ASSERT(lpc_present[0] == 1 && lpc_present[4 >> s] == 1);
973
47.1k
    lsf_prev = lsp[0];
974
235k
    for (i = 1; i < (nbDiv + 1); i++) {
975
188k
      if (lpc_present[i]) {
976
167k
        FIXP_DBL tmp = (FIXP_DBL)0;
977
167k
        int j;
978
167k
        lsf_curr = lsp[i];
979
980
        /* sum = tmp * 2^(LSF_SCALE*2 + 4) */
981
2.84M
        for (j = 0; j < M_LP_FILTER_ORDER; j++) {
982
2.67M
          tmp += fPow2Div2((FIXP_SGL)(lsf_curr[j] - lsf_prev[j])) >> 3;
983
2.67M
        }
984
985
        /* tmp = (float)(FL2FXCONST_DBL(1.25f) - fMult(tmp,
986
         * FL2FXCONST_DBL(1/400000.0f))); */
987
167k
        tmp = FL2FXCONST_DBL(1.25f / (1 << LSF_SCALE)) -
988
167k
              fMult(tmp, FL2FXCONST_DBL((1 << (LSF_SCALE + 4)) / 400000.0f));
989
167k
        if (tmp >= FL2FXCONST_DBL(1.0f / (1 << LSF_SCALE))) {
990
45.2k
          pStability[k] = FL2FXCONST_SGL(1.0f / 2.0f);
991
122k
        } else if (tmp < FL2FXCONST_DBL(0.0f)) {
992
75.7k
          pStability[k] = FL2FXCONST_SGL(0.0f);
993
75.7k
        } else {
994
46.3k
          pStability[k] = FX_DBL2FX_SGL(tmp << (LSF_SCALE - 1));
995
46.3k
        }
996
997
167k
        lsf_prev = lsf_curr;
998
167k
        k = i;
999
167k
      } else {
1000
        /* Mark stability value as undefined. */
1001
21.1k
        pStability[i] = (FIXP_SGL)-1;
1002
21.1k
      }
1003
188k
    }
1004
47.1k
  }
1005
1006
  /* convert into LSP domain */
1007
282k
  for (i = 0; i < (nbDiv + 1); i++) {
1008
235k
    if (lpc_present[i]) {
1009
3.64M
      for (k = 0; k < M_LP_FILTER_ORDER; k++) {
1010
3.43M
        lsp[i][k] = FX_DBL2FX_LPC(
1011
3.43M
            fixp_cos(fMult(lsp[i][k],
1012
3.43M
                           FL2FXCONST_SGL((1 << LSPARG_SCALE) * M_PI / 6400.0)),
1013
3.43M
                     LSF_SCALE - LSPARG_SCALE));
1014
3.43M
      }
1015
214k
    }
1016
235k
  }
1017
1018
47.1k
  return 0;
1019
47.1k
}
1020
1021
void CLpc_Conceal(FIXP_LPC lsp[][M_LP_FILTER_ORDER],
1022
                  FIXP_LPC lpc4_lsf[M_LP_FILTER_ORDER],
1023
                  FIXP_LPC lsf_adaptive_mean[M_LP_FILTER_ORDER],
1024
7.68k
                  const int first_lpd_flag) {
1025
7.68k
  int i, j;
1026
1027
7.68k
#define BETA (FL2FXCONST_SGL(0.25f))
1028
7.68k
#define ONE_BETA (FL2FXCONST_SGL(0.75f))
1029
7.68k
#define BFI_FAC (FL2FXCONST_SGL(0.90f))
1030
7.68k
#define ONE_BFI_FAC (FL2FXCONST_SGL(0.10f))
1031
1032
  /* Frame loss concealment (could be improved) */
1033
1034
7.68k
  if (first_lpd_flag) {
1035
    /* Reset past LSF values */
1036
114k
    for (i = 0; i < M_LP_FILTER_ORDER; i++) {
1037
107k
      lsp[0][i] = lpc4_lsf[i] = fdk_dec_lsf_init[i];
1038
107k
    }
1039
6.71k
  } else {
1040
    /* old LPC4 is new LPC0 */
1041
16.5k
    for (i = 0; i < M_LP_FILTER_ORDER; i++) {
1042
15.5k
      lsp[0][i] = lpc4_lsf[i];
1043
15.5k
    }
1044
971
  }
1045
1046
  /* LPC1 */
1047
130k
  for (i = 0; i < M_LP_FILTER_ORDER; i++) {
1048
122k
    FIXP_LPC lsf_mean = FX_DBL2FX_LPC(fMult(BETA, fdk_dec_lsf_init[i]) +
1049
122k
                                      fMult(ONE_BETA, lsf_adaptive_mean[i]));
1050
1051
122k
    lsp[1][i] = FX_DBL2FX_LPC(fMult(BFI_FAC, lpc4_lsf[i]) +
1052
122k
                              fMult(ONE_BFI_FAC, lsf_mean));
1053
122k
  }
1054
1055
  /* LPC2 - LPC4 */
1056
30.7k
  for (j = 2; j <= 4; j++) {
1057
391k
    for (i = 0; i < M_LP_FILTER_ORDER; i++) {
1058
      /* lsf_mean[i] =  FX_DBL2FX_LPC(fMult((FIXP_LPC)(BETA + j *
1059
         FL2FXCONST_LPC(0.1f)), fdk_dec_lsf_init[i])
1060
                                    + fMult((FIXP_LPC)(ONE_BETA - j *
1061
         FL2FXCONST_LPC(0.1f)), lsf_adaptive_mean[i])); */
1062
1063
368k
      FIXP_LPC lsf_mean = FX_DBL2FX_LPC(
1064
368k
          fMult((FIXP_SGL)(BETA + (FIXP_SGL)(j * (INT)FL2FXCONST_SGL(0.1f))),
1065
368k
                (FIXP_SGL)fdk_dec_lsf_init[i]) +
1066
368k
          fMult(
1067
368k
              (FIXP_SGL)(ONE_BETA - (FIXP_SGL)(j * (INT)FL2FXCONST_SGL(0.1f))),
1068
368k
              lsf_adaptive_mean[i]));
1069
1070
368k
      lsp[j][i] = FX_DBL2FX_LPC(fMult(BFI_FAC, lsp[j - 1][i]) +
1071
368k
                                fMult(ONE_BFI_FAC, lsf_mean));
1072
368k
    }
1073
23.0k
  }
1074
1075
  /* Update past values for the future */
1076
130k
  for (i = 0; i < M_LP_FILTER_ORDER; i++) {
1077
122k
    lpc4_lsf[i] = lsp[4][i];
1078
122k
  }
1079
1080
  /* convert into LSP domain */
1081
46.1k
  for (j = 0; j < 5; j++) {
1082
653k
    for (i = 0; i < M_LP_FILTER_ORDER; i++) {
1083
614k
      lsp[j][i] = FX_DBL2FX_LPC(fixp_cos(
1084
614k
          fMult(lsp[j][i], FL2FXCONST_SGL((1 << LSPARG_SCALE) * M_PI / 6400.0)),
1085
614k
          LSF_SCALE - LSPARG_SCALE));
1086
614k
    }
1087
38.4k
  }
1088
7.68k
}
1089
1090
85.1k
void E_LPC_a_weight(FIXP_LPC *wA, const FIXP_LPC *A, int m) {
1091
85.1k
  FIXP_DBL f;
1092
85.1k
  int i;
1093
1094
85.1k
  f = FL2FXCONST_DBL(0.92f);
1095
1.44M
  for (i = 0; i < m; i++) {
1096
1.36M
    wA[i] = FX_DBL2FX_LPC(fMult(A[i], f));
1097
1.36M
    f = fMult(f, FL2FXCONST_DBL(0.92f));
1098
1.36M
  }
1099
85.1k
}
1100
1101
96.4k
void CLpd_DecodeGain(FIXP_DBL *gain, INT *gain_e, int gain_code) {
1102
  /* gain * 2^(gain_e) = 10^(gain_code/28) */
1103
96.4k
  *gain = fLdPow(
1104
96.4k
      FL2FXCONST_DBL(3.3219280948873623478703194294894 / 4.0), /* log2(10)*/
1105
96.4k
      2,
1106
96.4k
      fMultDiv2((FIXP_DBL)gain_code << (DFRACT_BITS - 1 - 7),
1107
96.4k
                FL2FXCONST_DBL(2.0f / 28.0f)),
1108
96.4k
      7, gain_e);
1109
96.4k
}
1110
1111
  /**
1112
   * \brief *   Find the polynomial F1(z) or F2(z) from the LSPs.
1113
   * This is performed by expanding the product polynomials:
1114
   *
1115
   * F1(z) =   product   ( 1 - 2 LSP_i z^-1 + z^-2 )
1116
   *         i=0,2,4,6,8
1117
   * F2(z) =   product   ( 1 - 2 LSP_i z^-1 + z^-2 )
1118
   *         i=1,3,5,7,9
1119
   *
1120
   * where LSP_i are the LSPs in the cosine domain.
1121
   * R.A.Salami    October 1990
1122
   * \param lsp input, line spectral freq. (cosine domain)
1123
   * \param f output, the coefficients of F1 or F2, scaled by 8 bits
1124
   * \param n no of coefficients (m/2)
1125
   * \param flag 1 : F1(z) ; 2 : F2(z)
1126
   */
1127
1128
8.89M
#define SF_F 8
1129
1130
1.04M
static void get_lsppol(FIXP_LPC lsp[], FIXP_DBL f[], int n, int flag) {
1131
1.04M
  FIXP_DBL b;
1132
1.04M
  FIXP_LPC *plsp;
1133
1.04M
  int i, j;
1134
1135
1.04M
  plsp = lsp + flag - 1;
1136
1.04M
  f[0] = FL2FXCONST_DBL(1.0f / (1 << SF_F));
1137
1.04M
  b = -FX_LPC2FX_DBL(*plsp);
1138
1.04M
  f[1] = b >> (SF_F - 1);
1139
8.36M
  for (i = 2; i <= n; i++) {
1140
7.32M
    plsp += 2;
1141
7.32M
    b = -FX_LPC2FX_DBL(*plsp);
1142
7.32M
    f[i] = SATURATE_LEFT_SHIFT((fMultDiv2(b, f[i - 1]) + (f[i - 2] >> 1)), 2,
1143
7.32M
                               DFRACT_BITS);
1144
29.2M
    for (j = i - 1; j > 1; j--) {
1145
21.9M
      f[j] = SATURATE_LEFT_SHIFT(
1146
21.9M
          ((f[j] >> 2) + fMultDiv2(b, f[j - 1]) + (f[j - 2] >> 2)), 2,
1147
21.9M
          DFRACT_BITS);
1148
21.9M
    }
1149
7.32M
    f[1] = f[1] + (b >> (SF_F - 1));
1150
7.32M
  }
1151
1.04M
  return;
1152
1.04M
}
1153
1154
7.32M
#define NC M_LP_FILTER_ORDER / 2
1155
1156
/**
1157
 * \brief lsp input LSP vector
1158
 * \brief a output LP filter coefficient vector scaled by SF_A_COEFFS.
1159
 */
1160
522k
void E_LPC_f_lsp_a_conversion(FIXP_LPC *lsp, FIXP_LPC *a, INT *a_exp) {
1161
522k
  FIXP_DBL f1[NC + 1], f2[NC + 1];
1162
522k
  int i, k;
1163
1164
  /*-----------------------------------------------------*
1165
   *  Find the polynomials F1(z) and F2(z)               *
1166
   *-----------------------------------------------------*/
1167
1168
522k
  get_lsppol(lsp, f1, NC, 1);
1169
522k
  get_lsppol(lsp, f2, NC, 2);
1170
1171
  /*-----------------------------------------------------*
1172
   *  Multiply F1(z) by (1+z^-1) and F2(z) by (1-z^-1)   *
1173
   *-----------------------------------------------------*/
1174
522k
  scaleValues(f1, NC + 1, -2);
1175
522k
  scaleValues(f2, NC + 1, -2);
1176
1177
4.70M
  for (i = NC; i > 0; i--) {
1178
4.18M
    f1[i] += f1[i - 1];
1179
4.18M
    f2[i] -= f2[i - 1];
1180
4.18M
  }
1181
1182
522k
  FIXP_DBL aDBL[M_LP_FILTER_ORDER];
1183
1184
4.70M
  for (i = 1, k = M_LP_FILTER_ORDER - 1; i <= NC; i++, k--) {
1185
4.18M
    aDBL[i - 1] = f1[i] + f2[i];
1186
4.18M
    aDBL[k] = f1[i] - f2[i];
1187
4.18M
  }
1188
1189
522k
  int headroom_a = getScalefactor(aDBL, M_LP_FILTER_ORDER);
1190
1191
8.89M
  for (i = 0; i < M_LP_FILTER_ORDER; i++) {
1192
8.36M
    a[i] = FX_DBL2FX_LPC(aDBL[i] << headroom_a);
1193
8.36M
  }
1194
1195
522k
  *a_exp = SF_F + (2 - 1) - headroom_a;
1196
522k
}