Mercurial > libavcodec.hg
annotate lsp.h @ 12483:0159a19bfff7 libavcodec
aacdec: Rework channel mapping compatibility hacks.
For a PCE based configuration map the channels solely based on tags.
For an indexed configuration map the channels solely based on position.
This works with all known exotic samples including al17, elem_id0, bad_concat,
and lfe_is_sce.
author | alexc |
---|---|
date | Fri, 10 Sep 2010 18:01:48 +0000 |
parents | 1921e24d5886 |
children |
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 computing for ACELP-based codecs |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
3 * |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
4 * Copyright (c) 2008 Vladimir Voroshilov |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
5 * |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
6 * This file is part of FFmpeg. |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
7 * |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
8 * 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
|
9 * 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
|
10 * 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
|
11 * 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
|
12 * |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
13 * 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
|
14 * 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
|
15 * 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
|
16 * Lesser General Public License for more details. |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
17 * |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
18 * 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
|
19 * 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
|
20 * 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
|
21 */ |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
22 |
7760 | 23 #ifndef AVCODEC_LSP_H |
24 #define AVCODEC_LSP_H | |
6735 | 25 |
26 #include <stdint.h> | |
27 | |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
28 /** |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
29 (I.F) means fixed-point value with F fractional and I integer bits |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
30 */ |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
31 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
32 /** |
6706
2cb901474f6f
Grammar fixes and improvements for the new ACELP code
superdump
parents:
6685
diff
changeset
|
33 * \brief ensure a minimum distance between LSFs |
12181 | 34 * \param[in,out] lsfq LSF to check and adjust |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
35 * \param lsfq_min_distance minimum distance between LSFs |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
36 * \param lsfq_min minimum allowed LSF value |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
37 * \param lsfq_max maximum allowed LSF value |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6735
diff
changeset
|
38 * \param lp_order LP filter order |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
39 */ |
7248 | 40 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
|
41 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
42 /** |
10463
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10011
diff
changeset
|
43 * Adjust the quantized LSFs so they are increasing and not too close. |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10011
diff
changeset
|
44 * |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10011
diff
changeset
|
45 * This step is not mentioned in the AMR spec but is in the reference C decoder. |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10011
diff
changeset
|
46 * Omitting this step creates audible distortion on the sinusoidal sweep |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10011
diff
changeset
|
47 * test vectors in 3GPP TS 26.074. |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10011
diff
changeset
|
48 * |
12165
4f06422196ee
Restore mistakenly removed [in]/[out] Doxygen parameter attributes.
diego
parents:
12066
diff
changeset
|
49 * @param[in,out] lsf LSFs in Hertz |
10463
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10011
diff
changeset
|
50 * @param min_spacing minimum distance between two consecutive lsf values |
12066
57fba1b7867b
Fix the signature of ff_set_min_dist_lsf() to match the implementation
diego
parents:
12062
diff
changeset
|
51 * @param size size of the lsf vector |
10463
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10011
diff
changeset
|
52 */ |
12066
57fba1b7867b
Fix the signature of ff_set_min_dist_lsf() to match the implementation
diego
parents:
12062
diff
changeset
|
53 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
|
54 |
9f35b262d3f0
Commit some functions that are used by both SIPR and AMR.
vitor
parents:
10011
diff
changeset
|
55 /** |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
56 * \brief Convert LSF to LSP |
12181 | 57 * \param[out] lsp LSP coefficients (-0x8000 <= (0.15) < 0x8000) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
58 * \param lsf normalized LSF coefficients (0 <= (2.13) < 0x2000 * PI) |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6735
diff
changeset
|
59 * \param lp_order LP filter order |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
60 * |
6706
2cb901474f6f
Grammar fixes and improvements for the new ACELP code
superdump
parents:
6685
diff
changeset
|
61 * \remark It is safe to pass the same array into the lsf and lsp parameters. |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
62 */ |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6735
diff
changeset
|
63 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
|
64 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
65 /** |
12464
2dd67ed2f947
Move AMRNB lsf2lsp() function to common code for using in future AMRWB decoder.
vitor
parents:
12181
diff
changeset
|
66 * Floating point version of ff_acelp_lsf2lsp() |
2dd67ed2f947
Move AMRNB lsf2lsp() function to common code for using in future AMRWB decoder.
vitor
parents:
12181
diff
changeset
|
67 */ |
2dd67ed2f947
Move AMRNB lsf2lsp() function to common code for using in future AMRWB decoder.
vitor
parents:
12181
diff
changeset
|
68 void ff_acelp_lsf2lspd(double *lsp, const float *lsf, int lp_order); |
2dd67ed2f947
Move AMRNB lsf2lsp() function to common code for using in future AMRWB decoder.
vitor
parents:
12181
diff
changeset
|
69 |
2dd67ed2f947
Move AMRNB lsf2lsp() function to common code for using in future AMRWB decoder.
vitor
parents:
12181
diff
changeset
|
70 /** |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
71 * \brief LSP to LP conversion (3.2.6 of G.729) |
12181 | 72 * \param[out] lp decoded LP coefficients (-0x8000 <= (3.12) < 0x8000) |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
73 * \param lsp LSP coefficients (-0x8000 <= (0.15) < 0x8000) |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6735
diff
changeset
|
74 * \param lp_half_order LP filter order, divided by 2 |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
75 */ |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6735
diff
changeset
|
76 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
|
77 |
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
78 /** |
12465
1921e24d5886
Move lsp2lpc_sipr() function to common code so it can be reused in a
vitor
parents:
12464
diff
changeset
|
79 * LSP to LP conversion (5.2.4 of AMR-WB) |
1921e24d5886
Move lsp2lpc_sipr() function to common code so it can be reused in a
vitor
parents:
12464
diff
changeset
|
80 */ |
1921e24d5886
Move lsp2lpc_sipr() function to common code so it can be reused in a
vitor
parents:
12464
diff
changeset
|
81 void ff_amrwb_lsp2lpc(const double *lsp, float *lp, int lp_order); |
1921e24d5886
Move lsp2lpc_sipr() function to common code so it can be reused in a
vitor
parents:
12464
diff
changeset
|
82 |
1921e24d5886
Move lsp2lpc_sipr() function to common code so it can be reused in a
vitor
parents:
12464
diff
changeset
|
83 /** |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
84 * \brief Interpolate LSP for the first subframe and convert LSP -> LP for both subframes (3.2.5 and 3.2.6 of G.729) |
12181 | 85 * \param[out] lp_1st decoded LP coefficients for first subframe (-0x8000 <= (3.12) < 0x8000) |
86 * \param[out] lp_2nd decoded LP coefficients for second subframe (-0x8000 <= (3.12) < 0x8000) | |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
87 * \param lsp_2nd LSP coefficients of the second subframe (-0x8000 <= (0.15) < 0x8000) |
6706
2cb901474f6f
Grammar fixes and improvements for the new ACELP code
superdump
parents:
6685
diff
changeset
|
88 * \param lsp_prev LSP coefficients from the second subframe of the previous frame (-0x8000 <= (0.15) < 0x8000) |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6735
diff
changeset
|
89 * \param lp_order LP filter order |
6685
df4f7cf1ee5f
Fixed-point LSP and LPC decoding routines for ACELP-based codecs
voroshil
parents:
diff
changeset
|
90 */ |
6770
e6338dd4a6e3
Replace hardcoded LP filter order with parameter.
voroshil
parents:
6735
diff
changeset
|
91 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
|
92 |
10506
a1d84a5cf21d
Avoid variable-length array use in ff_acelp_lspd2lpc()
vitor
parents:
10502
diff
changeset
|
93 |
a1d84a5cf21d
Avoid variable-length array use in ff_acelp_lspd2lpc()
vitor
parents:
10502
diff
changeset
|
94 #define MAX_LP_HALF_ORDER 8 |
11961 | 95 #define MAX_LP_ORDER (2*MAX_LP_HALF_ORDER) |
10506
a1d84a5cf21d
Avoid variable-length array use in ff_acelp_lspd2lpc()
vitor
parents:
10502
diff
changeset
|
96 |
10011
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
7760
diff
changeset
|
97 /** |
12024 | 98 * Reconstruct LPC coefficients from the line spectral pair frequencies. |
10011
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
7760
diff
changeset
|
99 * |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
7760
diff
changeset
|
100 * @param lsp line spectral pairs in cosine domain |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
7760
diff
changeset
|
101 * @param lpc linear predictive coding coefficients |
10506
a1d84a5cf21d
Avoid variable-length array use in ff_acelp_lspd2lpc()
vitor
parents:
10502
diff
changeset
|
102 * @param lp_half_order half the number of the amount of LPCs to be |
a1d84a5cf21d
Avoid variable-length array use in ff_acelp_lspd2lpc()
vitor
parents:
10502
diff
changeset
|
103 * reconstructed, need to be smaller or equal to MAX_LP_HALF_ORDER |
10011
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
7760
diff
changeset
|
104 * |
10502
f132cde57bbe
Do not hardcode filter order in ff_acelp_lspd2lpc()
vitor
parents:
10463
diff
changeset
|
105 * @note buffers should have a minimux size of 2*lp_half_order elements. |
f132cde57bbe
Do not hardcode filter order in ff_acelp_lspd2lpc()
vitor
parents:
10463
diff
changeset
|
106 * |
10011
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
7760
diff
changeset
|
107 * TIA/EIA/IS-733 2.4.3.3.5 |
c1cfa4679371
Expose QCELP's floating-point LSP-to-LPC function
superdump
parents:
7760
diff
changeset
|
108 */ |
10502
f132cde57bbe
Do not hardcode filter order in ff_acelp_lspd2lpc()
vitor
parents:
10463
diff
changeset
|
109 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:
7760
diff
changeset
|
110 |
10557
f2f4d6fe3f6d
Make sorting function used in TwinVQ a shared function
vitor
parents:
10517
diff
changeset
|
111 /** |
f2f4d6fe3f6d
Make sorting function used in TwinVQ a shared function
vitor
parents:
10517
diff
changeset
|
112 * Sort values in ascending order. |
f2f4d6fe3f6d
Make sorting function used in TwinVQ a shared function
vitor
parents:
10517
diff
changeset
|
113 * |
f2f4d6fe3f6d
Make sorting function used in TwinVQ a shared function
vitor
parents:
10517
diff
changeset
|
114 * @note O(n) if data already sorted, O(n^2) - otherwise |
f2f4d6fe3f6d
Make sorting function used in TwinVQ a shared function
vitor
parents:
10517
diff
changeset
|
115 */ |
f2f4d6fe3f6d
Make sorting function used in TwinVQ a shared function
vitor
parents:
10517
diff
changeset
|
116 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
|
117 |
10567
d4ca61e293a3
Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents:
10557
diff
changeset
|
118 /** |
12024 | 119 * Compute the Pa / (1 + z(-1)) or Qa / (1 - z(-1)) coefficients |
10567
d4ca61e293a3
Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents:
10557
diff
changeset
|
120 * needed for LSP to LPC conversion. |
d4ca61e293a3
Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents:
10557
diff
changeset
|
121 * We only need to calculate the 6 first elements of the polynomial. |
d4ca61e293a3
Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents:
10557
diff
changeset
|
122 * |
d4ca61e293a3
Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents:
10557
diff
changeset
|
123 * @param lsp line spectral pairs in cosine domain |
12181 | 124 * @param[out] f polynomial input/output as a vector |
10567
d4ca61e293a3
Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents:
10557
diff
changeset
|
125 * |
d4ca61e293a3
Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents:
10557
diff
changeset
|
126 * TIA/EIA/IS-733 2.4.3.3.5-1/2 |
d4ca61e293a3
Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents:
10557
diff
changeset
|
127 */ |
d4ca61e293a3
Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents:
10557
diff
changeset
|
128 void ff_lsp2polyf(const double *lsp, double *f, int lp_half_order); |
d4ca61e293a3
Make lsp2polyf() function non-static for upcoming usage in SIPR
vitor
parents:
10557
diff
changeset
|
129 |
7760 | 130 #endif /* AVCODEC_LSP_H */ |