FFmpeg
libavcodec
lpc_functions.h
Go to the documentation of this file.
1
/*
2
* LPC utility functions
3
* Copyright (c) 2006 Justin Ruggles <justin.ruggles@gmail.com>
4
*
5
* This file is part of FFmpeg.
6
*
7
* FFmpeg is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* FFmpeg is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with FFmpeg; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
#ifndef AVCODEC_LPC_FUNCTIONS_H
23
#define AVCODEC_LPC_FUNCTIONS_H
24
25
#include "
libavutil/avassert.h
"
26
27
#ifndef LPC_USE_FIXED
28
#define LPC_USE_FIXED 0
29
#endif
30
31
#if LPC_USE_FIXED
32
typedef
int
LPC_TYPE
;
33
typedef
unsigned
LPC_TYPE_U
;
34
#else
35
#ifndef LPC_SRA_R
36
#define LPC_SRA_R(x, y) (x)
37
#define LPC_MUL26(x, y) ((x) * (y))
38
#define LPC_FIXR(x) ((float)(x))
39
#endif
40
41
#ifdef LPC_USE_DOUBLE
42
typedef
double
LPC_TYPE
;
43
typedef
double
LPC_TYPE_U
;
44
#else
45
typedef
float
LPC_TYPE
;
46
typedef
float
LPC_TYPE_U
;
47
#endif
48
#endif // USE_FIXED
49
50
/**
51
* Levinson-Durbin recursion.
52
* Produce LPC coefficients from autocorrelation data.
53
*/
54
static
inline
int
compute_lpc_coefs
(
const
LPC_TYPE
*autoc,
int
max_order,
55
LPC_TYPE
*lpc,
int
lpc_stride,
int
fail
,
56
int
normalize
)
57
{
58
LPC_TYPE
err = 0;
59
LPC_TYPE
*lpc_last = lpc;
60
61
av_assert2
(
normalize
|| !
fail
);
62
63
if
(
normalize
)
64
err = *autoc++;
65
66
if
(
fail
&& (autoc[max_order - 1] == 0 || err <= 0))
67
return
-1;
68
69
for
(
int
i
= 0;
i
< max_order;
i
++) {
70
LPC_TYPE
r
=
LPC_SRA_R
(-autoc[
i
], 5);
71
72
if
(
normalize
) {
73
for
(
int
j = 0; j <
i
; j++)
74
r
-= lpc_last[j] * autoc[
i
-j-1];
75
76
if
(err)
77
r
/= err;
78
err *=
LPC_FIXR
(1.0) - (
r
*
r
);
79
}
80
81
lpc[
i
] =
r
;
82
83
for
(
int
j = 0; j < (
i
+ 1) >> 1; j++) {
84
LPC_TYPE
f
= lpc_last[ j];
85
LPC_TYPE
b
= lpc_last[
i
-1-j];
86
lpc[ j] =
f
+ (
LPC_TYPE_U
)
LPC_MUL26
(
r
,
b
);
87
lpc[
i
-1-j] =
b
+ (
LPC_TYPE_U
)
LPC_MUL26
(
r
,
f
);
88
}
89
90
if
(
fail
&& err < 0)
91
return
-1;
92
93
lpc_last = lpc;
94
lpc += lpc_stride;
95
}
96
97
return
0;
98
}
99
100
#endif
/* AVCODEC_LPC_FUNCTIONS_H */
r
const char * r
Definition:
vf_curves.c:127
b
#define b
Definition:
input.c:41
fail
#define fail()
Definition:
checkasm.h:193
avassert.h
LPC_MUL26
#define LPC_MUL26(x, y)
Definition:
lpc_functions.h:37
compute_lpc_coefs
static int compute_lpc_coefs(const LPC_TYPE *autoc, int max_order, LPC_TYPE *lpc, int lpc_stride, int fail, int normalize)
Levinson-Durbin recursion.
Definition:
lpc_functions.h:54
f
f
Definition:
af_crystalizer.c:122
normalize
Definition:
normalize.py:1
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition:
avassert.h:67
i
#define i(width, name, range_min, range_max)
Definition:
cbs_h2645.c:256
LPC_TYPE_U
float LPC_TYPE_U
Definition:
lpc_functions.h:46
LPC_TYPE
float LPC_TYPE
Definition:
lpc_functions.h:45
LPC_FIXR
#define LPC_FIXR(x)
Definition:
lpc_functions.h:38
LPC_SRA_R
#define LPC_SRA_R(x, y)
Definition:
lpc_functions.h:36
Generated on Fri Dec 13 2024 19:21:45 for FFmpeg by
1.8.17