/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 | } |