Coverage Report

Created: 2025-07-01 06:21

/src/aac/libAACdec/src/usacdec_lpc.cpp
Line
Count
Source (jump to first uncovered line)
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
0
#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
0
static int get_vlclbf(HANDLE_FDK_BITSTREAM hBs) {
120
0
  int result = 0;
121
122
0
  while (FDKreadBits(hBs, 1) && result <= NQ_MAX) {
123
0
    result++;
124
0
  }
125
0
  return result;
126
0
}
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
0
static int get_vlclbf_n(HANDLE_FDK_BITSTREAM hBs, int n) {
135
0
  int result = 0;
136
137
0
  while (FDKreadBits(hBs, 1)) {
138
0
    result++;
139
0
    n--;
140
0
    if (n <= 0) {
141
0
      break;
142
0
    }
143
0
  }
144
145
0
  return result;
146
0
}
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
0
#define ZF_SCALE ((DFRACT_BITS / 2))
156
0
#define FIXP_ZF FIXP_DBL
157
0
#define INT2ZF(x, s) (FIXP_ZF)((x) << (ZF_SCALE - (s)))
158
0
#define ZF2INT(x) (INT)((x) >> ZF_SCALE)
159
160
/* 1.0 in ZF format format */
161
0
#define ONEZF ((FIXP_ZF)INT2ZF(1, 0))
162
163
/* static */
164
0
void nearest_neighbor_2D8(FIXP_ZF x[8], int y[8]) {
165
0
  FIXP_ZF s, em, e[8];
166
0
  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
0
  sum = 0;
173
0
  for (i = 0; i < 8; i++) {
174
0
    FIXP_ZF tmp;
175
    /* round to ..., -2, 0, 2, ... ([-1..1[ --> 0) */
176
0
    if (x[i] < (FIXP_ZF)0) {
177
0
      tmp = ONEZF - x[i];
178
0
      y[i] = -2 * ((ZF2INT(tmp)) >> 1);
179
0
    } else {
180
0
      tmp = ONEZF + x[i];
181
0
      y[i] = 2 * ((ZF2INT(tmp)) >> 1);
182
0
    }
183
0
    sum += y[i];
184
0
  }
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
0
  if (sum % 4) {
191
    /* find j = arg max_i | xi -yi| */
192
0
    em = (FIXP_SGL)0;
193
0
    j = 0;
194
0
    for (i = 0; i < 8; i++) {
195
      /* compute ei = xi-yi */
196
0
      e[i] = x[i] - INT2ZF(y[i], 0);
197
0
    }
198
0
    for (i = 0; i < 8; i++) {
199
      /* compute |ei| = | xi-yi | */
200
0
      if (e[i] < (FIXP_ZF)0) {
201
0
        s = -e[i];
202
0
      } else {
203
0
        s = e[i];
204
0
      }
205
      /* check if |ei| is maximal, if so, set j=i */
206
0
      if (em < s) {
207
0
        em = s;
208
0
        j = i;
209
0
      }
210
0
    }
211
    /* round xj in the "wrong way" */
212
0
    if (e[j] < (FIXP_ZF)0) {
213
0
      y[j] -= 2;
214
0
    } else {
215
0
      y[j] += 2;
216
0
    }
217
0
  }
218
0
}
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
0
void RE8_PPV(FIXP_ZF x[], SHORT y[], int r) {
232
0
  int i, y0[8], y1[8];
233
0
  FIXP_ZF x1[8], tmp;
234
0
  INT64 e;
235
236
  /* find the nearest neighbor y0 of x in 2D8 */
237
0
  nearest_neighbor_2D8(x, y0);
238
  /* find the nearest neighbor y1 of x in 2D8+(1,...,1) (by coset decoding) */
239
0
  for (i = 0; i < 8; i++) {
240
0
    x1[i] = x[i] - ONEZF;
241
0
  }
242
0
  nearest_neighbor_2D8(x1, y1);
243
0
  for (i = 0; i < 8; i++) {
244
0
    y1[i] += 1;
245
0
  }
246
247
  /* compute e0=||x-y0||^2 and e1=||x-y1||^2 */
248
0
  e = 0;
249
0
  for (i = 0; i < 8; i++) {
250
0
    tmp = x[i] - INT2ZF(y0[i], 0);
251
0
    e += (INT64)fPow2Div2(
252
0
        tmp << r); /* shift left to ensure that no fract part bits get lost. */
253
0
    tmp = x[i] - INT2ZF(y1[i], 0);
254
0
    e -= (INT64)fPow2Div2(tmp << r);
255
0
  }
256
  /* select best candidate y0 or y1 to minimize distortion */
257
0
  if (e < 0) {
258
0
    for (i = 0; i < 8; i++) {
259
0
      y[i] = y0[i];
260
0
    }
261
0
  } else {
262
0
    for (i = 0; i < 8; i++) {
263
0
      y[i] = y1[i];
264
0
    }
265
0
  }
266
0
}
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
0
static int table_lookup(const USHORT *table, unsigned int index, int range) {
271
0
  int i;
272
273
0
  for (i = 4; i < range; i += 4) {
274
0
    if (index < table[i]) {
275
0
      break;
276
0
    }
277
0
  }
278
0
  if (i > range) {
279
0
    i = range;
280
0
  }
281
282
0
  if (index < table[i - 2]) {
283
0
    i -= 2;
284
0
  }
285
0
  if (index < table[i - 1]) {
286
0
    i--;
287
0
  }
288
0
  i--;
289
290
0
  return (i); /* index >= table[i] */
291
0
}
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
0
static void re8_decode_rank_of_permutation(int rank, int *xs, SHORT x[8]) {
302
0
  INT a[8], w[8], B, fac, fac_B, target;
303
0
  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
0
  j = 0;
319
0
  w[j] = 1;
320
0
  a[j] = xs[0];
321
0
  B = 1;
322
0
  for (i = 1; i < 8; i++) {
323
0
    if (xs[i] != xs[i - 1]) {
324
0
      j++;
325
0
      w[j] = 1;
326
0
      a[j] = xs[i];
327
0
    } else {
328
0
      w[j]++;
329
0
      B *= w[j];
330
0
    }
331
0
  }
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
0
  if (w[0] == 8) {
343
0
    for (i = 0; i < 8; i++) {
344
0
      x[i] = a[0]; /* avoid fac of 40320 */
345
0
    }
346
0
  } else {
347
0
    target = rank * B;
348
0
    fac_B = 1;
349
    /* decode x element by element */
350
0
    for (i = 0; i < 8; i++) {
351
0
      fac = fac_B * fdk_dec_tab_factorial[i]; /* fac = 1..5040 */
352
0
      j = -1;
353
0
      do {
354
0
        target -= w[++j] * fac;
355
0
      } while (target >= 0); /* max of 30 tests / SV */
356
0
      x[i] = a[j];
357
      /* update rank, denominator B (B_k) and counter w[j] */
358
0
      target += w[j] * fac; /* target = fac_B*B*rank */
359
0
      fac_B *= w[j];
360
0
      w[j]--;
361
0
    }
362
0
  }
363
0
}
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
0
static void re8_decode_base_index(int *n, UINT index, SHORT y[8]) {
376
0
  int i, im, t, sign_code, ka, ks, rank, leader[8];
377
378
0
  if (*n < 2) {
379
0
    for (i = 0; i < 8; i++) {
380
0
      y[i] = 0;
381
0
    }
382
0
  } 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
0
    switch (*n) {
388
0
      case 2:
389
0
      case 3:
390
0
        i = table_lookup(fdk_dec_I3, index, NB_LDQ3);
391
0
        ka = fdk_dec_A3[i];
392
0
        break;
393
0
      case 4:
394
0
        i = table_lookup(fdk_dec_I4, index, NB_LDQ4);
395
0
        ka = fdk_dec_A4[i];
396
0
        break;
397
0
      default:
398
0
        FDK_ASSERT(0);
399
0
        return;
400
0
    }
401
    /* reconstruct the absolute leader */
402
0
    for (i = 0; i < 8; i++) {
403
0
      leader[i] = fdk_dec_Da[ka][i];
404
0
    }
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
0
    t = fdk_dec_Ia[ka];
409
0
    im = fdk_dec_Ns[ka];
410
0
    ks = table_lookup(fdk_dec_Is + t, index, im);
411
412
    /* reconstruct the signed leader from its sign code */
413
0
    sign_code = 2 * fdk_dec_Ds[t + ks];
414
0
    for (i = 7; i >= 0; i--) {
415
0
      leader[i] *= (1 - (sign_code & 2));
416
0
      sign_code >>= 1;
417
0
    }
418
419
    /* compute and decode the rank of the permutation */
420
0
    rank = index - fdk_dec_Is[t + ks]; /* rank = index - cardinality offset */
421
422
0
    re8_decode_rank_of_permutation(rank, leader, y);
423
0
  }
