Asterisk - The Open Source Telephony Project
GIT-master-f36a736
codecs
gsm
src
preprocess.c
Go to the documentation of this file.
1
/*
2
* Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
3
* Universitaet Berlin. See the accompanying file "COPYRIGHT" for
4
* details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
5
*/
6
7
/* $Header$ */
8
9
#include <stdio.h>
10
#include <assert.h>
11
12
#include "private.h"
13
14
#include "
gsm.h
"
15
#include "
proto.h
"
16
17
/* 4.2.0 .. 4.2.3 PREPROCESSING SECTION
18
*
19
* After A-law to linear conversion (or directly from the
20
* Ato D converter) the following scaling is assumed for
21
* input to the RPE-LTP algorithm:
22
*
23
* in: 0.1.....................12
24
* S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.*
25
*
26
* Where S is the sign bit, v a valid bit, and * a "don't care" bit.
27
* The original signal is called sop[..]
28
*
29
* out: 0.1................... 12
30
* S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0
31
*/
32
33
34
void
Gsm_Preprocess
P3
((
S
, s, so),
35
struct
gsm_state
*
S
,
36
word
* s,
37
word
* so )
/* [0..159] IN/OUT */
38
{
39
word
z1 =
S
->z1;
40
longword
L_z2 =
S
->L_z2;
41
word
mp =
S
->mp;
42
word
s1;
43
word
SO;
44
ulongword
utmp;
/* for L_ADD */
45
register
int
k = 160;
46
47
(void) utmp;
48
49
while
(k--) {
50
51
/* 4.2.1 Downscaling of the input signal
52
*/
53
/* SO = SASR( *s, 3 ) << 2;*/
54
SO =
SASR
( *s, 1 ) & ~3;
55
s++;
56
57
assert (SO >= -0x4000);
/* downscaled by */
58
assert (SO <= 0x3FFC);
/* previous routine. */
59
60
61
/* 4.2.2 Offset compensation
62
*
63
* This part implements a high-pass filter and requires extended
64
* arithmetic precision for the recursive part of this filter.
65
* The input of this procedure is the array so[0...159] and the
66
* output the array sof[ 0...159 ].
67
*/
68
/* Compute the non-recursive part
69
*/
70
71
s1 = SO - z1;
/* s1 = gsm_sub( *so, z1 ); */
72
z1 = SO;
73
74
assert(s1 !=
MIN_WORD
);
75
76
/* SJB Remark: float might be faster than the mess that follows */
77
78
/* Compute the recursive part
79
*/
80
81
/* Execution of a 31 bv 16 bits multiplication
82
*/
83
{
84
word
msp;
85
#ifndef __GNUC__
86
word
lsp;
87
#endif
88
longword
L_s2;
89
longword
L_temp;
90
91
L_s2 = s1;
92
L_s2 <<= 15;
93
#ifndef __GNUC__
94
msp = (
word
)
SASR
( L_z2, 15 );
95
lsp = (
word
)(L_z2 & 0x7fff);
/* gsm_L_sub(L_z2,(msp<<15)); */
96
97
L_s2 +=
GSM_MULT_R
( lsp, 32735 );
98
L_temp = (
longword
)msp * 32735;
/* GSM_L_MULT(msp,32735) >> 1;*/
99
L_z2 =
GSM_L_ADD
( L_temp, L_s2 );
100
/* above does L_z2 = L_z2 * 0x7fd5/0x8000 + L_s2 */
101
#else
102
L_z2 = ((
long
long)L_z2*32735 + 0x4000)>>15;
103
/* alternate (ansi) version of above line does slightly different rounding:
104
* L_temp = L_z2 >> 9;
105
* L_temp += L_temp >> 5;
106
* L_temp = (++L_temp) >> 1;
107
* L_z2 = L_z2 - L_temp;
108
*/
109
L_z2 =
GSM_L_ADD
(L_z2,L_s2);
110
#endif
111
/* Compute sof[k] with rounding
112
*/
113
L_temp =
GSM_L_ADD
( L_z2, 16384 );
114
115
/* 4.2.3 Preemphasis
116
*/
117
118
msp = (
word
)
GSM_MULT_R
( mp, -28180 );
119
mp = (
word
)
SASR
( L_temp, 15 );
120
*so++ =
GSM_ADD
( mp, msp );
121
}
122
}
123
124
S
->z1 = z1;
125
S
->L_z2 = L_z2;
126
S
->mp = mp;
127
}
S
#define S(e)
word
short word
Definition:
codecs/gsm/inc/private.h:12
MIN_WORD
#define MIN_WORD
Definition:
codecs/gsm/inc/private.h:44
SASR
#define SASR(x, by)
Definition:
codecs/gsm/inc/private.h:54
ulongword
unsigned long ulongword
Definition:
codecs/gsm/inc/private.h:16
GSM_MULT_R
#define GSM_MULT_R(a, b)
Definition:
codecs/gsm/inc/private.h:92
GSM_L_ADD
#define GSM_L_ADD(a, b)
Definition:
codecs/gsm/inc/private.h:144
GSM_ADD
static word GSM_ADD(longword a, longword b)
Definition:
codecs/gsm/inc/private.h:152
longword
long longword
Definition:
codecs/gsm/inc/private.h:13
gsm.h
P3
void Gsm_Preprocess P3((S, s, so), struct gsm_state *S, word *s, word *so)
Definition:
preprocess.c:34
proto.h
gsm_state
Definition:
codecs/gsm/inc/private.h:18
Generated on Wed Dec 18 2024 20:04:15 for Asterisk - The Open Source Telephony Project by
1.9.4