annotate lsp.c @ 12391:4be72e19ab0e libavcodec

imc: fix undefined float to int conversion Conversion of an out of range float to int is undefined. Clipping to the final range first avoids such problems. This fixes decoding on MIPS, which handles these conversions differently from many other CPUs.
author mru
date Thu, 19 Aug 2010 16:51:26 +0000
parents d7808ddcbcee
children 2dd67ed2f947
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
10517
5317dff91b48 Use doubles in ff_set_min_dist_lsf(). After this patch, AMR can use this
vitor
parents: 10506
diff changeset
50 void ff_set_min_dist_lsf(float *lsf, double min_spacing, int size)
10463
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;
11961
d7808ddcbcee lsp: convert variable-length arrays to fixed size
mru
parents: 10567
diff changeset
93 int f1[MAX_LP_HALF_ORDER+1]; // (3.22)
d7808ddcbcee lsp: convert variable-length arrays to fixed size
mru
parents: 10567
diff changeset
94 int f2[MAX_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 {
11961
d7808ddcbcee lsp: convert variable-length arrays to fixed size
mru
parents: 10567
diff changeset
114 int16_t lsp_1st[MAX_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
10567
d4ca61e293a3 Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents: 10557
diff changeset
131 void ff_lsp2polyf(const double *lsp, double *f, int lp_half_order)
10011
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 int i, j;
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 f[0] = 1.0;
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
136 f[1] = -2 * lsp[0];
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
137 lsp -= 2;
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
138 for(i=2; i<=lp_half_order; i++)
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
139 {
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
140 double val = -2 * lsp[2*i];
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
141 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
142 for(j=i-1; j>1; j--)
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
143 f[j] += f[j-1] * val + f[j-2];
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
144 f[1] += val;
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
145 }
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
146 }
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
147
10502
f132cde57bbe Do not hardcode filter order in ff_acelp_lspd2lpc()
vitor
parents: 10463
diff changeset
148 void ff_acelp_lspd2lpc(const double *lsp, float *lpc, int lp_half_order)
10011
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
149 {
10506
a1d84a5cf21d Avoid variable-length array use in ff_acelp_lspd2lpc()
vitor
parents: 10502
diff changeset
150 double pa[MAX_LP_HALF_ORDER+1], qa[MAX_LP_HALF_ORDER+1];
10502
f132cde57bbe Do not hardcode filter order in ff_acelp_lspd2lpc()
vitor
parents: 10463
diff changeset
151 float *lpc2 = lpc + (lp_half_order << 1) - 1;
10011
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
152
10506
a1d84a5cf21d Avoid variable-length array use in ff_acelp_lspd2lpc()
vitor
parents: 10502
diff changeset
153 assert(lp_half_order <= MAX_LP_HALF_ORDER);
a1d84a5cf21d Avoid variable-length array use in ff_acelp_lspd2lpc()
vitor
parents: 10502
diff changeset
154
10567
d4ca61e293a3 Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents: 10557
diff changeset
155 ff_lsp2polyf(lsp, pa, lp_half_order);
d4ca61e293a3 Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents: 10557
diff changeset
156 ff_lsp2polyf(lsp + 1, qa, lp_half_order);
10011
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
157
10502
f132cde57bbe Do not hardcode filter order in ff_acelp_lspd2lpc()
vitor
parents: 10463
diff changeset
158 while (lp_half_order--) {
f132cde57bbe Do not hardcode filter order in ff_acelp_lspd2lpc()
vitor
parents: 10463
diff changeset
159 double paf = pa[lp_half_order+1] + pa[lp_half_order];
f132cde57bbe Do not hardcode filter order in ff_acelp_lspd2lpc()
vitor
parents: 10463
diff changeset
160 double qaf = qa[lp_half_order+1] - qa[lp_half_order];
f132cde57bbe Do not hardcode filter order in ff_acelp_lspd2lpc()
vitor
parents: 10463
diff changeset
161
f132cde57bbe Do not hardcode filter order in ff_acelp_lspd2lpc()
vitor
parents: 10463
diff changeset
162 lpc [ lp_half_order] = 0.5*(paf+qaf);
f132cde57bbe Do not hardcode filter order in ff_acelp_lspd2lpc()
vitor
parents: 10463
diff changeset
163 lpc2[-lp_half_order] = 0.5*(paf-qaf);
10011
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
164 }
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 8201
diff changeset
165 }
10557
f2f4d6fe3f6d Make sorting function used in TwinVQ a shared function
vitor
parents: 10517
diff changeset
166
f2f4d6fe3f6d Make sorting function used in TwinVQ a shared function
vitor
parents: 10517
diff changeset
167 void ff_sort_nearly_sorted_floats(float *vals, int len)
f2f4d6fe3f6d Make sorting function used in TwinVQ a shared function
vitor
parents: 10517
diff changeset
168 {
f2f4d6fe3f6d Make sorting function used in TwinVQ a shared function
vitor
parents: 10517
diff changeset
169 int i,j;
f2f4d6fe3f6d Make sorting function used in TwinVQ a shared function
vitor
parents: 10517
diff changeset
170
f2f4d6fe3f6d Make sorting function used in TwinVQ a shared function
vitor
parents: 10517
diff changeset
171 for (i = 0; i < len - 1; i++)
f2f4d6fe3f6d Make sorting function used in TwinVQ a shared function
vitor
parents: 10517
diff changeset
172 for (j = i; j >= 0 && vals[j] > vals[j+1]; j--)
f2f4d6fe3f6d Make sorting function used in TwinVQ a shared function
vitor
parents: 10517
diff changeset
173 FFSWAP(float, vals[j], vals[j+1]);
f2f4d6fe3f6d Make sorting function used in TwinVQ a shared function
vitor
parents: 10517
diff changeset
174 }