424
0
  return;
425
0
}
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
0
static void re8_k2y(int *k, int r, SHORT *y) {
435
0
  int i, tmp, sum;
436
0
  SHORT v[8];
437
0
  FIXP_ZF zf[8];
438
439
0
  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
0
  for (i = 0; i < 8; i++) {
451
0
    y[i] = k[7];
452
0
  }
453
0
  zf[7] = INT2ZF(y[7], r);
454
0
  sum = 0;
455
0
  for (i = 6; i >= 1; i--) {
456
0
    tmp = 2 * k[i];
457
0
    sum += tmp;
458
0
    y[i] += tmp;
459
0
    zf[i] = INT2ZF(y[i], r);
460
0
  }
461
0
  y[0] += (4 * k[0] + sum);
462
0
  zf[0] = INT2ZF(y[0] - 2, r);
463
  /* find nearest neighbor v of z in infinite RE8 */
464
0
  RE8_PPV(zf, v, r);
465
  /* compute y -= m v */
466
0
  for (i = 0; i < 8; i++) {
467
0
    y[i] -= (SHORT)(v[i] << r);
468
0
  }
469
0
}
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
0
static int RE8_dec(int n, int I, int *k, FIXP_DBL *y) {
484
0
  SHORT v[8];
485
0
  SHORT _y[8];
486
0
  UINT r;
487
0
  int i;
488
489
  /* Check bound of codebook qn */
490
0
  if (n > NQ_MAX) {
491
0
    return -1;
492
0
  }
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
0
  if (n <= 4) {
498
0
    re8_decode_base_index(&n, I, _y);
499
0
    for (i = 0; i < 8; i++) {
500
0
      y[i] = (LONG)_y[i];
501
0
    }
502
0
  } else {
503
    /* compute the Voronoi modulo m = 2^r where r is extension order */
504
0
    r = ((n - 3) >> 1);
505
506
0
    while (n > 4) {
507
0
      n -= 2;
508
0
    }
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
0
    re8_decode_base_index(&n, I, _y);
512
    /* decode Voronoi index k[] into v */
513
0
    re8_k2y(k, r, v);
514
    /* reconstruct y as y = m c + v (with m=2^r, r integer >=1) */
515
0
    for (i = 0; i < 8; i++) {
516
0
      y[i] = (LONG)((_y[i] << r) + v[i]);
517
0
    }
518
0
  }
519
0
  return 0;
520
0
}
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
0
static void lsf_weight_2st(FIXP_LPC *lsfq, FIXP_DBL *xq, int nk_mode) {
538
0
  FIXP_LPC d[M_LP_FILTER_ORDER + 1];
539
0
  FIXP_SGL factor;
540
0
  LONG w; /* inverse weight factor */
541
0
  int i;
542
543
  /* compute lsf distance */
544
0
  d[0] = lsfq[0];
545
0
  d[M_LP_FILTER_ORDER] =
546
0
      FL2FXCONST_LPC(FREQ_MAX / (1 << LSF_SCALE)) - lsfq[M_LP_FILTER_ORDER - 1];
547
0
  for (i = 1; i < M_LP_FILTER_ORDER; i++) {
548
0
    d[i] = lsfq[i] - lsfq[i - 1];
549
0
  }
550
551
0
  switch (nk_mode) {
552
0
    case 0:
553
0
      factor = FL2FXCONST_SGL(2.0f * 60.0f / FREQ_DIV);
554
0
      break; /* abs */
555
0
    case 1:
556
0
      factor = FL2FXCONST_SGL(2.0f * 65.0f / FREQ_DIV);
557
0
      break; /* mid */
558
0
    case 2:
559
0
      factor = FL2FXCONST_SGL(2.0f * 64.0f / FREQ_DIV);
560
0
      break; /* rel1 */
561
0
    default:
562
0
      factor = FL2FXCONST_SGL(2.0f * 63.0f / FREQ_DIV);
563
0
      break; /* rel2 */
564
0
  }
565
  /* add non-weighted residual LSF vector to LSF1st */
566
0
  for (i = 0; i < M_LP_FILTER_ORDER; i++) {
567
0
    w = (LONG)fMultDiv2(factor, sqrtFixp(fMult(d[i], d[i + 1])));
568
0
    lsfq[i] = fAddSaturate(lsfq[i],
569
0
                           FX_DBL2FX_LPC((FIXP_DBL)((INT64)w * (LONG)xq[i])));
570
0
  }
571
572
0
  return;
573
0
}
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
0
                      int qn[]) {
584
0
  int n;
585
586
0
  if (nk_mode == 1) { /* nk mode 1 */
587
    /* Unary code for mid LPC1/LPC3 */
588
    /* Q0=0, Q2=10, Q3=110, ... */
589
0
    for (n = 0; n < nqn; n++) {
590
0
      qn[n] = get_vlclbf(hBs);
591
0
      if (qn[n] > 0) {
592
0
        qn[n]++;
593
0
      }
594
0
    }
595
0
  } else { /* nk_mode 0, 3 and 2 */
596
    /* 2 bits to specify Q2,Q3,Q4,ext */
597
0
    for (n = 0; n < nqn; n++) {
598
0
      qn[n] = 2 + FDKreadBits(hBs, 2);
599
0
    }
600
0
    if (nk_mode == 2) {
601
      /* Unary code for rel LPC1/LPC3 */
602
      /* Q0 = 0, Q5=10, Q6=110, ... */
603
0
      for (n = 0; n < nqn; n++) {
604
0
        if (qn[n] > 4) {
605
0
          qn[n] = get_vlclbf(hBs);
606
0
          if (qn[n] > 0) qn[n] += 4;
607
0
        }
608
0
      }
609
0
    } 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
0
      for (n = 0; n < nqn; n++) {
613
0
        if (qn[n] > 4) {
614
0
          qn[n] = get_vlclbf(hBs);
615
0
          switch (qn[n]) {
616
0
            case 0:
617
0
              qn[n] = 5;
618
0
              break;
619
0
            case 1:
620
0
              qn[n] = 6;
621
0
              break;
622
0
            case 2:
623
0
              qn[n] = 0;
624
0
              break;
625
0
            default:
626
0
              qn[n] += 4;
627
0
              break;
628
0
          }
629
0
        }
630
0
      }
631
0
    }
632
0
  }
