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