FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
lsp.h
Go to the documentation of this file.
1
/*
2
* LSP computing for ACELP-based codecs
3
*
4
* Copyright (c) 2008 Vladimir Voroshilov
5
*
6
* This file is part of FFmpeg.
7
*
8
* FFmpeg is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU Lesser General Public
10
* License as published by the Free Software Foundation; either
11
* version 2.1 of the License, or (at your option) any later version.
12
*
13
* FFmpeg is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* Lesser General Public License for more details.
17
*
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with FFmpeg; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
*/
22
23
#ifndef AVCODEC_LSP_H
24
#define AVCODEC_LSP_H
25
26
#include <stdint.h>
27
28
/**
29
(I.F) means fixed-point value with F fractional and I integer bits
30
*/
31
32
/**
33
* @brief ensure a minimum distance between LSFs
34
* @param[in,out] lsfq LSF to check and adjust
35
* @param lsfq_min_distance minimum distance between LSFs
36
* @param lsfq_min minimum allowed LSF value
37
* @param lsfq_max maximum allowed LSF value
38
* @param lp_order LP filter order
39
*/
40
void
ff_acelp_reorder_lsf
(int16_t* lsfq,
int
lsfq_min_distance,
int
lsfq_min,
int
lsfq_max,
int
lp_order);
41
42
/**
43
* Adjust the quantized LSFs so they are increasing and not too close.
44
*
45
* This step is not mentioned in the AMR spec but is in the reference C decoder.
46
* Omitting this step creates audible distortion on the sinusoidal sweep
47
* test vectors in 3GPP TS 26.074.
48
*
49
* @param[in,out] lsf LSFs in Hertz
50
* @param min_spacing minimum distance between two consecutive lsf values
51
* @param size size of the lsf vector
52
*/
53
void
ff_set_min_dist_lsf
(
float
*lsf,
double
min_spacing,
int
size
);
54
55
/**
56
* @brief Convert LSF to LSP
57
* @param[out] lsp LSP coefficients (-0x8000 <= (0.15) < 0x8000)
58
* @param lsf normalized LSF coefficients (0 <= (2.13) < 0x2000 * PI)
59
* @param lp_order LP filter order
60
*
61
* @remark It is safe to pass the same array into the lsf and lsp parameters.
62
*/
63
void
ff_acelp_lsf2lsp
(int16_t *lsp,
const
int16_t *lsf,
int
lp_order);
64
65
/**
66
* Floating point version of ff_acelp_lsf2lsp()
67
*/
68
void
ff_acelp_lsf2lspd
(
double
*lsp,
const
float
*lsf,
int
lp_order);
69
70
/**
71
* @brief LSP to LP conversion (3.2.6 of G.729)
72
* @param[out] lp decoded LP coefficients (-0x8000 <= (3.12) < 0x8000)
73
* @param lsp LSP coefficients (-0x8000 <= (0.15) < 0x8000)
74
* @param lp_half_order LP filter order, divided by 2
75
*/
76
void
ff_acelp_lsp2lpc
(int16_t* lp,
const
int16_t* lsp,
int
lp_half_order);
77
78
/**
79
* LSP to LP conversion (5.2.4 of AMR-WB)
80
*/
81
void
ff_amrwb_lsp2lpc
(
const
double
*lsp,
float
*lp,
int
lp_order);
82
83
/**
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)
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)
87
* @param lsp_2nd LSP coefficients of the second subframe (-0x8000 <= (0.15) < 0x8000)
88
* @param lsp_prev LSP coefficients from the second subframe of the previous frame (-0x8000 <= (0.15) < 0x8000)
89
* @param lp_order LP filter order
90
*/
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);
92
93
94
#define MAX_LP_HALF_ORDER 10
95
#define MAX_LP_ORDER (2*MAX_LP_HALF_ORDER)
96
97
/**
98
* Reconstruct LPC coefficients from the line spectral pair frequencies.
99
*
100
* @param lsp line spectral pairs in cosine domain
101
* @param lpc linear predictive coding coefficients
102
* @param lp_half_order half the number of the amount of LPCs to be
103
* reconstructed, need to be smaller or equal to MAX_LP_HALF_ORDER
104
*
105
* @note buffers should have a minimux size of 2*lp_half_order elements.
106
*
107
* TIA/EIA/IS-733 2.4.3.3.5
108
*/
109
void
ff_acelp_lspd2lpc
(
const
double
*lsp,
float
*lpc,
int
lp_half_order);
110
111
/**
112
* Sort values in ascending order.
113
*
114
* @note O(n) if data already sorted, O(n^2) - otherwise
115
*/
116
void
ff_sort_nearly_sorted_floats
(
float
*vals,
int
len
);
117
118
/**
119
* Compute the Pa / (1 + z(-1)) or Qa / (1 - z(-1)) coefficients
120
* needed for LSP to LPC conversion.
121
* We only need to calculate the 6 first elements of the polynomial.
122
*
123
* @param lsp line spectral pairs in cosine domain
124
* @param[out] f polynomial input/output as a vector
125
*
126
* TIA/EIA/IS-733 2.4.3.3.5-1/2
127
*/
128
void
ff_lsp2polyf
(
const
double
*lsp,
double
*f,
int
lp_half_order);
129
130
#endif
/* AVCODEC_LSP_H */
Generated on Sat Jan 25 2014 19:51:50 for FFmpeg by
1.8.2