633
0
}
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
0
static void reorder_lsf(FIXP_LPC *lsf, FIXP_LPC min_dist, int n) {
643
0
  FIXP_LPC lsf_min;
644
0
  int i;
645
646
0
  lsf_min = min_dist;
647
0
  for (i = 0; i < n; i++) {
648
0
    if (lsf[i] < lsf_min) {
649
0
      lsf[i] = lsf_min;
650
0
    }
651
0
    lsf_min = fAddSaturate(lsf[i], min_dist);
652
0
  }
653
654
  /* reverse */
655
0
  lsf_min = FL2FXCONST_LPC(FREQ_MAX / (1 << LSF_SCALE)) - min_dist;
656
0
  for (i = n - 1; i >= 0; i--) {
657
0
    if (lsf[i] > lsf_min) {
658
0
      lsf[i] = lsf_min;
659
0
    }
660
661
0
    lsf_min = lsf[i] - min_dist;
662
0
  }
663
0
}
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
0
) {
675
0
  const FIXP_LPC *p_dico;
676
0
  int i, index;
677
678
0
  index = FDKreadBits(hBs, 8);
679
0
  p_dico = &fdk_dec_dico_lsf_abs_8b[index * M_LP_FILTER_ORDER];
680
0
  for (i = 0; i < M_LP_FILTER_ORDER; i++) {
681
0
    lsfq[i] = p_dico[i];
682
0
  }
683
0
}
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
0
) {
699
0
  int err;
700
0
  FIXP_DBL xq[M_LP_FILTER_ORDER]; /* weighted residual LSF vector */
701
702
  /* Decode AVQ refinement */
703
0
  { err = CLpc_DecodeAVQ(hBs, xq, nk_mode, 2, 8); }
704
0
  if (err != 0) {
705
0
    return -1;
706
0
  }
707
708
  /* add non-weighted residual LSF vector to LSF1st */
709
0
  lsf_weight_2st(lsfq, xq, nk_mode);
710
711
  /* reorder */
712
0
  reorder_lsf(lsfq, FL2FXCONST_LPC(LSF_GAP / (1 << LSF_SCALE)),
713
0
              M_LP_FILTER_ORDER);
714
715
0
  return 0;
716
0
}
717
718
/*
719
 * Externally visible functions
720
 */
