Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavcodec
lpc.h
Go to the documentation of this file.
1
22
#ifndef AVCODEC_LPC_H
23
#define AVCODEC_LPC_H
24
25
#include <stdint.h>
26
#include "
dsputil.h
"
27
28
#define ORDER_METHOD_EST 0
29
#define ORDER_METHOD_2LEVEL 1
30
#define ORDER_METHOD_4LEVEL 2
31
#define ORDER_METHOD_8LEVEL 3
32
#define ORDER_METHOD_SEARCH 4
33
#define ORDER_METHOD_LOG 5
34
35
#define MIN_LPC_ORDER 1
36
#define MAX_LPC_ORDER 32
37
41
enum
FFLPCType
{
42
FF_LPC_TYPE_DEFAULT
= -1,
43
FF_LPC_TYPE_NONE
= 0,
44
FF_LPC_TYPE_FIXED
= 1,
45
FF_LPC_TYPE_LEVINSON
= 2,
46
FF_LPC_TYPE_CHOLESKY
= 3,
47
FF_LPC_TYPE_NB
,
48
};
49
50
typedef
struct
LPCContext
{
51
int
blocksize
;
52
int
max_order
;
53
enum
FFLPCType
lpc_type
;
54
double
*
windowed_samples
;
55
64
void
(*
lpc_apply_welch_window
)(
const
int32_t *
data
,
int
len
,
65
double
*w_data);
79
void
(*
lpc_compute_autocorr
)(
const
double
*
data
,
int
len
,
int
lag,
80
double
*autoc);
81
}
LPCContext
;
82
83
87
int
ff_lpc_calc_coefs
(
LPCContext
*s,
88
const
int32_t *
samples
,
int
blocksize,
int
min_order,
89
int
max_order,
int
precision,
90
int32_t coefs[][
MAX_LPC_ORDER
],
int
*shift,
91
enum
FFLPCType
lpc_type,
int
lpc_passes,
92
int
omethod,
int
max_shift,
int
zero_shift);
93
97
int
ff_lpc_init
(
LPCContext
*s,
int
blocksize,
int
max_order,
98
enum
FFLPCType
lpc_type);
99
void
ff_lpc_init_x86
(
LPCContext
*s);
100
104
void
ff_lpc_end
(
LPCContext
*s);
105
106
#ifdef LPC_USE_DOUBLE
107
#define LPC_TYPE double
108
#else
109
#define LPC_TYPE float
110
#endif
111
116
static
inline
int
compute_lpc_coefs
(
const
LPC_TYPE
*autoc,
int
max_order,
117
LPC_TYPE
*lpc,
int
lpc_stride,
int
fail,
118
int
normalize)
119
{
120
int
i, j;
121
LPC_TYPE
err;
122
LPC_TYPE
*lpc_last = lpc;
123
124
if
(normalize)
125
err = *autoc++;
126
127
if
(fail && (autoc[max_order - 1] == 0 || err <= 0))
128
return
-1;
129
130
for
(i=0; i<max_order; i++) {
131
LPC_TYPE
r
= -autoc[i];
132
133
if
(normalize) {
134
for
(j=0; j<i; j++)
135
r -= lpc_last[j] * autoc[i-j-1];
136
137
r /= err;
138
err *= 1.0 - (r *
r
);
139
}
140
141
lpc[i] =
r
;
142
143
for
(j=0; j < (i+1)>>1; j++) {
144
LPC_TYPE
f
= lpc_last[ j];
145
LPC_TYPE
b
= lpc_last[i-1-j];
146
lpc[ j] = f + r *
b
;
147
lpc[i-1-j] = b + r *
f
;
148
}
149
150
if
(fail && err < 0)
151
return
-1;
152
153
lpc_last = lpc;
154
lpc += lpc_stride;
155
}
156
157
return
0;
158
}
159
160
#endif
/* AVCODEC_LPC_H */