Mercurial > libavcodec.hg
annotate lsp.c @ 10401:b44eae1b1971 libavcodec
Use cbrtf and exp2f instead of pow to calculate tables for MPEG audio decoding.
This hopefully is fast enough so that it is reasonable to use the same formula
directly instead of the table for CONFIG_SMALL.
author | reimar |
---|---|
date | Thu, 15 Oct 2009 06:59:23 +0000 |
parents | c1cfa4679371 |
children | 9f35b262d3f0 |
rev | line source |
---|---|
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
1 /* |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
2 * LSP routines for ACELP-based codecs |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
3 * |
10011
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
4 * Copyright (c) 2007 Reynaldo H. Verdejo Pinochet (QCELP decoder) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
5 * Copyright (c) 2008 Vladimir Voroshilov |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
6 * |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
7 * This file is part of FFmpeg. |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
8 * |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
9 * FFmpeg is free software; you can redistribute it and/or |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
10 * modify it under the terms of the GNU Lesser General Public |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
11 * License as published by the Free Software Foundation; either |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
12 * version 2.1 of the License, or (at your option) any later version. |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
13 * |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
14 * FFmpeg is distributed in the hope that it will be useful, |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
17 * Lesser General Public License for more details. |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
18 * |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
19 * You should have received a copy of the GNU Lesser General Public |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
20 * License along with FFmpeg; if not, write to the Free Software |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
22 */ |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
23 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
24 #include <inttypes.h> |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
25 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
26 #include "avcodec.h" |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
27 #define FRAC_BITS 14 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
28 #include "mathops.h" |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
29 #include "lsp.h" |
8048
ecb1962c12f3
Rename acelp_math.[ch] to celp_math.[ch] to prepare for QCELP decoder merge.
diego
parents:
7697
diff
changeset
|
30 #include "celp_math.h" |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
31 |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
32 void ff_acelp_reorder_lsf(int16_t* lsfq, int lsfq_min_distance, int lsfq_min, int lsfq_max, int lp_order) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
33 { |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
34 int i, j; |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
35 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
36 /* sort lsfq in ascending order. float bubble agorithm, |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
37 O(n) if data already sorted, O(n^2) - otherwise */ |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
38 for(i=0; i<lp_order-1; i++) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
39 for(j=i; j>=0 && lsfq[j] > lsfq[j+1]; j--) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
40 FFSWAP(int16_t, lsfq[j], lsfq[j+1]); |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
41 |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
42 for(i=0; i<lp_order; i++) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
43 { |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
44 lsfq[i] = FFMAX(lsfq[i], lsfq_min); |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
45 lsfq_min = lsfq[i] + lsfq_min_distance; |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
46 } |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
47 lsfq[lp_order-1] = FFMIN(lsfq[lp_order-1], lsfq_max);//Is warning required ? |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
48 } |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
49 |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
50 void ff_acelp_lsf2lsp(int16_t *lsp, const int16_t *lsf, int lp_order) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
51 { |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
52 int i; |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
53 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
54 /* Convert LSF to LSP, lsp=cos(lsf) */ |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
55 for(i=0; i<lp_order; i++) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
56 // 20861 = 2.0 / PI in (0.15) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
57 lsp[i] = ff_cos(lsf[i] * 20861 >> 15); // divide by PI and (0,13) -> (0,14) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
58 } |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
59 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
60 /** |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
61 * \brief decodes polynomial coefficients from LSP |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
62 * \param f [out] decoded polynomial coefficients (-0x20000000 <= (3.22) <= 0x1fffffff) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
63 * \param lsp LSP coefficients (-0x8000 <= (0.15) <= 0x7fff) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
64 */ |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
65 static void lsp2poly(int* f, const int16_t* lsp, int lp_half_order) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
66 { |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
67 int i, j; |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
68 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
69 f[0] = 0x400000; // 1.0 in (3.22) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
70 f[1] = -lsp[0] << 8; // *2 and (0.15) -> (3.22) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
71 |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
72 for(i=2; i<=lp_half_order; i++) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
73 { |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
74 f[i] = f[i-2]; |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
75 for(j=i; j>1; j--) |
8201 | 76 f[j] -= MULL(f[j-1], lsp[2*i-2], FRAC_BITS) - f[j-2]; |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
77 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
78 f[1] -= lsp[2*i-2] << 8; |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
79 } |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
80 } |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
81 |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
82 void ff_acelp_lsp2lpc(int16_t* lp, const int16_t* lsp, int lp_half_order) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
83 { |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
84 int i; |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
85 int f1[lp_half_order+1]; // (3.22) |
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
86 int f2[lp_half_order+1]; // (3.22) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
87 |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
88 lsp2poly(f1, lsp , lp_half_order); |
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
89 lsp2poly(f2, lsp+1, lp_half_order); |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
90 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
91 /* 3.2.6 of G.729, Equations 25 and 26*/ |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
92 lp[0] = 4096; |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
93 for(i=1; i<lp_half_order+1; i++) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
94 { |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
95 int ff1 = f1[i] + f1[i-1]; // (3.22) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
96 int ff2 = f2[i] - f2[i-1]; // (3.22) |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
97 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
98 ff1 += 1 << 10; // for rounding |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
99 lp[i] = (ff1 + ff2) >> 11; // divide by 2 and (3.22) -> (3.12) |
6774 | 100 lp[(lp_half_order << 1) + 1 - i] = (ff1 - ff2) >> 11; // divide by 2 and (3.22) -> (3.12) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
101 } |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
102 } |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
103 |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
104 void ff_acelp_lp_decode(int16_t* lp_1st, int16_t* lp_2nd, const int16_t* lsp_2nd, const int16_t* lsp_prev, int lp_order) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
105 { |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
106 int16_t lsp_1st[lp_order]; // (0.15) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
107 int i; |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
108 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
109 /* LSP values for first subframe (3.2.5 of G.729, Equation 24)*/ |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
110 for(i=0; i<lp_order; i++) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
111 #ifdef G729_BITEXACT |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
112 lsp_1st[i] = (lsp_2nd[i] >> 1) + (lsp_prev[i] >> 1); |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
113 #else |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
114 lsp_1st[i] = (lsp_2nd[i] + lsp_prev[i]) >> 1; |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
115 #endif |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
116 |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
117 ff_acelp_lsp2lpc(lp_1st, lsp_1st, lp_order >> 1); |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
118 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
119 /* LSP values for second subframe (3.2.5 of G.729)*/ |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6685
diff
changeset
|
120 ff_acelp_lsp2lpc(lp_2nd, lsp_2nd, lp_order >> 1); |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
121 } |
10011
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
122 |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
123 /** |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
124 * Computes the Pa / (1 + z(-1)) or Qa / (1 - z(-1)) coefficients |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
125 * needed for LSP to LPC conversion. |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
126 * We only need to calculate the 6 first elements of the polynomial. |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
127 * |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
128 * @param lsp line spectral pairs in cosine domain |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
129 * @param f [out] polynomial input/output as a vector |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
130 * |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
131 * TIA/EIA/IS-733 2.4.3.3.5-1/2 |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
132 */ |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
133 static void lsp2polyf(const double *lsp, double *f, int lp_half_order) |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
134 { |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
135 int i, j; |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
136 |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
137 f[0] = 1.0; |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
138 f[1] = -2 * lsp[0]; |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
139 lsp -= 2; |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
140 for(i=2; i<=lp_half_order; i++) |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
141 { |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
142 double val = -2 * lsp[2*i]; |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
143 f[i] = val * f[i-1] + 2*f[i-2]; |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
144 for(j=i-1; j>1; j--) |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
145 f[j] += f[j-1] * val + f[j-2]; |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
146 f[1] += val; |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
147 } |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
148 } |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
149 |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
150 void ff_acelp_lspd2lpc(const double *lsp, float *lpc) |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
151 { |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
152 double pa[6], qa[6]; |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
153 int i; |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
154 |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
155 lsp2polyf(lsp, pa, 5); |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
156 lsp2polyf(lsp + 1, qa, 5); |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
157 |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
158 for (i=4; i>=0; i--) |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
159 { |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
160 double paf = pa[i+1] + pa[i]; |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
161 double qaf = qa[i+1] - qa[i]; |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
162 |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
163 lpc[i ] = 0.5*(paf+qaf); |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
164 lpc[9-i] = 0.5*(paf-qaf); |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
165 } |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
8201
diff
changeset
|
166 } |