721
722
int CLpc_DecodeAVQ(HANDLE_FDK_BITSTREAM hBs, FIXP_DBL *pOutput, int nk_mode,
723
0
                   int no_qn, int length) {
724
0
  int i, l;
725
726
0
  for (i = 0; i < length; i += 8 * no_qn) {
727
0
    int qn[2], nk, n, I;
728
0
    int kv[8] = {0};
729
730
0
    decode_qn(hBs, nk_mode, no_qn, qn);
731
732
0
    for (l = 0; l < no_qn; l++) {
733
0
      if (qn[l] == 0) {
734
0
        FDKmemclear(&pOutput[i + l * 8], 8 * sizeof(FIXP_DBL));
735
0
      }
736
737
      /* Voronoi extension order ( nk ) */
738
0
      nk = 0;
739
0
      n = qn[l];
740
0
      if (qn[l] > 4) {
741
0
        nk = (qn[l] - 3) >> 1;
742
0
        n = qn[l] - nk * 2;
743
0
      }
744
745
      /* Base codebook index, in reverse bit group order (!) */
746
0
      I = FDKreadBits(hBs, 4 * n);
747
748
0
      if (nk > 0) {
749
0
        int j;
750
751
0
        for (j = 0; j < 8; j++) {
752
0
          kv[j] = FDKreadBits(hBs, nk);
753
0
        }
754
0
      }
755
756
0
      if (RE8_dec(qn[l], I, kv, &pOutput[i + l * 8]) != 0) {
757
0
        return -1;
758
0
      }
759
0
    }
760
0
  }
761
0
  return 0;
762
0
}
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
0
              int last_lpc_lost, int last_frame_ok) {
769
0
  int i, k, err;
770
0
  int mode_lpc_bin = 0; /* mode_lpc bitstream representation */
771
0
  int lpc_present[5] = {0, 0, 0, 0, 0};
772
0
  int lpc0_available = 1;
773
0
  int s = 0;
774
0
  int l = 3;
775
0
  const int nbDiv = NB_DIV;
776
777
0
  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
0
  vlpc_1st_dec(hBs, lsp[4 >> s]);
783
0
  err = vlpc_2st_dec(hBs, lsp[4 >> s], 0); /* nk_mode = 0 */
784
0
  if (err != 0) {
785
0
    return err;
786
0
  }
787
788
  /*** Decode LPC0 and LPC2 ***/
789
0
  k = 0;
790
0
  if (!first_lpd_flag) {
791
0
    lpc_present[0] = 1;
792
0
    lpc0_available = !last_lpc_lost;
793
    /* old LPC4 is new LPC0 */
794
0
    for (i = 0; i < M_LP_FILTER_ORDER; i++) {
795
0
      lsp[0][i] = lpc4_lsf[i];
796
0
    }
797
    /* skip LPC0 and continue with LPC2 */
798
0
    k = 2;
799
0
  }
800
801
0
  for (; k < l; k += 2) {
802
0
    int nk_mode = 0;
803
804
0
    if ((k == 2) && (mod[0] == 3)) {
805
0
      break; /* skip LPC2 */
806
0
    }
807
808
0
    lpc_present[k >> s] = 1;
809
810
0
    mode_lpc_bin = FDKreadBit(hBs);
811
812
0
    if (mode_lpc_bin == 0) {
813
      /* LPC0/LPC2: Abs */
814
0
      vlpc_1st_dec(hBs, lsp[k >> s]);
815
0
    } else {
816
      /* LPC0/LPC2: RelR */
817
0
      for (i = 0; i < M_LP_FILTER_ORDER; i++) {
818
0
        lsp[k >> s][i] = lsp[4 >> s][i];
819
0
      }
820
0
      nk_mode = 3;
821
0
    }
822
823
0
    err = vlpc_2st_dec(hBs, lsp[k >> s], nk_mode);
824
0
    if (err != 0) {
825
0
      return err;
826
0
    }
827
0
  }
828
829
  /*** Decode LPC1 ***/
830
0
  if (mod[0] < 2) { /* else: skip LPC1 */
831
0
    lpc_present[1] = 1;
832
0
    mode_lpc_bin = get_vlclbf_n(hBs, 2);
833
834
0
    switch (mode_lpc_bin) {
835
0
      case 1:
836
        /* LPC1: abs */
837
0
        vlpc_1st_dec(hBs, lsp[1]);
838
0
        err = vlpc_2st_dec(hBs, lsp[1], 0);
839
0
        if (err != 0) {
840
0
          return err;
841
0
        }
842
0
        break;
843
0
      case 2:
844
        /* LPC1: mid0 (no second stage AVQ quantizer in this case) */
845
0
        if (lpc0_available) { /* LPC0/lsf[0] might be zero some times */
846
0
          for (i = 0; i < M_LP_FILTER_ORDER; i++) {
847
0
            lsp[1][i] = (lsp[0][i] >> 1) + (lsp[2][i] >> 1);
848
0
          }
849
0
        } else {
850
0
          for (i = 0; i < M_LP_FILTER_ORDER; i++) {
851
0
            lsp[1][i] = lsp[2][i];
852
0
          }
853
0
        }
854
0
        break;
855
0
      case 0:
856
        /* LPC1: RelR */
857
0
        for (i = 0; i < M_LP_FILTER_ORDER; i++) {
858
0
          lsp[1][i] = lsp[2][i];
859
0
        }
860
0
        err = vlpc_2st_dec(hBs, lsp[1], 2 << s);
861
0
        if (err != 0) {
862
0
          return err;
863
0
        }
864
0
        break;
865
0
    }
866
0
  }
867
868
  /*** Decode LPC3 ***/
869
0
  if ((mod[2] < 2)) { /* else: skip LPC3 */
870
0
    int nk_mode = 0;
871
0
    lpc_present[3] = 1;
872
873
0
    mode_lpc_bin = get_vlclbf_n(hBs, 3);
874
875
0
    switch (mode_lpc_bin) {
876
0
      case 1:
877
        /* LPC3: abs */
878
0
        vlpc_1st_dec(hBs, lsp[3]);
879
0
        break;
880
0
      case 0:
881
        /* LPC3: mid */
882
0
        for (i = 0; i < M_LP_FILTER_ORDER; i++) {
883
0
          lsp[3][i] = (lsp[2][i] >> 1) + (lsp[4][i] >> 1);
884
0
        }
885
0
        nk_mode = 1;
886
0
        break;
887
0
      case 2:
888
        /* LPC3: relL */
889
0
        for (i = 0; i < M_LP_FILTER_ORDER; i++) {
890
0
          lsp[3][i] = lsp[2][i];
891
0
        }
892
0
        nk_mode = 2;
893
0
        break;
894
0
      case 3:
895
        /* LPC3: relR */
896
0
        for (i = 0; i < M_LP_FILTER_ORDER; i++) {
897
0
          lsp[3][i] = lsp[4][i];
898
0
        }
899
0
        nk_mode = 2;
900
0
        break;
901
0
    }
902
0
    err = vlpc_2st_dec(hBs, lsp[3], nk_mode);
903
0
    if (err != 0) {
904
0
      return err;
905
0
    }
906
0
  }
907
908
0
  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
0
  for (i = 0; i < M_LP_FILTER_ORDER; i++) {
928
0
    lpc4_lsf[i] = lsp[4 >> s][i];
929
0
  }
930
931
0
  {
932
0
    FIXP_DBL divFac;
933
0
    int last, numLpc = 0;
934
935
0
    i = nbDiv;
936
0
    do {
937
0
      numLpc += lpc_present[i--];
938
0
    } while (i >= 0 && numLpc < 3);
939
940
0
    last = i;
941
942
0
    switch (numLpc) {
943
0
      case 3:
944
0
        divFac = FL2FXCONST_DBL(1.0f / 3.0f);
945
0
        break;
946
0
      case 2:
947
0
        divFac = FL2FXCONST_DBL(1.0f / 2.0f);
948
0
        break;
949
0
      default:
950
0
        divFac = FL2FXCONST_DBL(1.0f);
951
0
        break;
952
0
    }
953
954
    /* get the adaptive mean for the next (bad) frame */
955
0
    for (k = 0; k < M_LP_FILTER_ORDER; k++) {
956
0
      FIXP_DBL tmp = (FIXP_DBL)0;
957
0
      for (i = nbDiv; i > last; i--) {
958
0
        if (lpc_present[i]) {
959
0
          tmp = fMultAdd(tmp >> 1, lsp[i][k], divFac);
960
0
        }
961
0
      }
962
0
      lsf_adaptive_mean_cand[k] = FX_DBL2FX_LPC(tmp);
963
0
    }
964
0
  }
965
966
  /* calculate stability factor Theta. Needed for ACELP decoder and concealment
967
   */
968
0
  {
969
0
    FIXP_LPC *lsf_prev, *lsf_curr;
970
0
    k = 0;
971
972
0
    FDK_ASSERT(lpc_present[0] == 1 && lpc_present[4 >> s] == 1);
973
0
    lsf_prev = lsp[0];
974
0
    for (i = 1; i < (nbDiv + 1); i++) {
975
0
      if (lpc_present[i]) {
976
0
        FIXP_DBL tmp = (FIXP_DBL)0;
977
0
        int j;
978
0
        lsf_curr = lsp[i];
979
980
        /* sum = tmp * 2^(LSF_SCALE*2 + 4) */
981
0
        for (j = 0; j < M_LP_FILTER_ORDER; j++) {
982
0
          tmp += fPow2Div2((FIXP_SGL)(lsf_curr[j] - lsf_prev[j])) >> 3;
983
0
        }
984
985
        /* tmp = (float)(FL2FXCONST_DBL(1.25f) - fMult(tmp,
986
         * FL2FXCONST_DBL(1/400000.0f))); */
987
0
        tmp = FL2FXCONST_DBL(1.25f / (1 << LSF_SCALE)) -
988
0
              fMult(tmp, FL2FXCONST_DBL((1 << (LSF_SCALE + 4)) / 400000.0f));
989
0
        if (tmp >= FL2FXCONST_DBL(1.0f / (1 << LSF_SCALE))) {
990
0
          pStability[k] = FL2FXCONST_SGL(1.0f / 2.0f);
991
0
        } else if (tmp < FL2FXCONST_DBL(0.0f)) {
992
0
          pStability[k] = FL2FXCONST_SGL(0.0f);
993
0
        } else {
994
0
          pStability[k] = FX_DBL2FX_SGL(tmp << (LSF_SCALE - 1));
995
0
        }
996
997
0
        lsf_prev = lsf_curr;
998
0
        k = i;
999
0
      } else {
1000
        /* Mark stability value as undefined. */
1001
0
        pStability[i] = (FIXP_SGL)-1;
1002
0
      }
1003
0
    }
1004
0
  }
1005
1006
  /* convert into LSP domain */
1007
0
  for (i = 0; i < (nbDiv + 1); i++) {
1008
0
    if (lpc_present[i]) {
1009
0
      for (k = 0; k < M_LP_FILTER_ORDER; k++) {
1010
0
        lsp[i][k] = FX_DBL2FX_LPC(
1011
0
            fixp_cos(fMult(lsp[i][k],
1012
0
                           FL2FXCONST_SGL((1 << LSPARG_SCALE) * M_PI / 6400.0)),
1013
0
                     LSF_SCALE - LSPARG_SCALE));
1014
0
      }
1015
0
    }
1016
0
  }
1017
1018
0
  return 0;
1019
0
}
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
0
                  const int first_lpd_flag) {
1025
0
  int i, j;
1026
1027
0
#define BETA (FL2FXCONST_SGL(0.25f))
1028
0
#define ONE_BETA (FL2FXCONST_SGL(0.75f))
1029
0
#define BFI_FAC (FL2FXCONST_SGL(0.90f))
1030
0
#define ONE_BFI_FAC (FL2FXCONST_SGL(0.10f))
1031
1032
  /* Frame loss concealment (could be improved) */
1033
1034
0
  if (first_lpd_flag) {
1035
    /* Reset past LSF values */
1036
0
    for (i = 0; i < M_LP_FILTER_ORDER; i++) {
1037
0
      lsp[0][i] = lpc4_lsf[i] = fdk_dec_lsf_init[i];
1038
0
    }
1039
0
  } else {
1040
    /* old LPC4 is new LPC0 */
1041
0
    for (i = 0; i < M_LP_FILTER_ORDER; i++) {
1042
0
      lsp[0][i] = lpc4_lsf[i];
1043
0
    }
1044
0
  }
1045
1046
  /* LPC1 */
1047
0
  for (i = 0; i < M_LP_FILTER_ORDER; i++) {
1048
0
    FIXP_LPC lsf_mean = FX_DBL2FX_LPC(fMult(BETA, fdk_dec_lsf_init[i]) +
1049
0
                                      fMult(ONE_BETA, lsf_adaptive_mean[i]));
1050
1051
0
    lsp[1][i] = FX_DBL2FX_LPC(fMult(BFI_FAC, lpc4_lsf[i]) +
1052
0
                              fMult(ONE_BFI_FAC, lsf_mean));
1053
0
  }
1054
1055
  /* LPC2 - LPC4 */
1056
0
  for (j = 2; j <= 4; j++) {
1057
0
    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
0
      FIXP_LPC lsf_mean = FX_DBL2FX_LPC(
1064
0
          fMult((FIXP_SGL)(BETA + (FIXP_SGL)(j * (INT)FL2FXCONST_SGL(0.1f))),
1065
0
                (FIXP_SGL)fdk_dec_lsf_init[i]) +
1066
0
          fMult(
1067
0
              (FIXP_SGL)(ONE_BETA - (FIXP_SGL)(j * (INT)FL2FXCONST_SGL(0.1f))),
1068
0
              lsf_adaptive_mean[i]));
1069
1070
0
      lsp[j][i] = FX_DBL2FX_LPC(fMult(BFI_FAC, lsp[j - 1][i]) +
1071
0
                                fMult(ONE_BFI_FAC, lsf_mean));
1072
0
    }
1073
0
  }
