annotate lsp.c @ 10463:9f35b262d3f0 libavcodec

Commit some functions that are used by both SIPR and AMR. Based on AMR SoC code by Robert Swain and Colin McQuillan.
author vitor
date Tue, 27 Oct 2009 23:53:18 +0000
parents c1cfa4679371
children f132cde57bbe
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
10463
9f35b262d3f0 Commit some functions that are used by both SIPR and AMR.
vitor
parents: 10011
diff changeset
50 void ff_set_min_dist_lsf(float *lsf, float min_spacing, int size)
9f35b262d3f0 Commit some functions that are used by both SIPR and AMR.
vitor
parents: 10011
diff changeset
51 {
9f35b262d3f0 Commit some functions that are used by both SIPR and AMR.
vitor
parents: 10011
diff changeset
52 int i;
9f35b262d3f0 Commit some functions that are used by both SIPR and AMR.
vitor
parents: 10011
diff changeset
53 float prev = 0.0;
9f35b262d3f0 Commit some functions that are used by both SIPR and AMR.
vitor
parents: 10011
diff changeset
54 for (i = 0; i < size; i++)
9f35b262d3f0 Commit some functions that are used by both SIPR and AMR.
vitor
parents: 10011
diff changeset
55 prev = lsf[i] = FFMAX(lsf[i], prev + min_spacing);
9f35b262d3f0 Commit some functions that are used by both SIPR and AMR.
vitor
parents: 10011
diff changeset
56 }
9f35b262d3f0 Commit some functions that are used by both SIPR and AMR.
vitor
parents: 10011
diff changeset
57
6770
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6685
diff changeset
58 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
59 {
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
60 int i;
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
61
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
62 /* Convert LSF to LSP, lsp=cos(lsf) */
6770
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6685
diff changeset
63 for(i=0; i<lp_order; i++)
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
64 // 20861 = 2.0 / PI in (0.15)
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
65 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
66 }
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
67
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 * \brief decodes polynomial coefficients from LSP
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
70 * \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
71 * \param lsp LSP coefficients (-0x8000 <= (0.15) <= 0x7fff)
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
72 */
6770
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6685
diff changeset
73 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
74 {
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
75 int i, j;
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
76
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
77 f[0] = 0x400000; // 1.0 in (3.22)
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
78 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
79
6770
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6685
diff changeset
80 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
81 {
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
82 f[i] = f[i-2];
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
83 for(j=i; j>1; j--)
8201
c6e2ffef3797 Add shift argument to MULL() macro
mru
parents: 8048
diff changeset
84 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
85
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
86 f[1] -= lsp[2*i-2] << 8;
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
87 }
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
88 }
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
89
6770
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6685
diff changeset
90 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
91 {
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
92 int i;
6770
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6685
diff changeset
93 int f1[lp_half_order+1]; // (3.22)
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6685
diff changeset
94 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
95
6770
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6685
diff changeset
96 lsp2poly(f1, lsp , lp_half_order);
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6685
diff changeset
97 lsp2poly(f2, lsp+1, lp_half_order);
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
98
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
99 /* 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
100 lp[0] = 4096;
6770
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6685
diff changeset
101 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
102 {
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
103 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
104 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
105
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
106 ff1 += 1 << 10; // for rounding
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
107 lp[i] = (ff1 + ff2) >> 11; // divide by 2 and (3.22) -> (3.12)
6774
ca449dc51bd7 Fix compilation error.
voroshil
parents: 6770
diff changeset
108 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
109 }
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
110 }
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
111
6770
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6685
diff changeset
112 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
113 {
6770
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6685
diff changeset
114 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
115 int i;
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
116
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
117 /* 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
118 for(i=0; i<lp_order; i++)
6685
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
119 #ifdef G729_BITEXACT
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
120 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
121 #else
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
122 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
123 #endif
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
124
6770
e6338dd4a6e3 Replace hardcoded LP filter order with parameter.
voroshil
parents: 6685
diff changeset
125 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
126
df4f7cf1ee5f Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff changeset
127 /* 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
128 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
129 }
10011
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 /**
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
132 * 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
133 * needed for LSP to LPC conversion.
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
134 * 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
135 *
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
136 * @param lsp line spectral pairs in cosine domain
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
137 * @param f [out] polynomial input/output as a vector
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
138 *
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
139 * 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
140 */
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
141 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
142 {
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
143 int i, j;
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
144
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
145 f[0] = 1.0;
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
146 f[1] = -2 * lsp[0];
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
147 lsp -= 2;
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
148 for(i=2; i<=lp_half_order; i++)
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 double val = -2 * lsp[2*i];
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
151 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
152 for(j=i-1; j>1; j--)
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
153 f[j] += f[j-1] * val + f[j-2];
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
154 f[1] += val;
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
155 }
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
156 }
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 void ff_acelp_lspd2lpc(const double *lsp, float *lpc)
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 pa[6], qa[6];
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
161 int 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 lsp2polyf(lsp, pa, 5);
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
164 lsp2polyf(lsp + 1, qa, 5);
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 for (i=4; i>=0; i--)
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
167 {
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
168 double paf = pa[i+1] + pa[i];
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
169 double qaf = qa[i+1] - qa[i];
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
170
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
171 lpc[i ] = 0.5*(paf+qaf);
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
172 lpc[9-i] = 0.5*(paf-qaf);
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
173 }
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
174 }