Mercurial > libavcodec.hg
annotate lsp.c @ 12197:fbf4d5b1b664 libavcodec
Remove FF_MM_SSE2/3 flags for CPUs where this is generally not faster than
regular MMX code. Examples of this are the Core1 CPU. Instead, set a new flag,
FF_MM_SSE2/3SLOW, which can be checked for particular SSE2/3 functions that
have been checked specifically on such CPUs and are actually faster than
their MMX counterparts.
In addition, use this flag to enable particular VP8 and LPC SSE2 functions
that are faster than their MMX counterparts.
Based on a patch by Loren Merritt <lorenm AT u washington edu>.
author | rbultje |
---|---|
date | Mon, 19 Jul 2010 22:38:23 +0000 |
parents | d7808ddcbcee |
children | 2dd67ed2f947 |
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 | 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 | 93 int f1[MAX_LP_HALF_ORDER+1]; // (3.22) |
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 | 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 | 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 } |