1074
1075
  /* Update past values for the future */
1076
0
  for (i = 0; i < M_LP_FILTER_ORDER; i++) {
1077
0
    lpc4_lsf[i] = lsp[4][i];
1078
0
  }
1079
1080
  /* convert into LSP domain */
1081
0
  for (j = 0; j < 5; j++) {
1082
0
    for (i = 0; i < M_LP_FILTER_ORDER; i++) {
1083
0
      lsp[j][i] = FX_DBL2FX_LPC(fixp_cos(
1084
0
          fMult(lsp[j][i], FL2FXCONST_SGL((1 << LSPARG_SCALE) * M_PI / 6400.0)),
1085
0
          LSF_SCALE - LSPARG_SCALE));
1086
0
    }
1087
0
  }
1088
0
}
1089
1090
0
void E_LPC_a_weight(FIXP_LPC *wA, const FIXP_LPC *A, int m) {
1091
0
  FIXP_DBL f;
1092
0
  int i;
1093
1094
0
  f = FL2FXCONST_DBL(0.92f);
1095
0
  for (i = 0; i < m; i++) {
1096
0
    wA[i] = FX_DBL2FX_LPC(fMult(A[i], f));
1097
0
    f = fMult(f, FL2FXCONST_DBL(0.92f));
1098
0
  }
1099
0
}
1100
1101
0
void CLpd_DecodeGain(FIXP_DBL *gain, INT *gain_e, int gain_code) {
1102
  /* gain * 2^(gain_e) = 10^(gain_code/28) */
1103
0
  *gain = fLdPow(
1104
0
      FL2FXCONST_DBL(3.3219280948873623478703194294894 / 4.0), /* log2(10)*/
1105
0
      2,
1106
0
      fMultDiv2((FIXP_DBL)gain_code << (DFRACT_BITS - 1 - 7),
1107
0
                FL2FXCONST_DBL(2.0f / 28.0f)),
1108
0
      7, gain_e);
1109
0
}
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
0
#define SF_F 8
1129
1130
0
static void get_lsppol(FIXP_LPC lsp[], FIXP_DBL f[], int n, int flag) {
1131
0
  FIXP_DBL b;
1132
0
  FIXP_LPC *plsp;
1133
0
  int i, j;
1134
1135
0
  plsp = lsp + flag - 1;
1136
0
  f[0] = FL2FXCONST_DBL(1.0f / (1 << SF_F));
1137
0
  b = -FX_LPC2FX_DBL(*plsp);
1138
0
  f[1] = b >> (SF_F - 1);
1139
0
  for (i = 2; i <= n; i++) {
1140
0
    plsp += 2;
1141
0
    b = -FX_LPC2FX_DBL(*plsp);
1142
0
    f[i] = SATURATE_LEFT_SHIFT((fMultDiv2(b, f[i - 1]) + (f[i - 2] >> 1)), 2,
1143
0
                               DFRACT_BITS);
1144
0
    for (j = i - 1; j > 1; j--) {
1145
0
      f[j] = SATURATE_LEFT_SHIFT(
1146
0
          ((f[j] >> 2) + fMultDiv2(b, f[j - 1]) + (f[j - 2] >> 2)), 2,
1147
0
          DFRACT_BITS);
1148
0
    }
1149
0
    f[1] = f[1] + (b >> (SF_F - 1));
1150
0
  }
1151
0
  return;
1152
0
}
1153
1154
0
#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
0
void E_LPC_f_lsp_a_conversion(FIXP_LPC *lsp, FIXP_LPC *a, INT *a_exp) {
1161
0
  FIXP_DBL f1[NC + 1], f2[NC + 1];
1162
0
  int i, k;
1163
1164
  /*-----------------------------------------------------*
1165
   *  Find the polynomials F1(z) and F2(z)               *
1166
   *-----------------------------------------------------*/
1167
1168
0
  get_lsppol(lsp, f1, NC, 1);
1169
0
  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
0
  scaleValues(f1, NC + 1, -2);
1175
0
  scaleValues(f2, NC + 1, -2);
1176
1177
0
  for (i = NC; i > 0; i--) {
1178
0
    f1[i] += f1[i - 1];
1179
0
    f2[i] -= f2[i - 1];
1180
0
  }
1181
1182
0
  FIXP_DBL aDBL[M_LP_FILTER_ORDER];
1183
1184
0
  for (i = 1, k = M_LP_FILTER_ORDER - 1; i <= NC; i++, k--) {
1185
0
    aDBL[i - 1] = f1[i] + f2[i];
1186
0
    aDBL[k] = f1[i] - f2[i];
1187
0
  }
1188
1189
0
  int headroom_a = getScalefactor(aDBL, M_LP_FILTER_ORDER);
1190
1191
0
  for (i = 0; i < M_LP_FILTER_ORDER; i++) {
1192
0
    a[i] = FX_DBL2FX_LPC(aDBL[i] << headroom_a);
1193
0
  }
1194
1195
0
  *a_exp = SF_F + (2 - 1) - headroom_a;
1196
0
}