2
|
1 /* Version 3.01 - 31.Jan.2000
|
|
2 =============================================================================
|
|
3
|
|
4 U U GGG SSS TTTTT
|
|
5 U U G S T
|
|
6 U U G GG SSS T
|
|
7 U U G G S T
|
|
8 UUUU GGG SSS T
|
|
9
|
|
10 ========================================
|
|
11 ITU-T - USER'S GROUP ON SOFTWARE TOOLS
|
|
12 ========================================
|
|
13
|
|
14
|
|
15 =============================================================
|
|
16 COPYRIGHT NOTE: This source code, and all of its derivations,
|
|
17 is subject to the "ITU-T General Public License". Please have
|
|
18 it read in the distribution disk, or in the ITU-T
|
|
19 Recommendation G.191 on "SOFTWARE TOOLS FOR SPEECH AND AUDIO
|
|
20 CODING STANDARDS".
|
|
21 =============================================================
|
|
22
|
|
23
|
|
24 MODULE: G711.C, G.711 ENCODING/DECODING FUNCTIONS
|
|
25
|
|
26 ORIGINAL BY:
|
|
27
|
|
28 Simao Ferraz de Campos Neto Rudolf Hofmann
|
|
29 CPqD/Telebras PHILIPS KOMMUNIKATIONS INDUSTRIE AG
|
|
30 DDS/Pr.11 Kommunikationssysteme
|
|
31 Rd. Mogi Mirim-Campinas Km.118 Thurn-und-Taxis-Strasse 14
|
|
32 13.085 - Campinas - SP (Brazil) D-8500 Nuernberg 10 (Germany)
|
|
33
|
|
34 Phone : +55-192-39-6396 Phone : +49 911 526-2603
|
|
35 FAX : +55-192-53-4754 FAX : +49 911 526-3385
|
|
36 EMail : tdsimao@venus.cpqd.ansp.br EMail : HF@PKINBG.UUCP
|
|
37
|
|
38
|
|
39 FUNCTIONS:
|
|
40
|
|
41 alaw_compress: ... compands 1 vector of linear PCM samples to A-law;
|
|
42 uses 13 Most Sig.Bits (MSBs) from input and 8 Least
|
|
43 Sig. Bits (LSBs) on output.
|
|
44
|
|
45 alaw_expand: ..... expands 1 vector of A-law samples to linear PCM;
|
|
46 use 8 Least Sig. Bits (LSBs) from input and
|
|
47 13 Most Sig.Bits (MSBs) on output.
|
|
48
|
|
49 ulaw_compress: ... compands 1 vector of linear PCM samples to u-law;
|
|
50 uses 14 Most Sig.Bits (MSBs) from input and 8 Least
|
|
51 Sig. Bits (LSBs) on output.
|
|
52
|
|
53 ulaw_expand: ..... expands 1 vector of u-law samples to linear PCM
|
|
54 use 8 Least Sig. Bits (LSBs) from input and
|
|
55 14 Most Sig.Bits (MSBs) on output.
|
|
56
|
|
57 PROTOTYPES: in g711.h
|
|
58
|
|
59 HISTORY:
|
|
60 Apr/91 1.0 First version of the G711 module
|
|
61 10/Dec/1991 2.0 Break-up in individual functions for A,u law;
|
|
62 correction of bug in compression routines (use of 1
|
|
63 and 2 complement); Demo program inside module.
|
|
64 08/Feb/1992 3.0 Demo as separate file;
|
|
65 31/Jan/2000 3.01 Updated documentation text; no change in functions
|
|
66 <simao.campos@labs.comsat.com>
|
|
67 13jan2005 Byte for compressed data
|
|
68 =============================================================================
|
|
69 */
|
|
70
|
|
71 /*
|
|
72 * .......... I N C L U D E S ..........
|
|
73 */
|
|
74
|
|
75 /* Global prototype functions */
|
|
76 #include "g711.h"
|
|
77
|
|
78 /*
|
|
79 * .......... F U N C T I O N S ..........
|
|
80 */
|
|
81
|
|
82 /* ................... Begin of alaw_compress() ..................... */
|
|
83 /*
|
|
84 ==========================================================================
|
|
85
|
|
86 FUNCTION NAME: alaw_compress
|
|
87
|
|
88 DESCRIPTION: ALaw encoding rule according ITU-T Rec. G.711.
|
|
89
|
|
90 PROTOTYPE: void alaw_compress(long lseg, short *linbuf, short *logbuf)
|
|
91
|
|
92 PARAMETERS:
|
|
93 lseg: (In) number of samples
|
|
94 linbuf: (In) buffer with linear samples (only 12 MSBits are taken
|
|
95 into account)
|
|
96 logbuf: (Out) buffer with compressed samples (8 bit right justified,
|
|
97 without sign extension)
|
|
98
|
|
99 RETURN VALUE: none.
|
|
100
|
|
101 HISTORY:
|
|
102 10.Dec.91 1.0 Separated A-law compression function
|
|
103
|
|
104 ==========================================================================
|
|
105 */
|
|
106 void alaw_compress(long lseg, short *linbuf, Byte *logbuf)
|
|
107 {
|
|
108 short ix, iexp;
|
|
109 long n;
|
|
110
|
|
111 for (n = 0; n < lseg; n++) {
|
|
112 ix = linbuf[n] < 0 /* 0 <= ix < 2048 */
|
|
113 ? (~linbuf[n]) >> 4 /* 1's complement for negative values */
|
|
114 : (linbuf[n]) >> 4;
|
|
115
|
|
116 /* Do more, if exponent > 0 */
|
|
117 if (ix > 15) { /* exponent=0 for ix <= 15 */
|
|
118 iexp = 1; /* first step: */
|
|
119 while (ix > 16 + 15) { /* find mantissa and exponent */
|
|
120 ix >>= 1;
|
|
121 iexp++;
|
|
122 }
|
|
123 ix -= 16; /* second step: remove leading '1' */
|
|
124
|
|
125 ix += iexp << 4; /* now compute encoded value */
|
|
126 }
|
|
127 if (linbuf[n] >= 0)
|
|
128 ix |= (0x0080); /* add sign bit */
|
|
129
|
|
130 logbuf[n] = ix ^ (0x0055); /* toggle even bits */
|
|
131 }
|
|
132 }
|
|
133
|
|
134 /* ................... End of alaw_compress() ..................... */
|
|
135
|
|
136
|
|
137 /* ................... Begin of alaw_expand() ..................... */
|
|
138 /*
|
|
139 ==========================================================================
|
|
140
|
|
141 FUNCTION NAME: alaw_expand
|
|
142
|
|
143 DESCRIPTION: ALaw decoding rule according ITU-T Rec. G.711.
|
|
144
|
|
145 PROTOTYPE: void alaw_expand(long lseg, short *logbuf, short *linbuf)
|
|
146
|
|
147 PARAMETERS:
|
|
148 lseg: (In) number of samples
|
|
149 logbuf: (In) buffer with compressed samples (8 bit right justified,
|
|
150 without sign extension)
|
|
151 linbuf: (Out) buffer with linear samples (13 bits left justified)
|
|
152
|
|
153 RETURN VALUE: none.
|
|
154
|
|
155 HISTORY:
|
|
156 10.Dec.91 1.0 Separated A-law expansion function
|
|
157
|
|
158 ============================================================================
|
|
159 */
|
|
160 void alaw_expand(long lseg, Byte *logbuf, short *linbuf)
|
|
161 {
|
|
162 short ix, mant, iexp;
|
|
163 long n;
|
|
164
|
|
165 for (n = 0; n < lseg; n++) {
|
|
166 ix = logbuf[n] ^ (0x0055); /* re-toggle toggled bits */
|
|
167
|
|
168 ix &= (0x007F); /* remove sign bit */
|
|
169 iexp = ix >> 4; /* extract exponent */
|
|
170 mant = ix & (0x000F); /* now get mantissa */
|
|
171 if (iexp > 0)
|
|
172 mant = mant + 16; /* add leading '1', if exponent > 0 */
|
|
173
|
|
174 mant = (mant << 4) + (0x0008); /* now mantissa left justified and */
|
|
175 /* 1/2 quantization step added */
|
|
176 if (iexp > 1) /* now left shift according exponent */
|
|
177 mant = mant << (iexp - 1);
|
|
178
|
|
179 linbuf[n] = logbuf[n] > 127 /* invert, if negative sample */
|
|
180 ? mant : -mant;
|
|
181 }
|
|
182 }
|
|
183
|
|
184 /* ................... End of alaw_expand() ..................... */
|
|
185
|
|
186
|
|
187 /* ................... Begin of ulaw_compress() ..................... */
|
|
188 /*
|
|
189 ==========================================================================
|
|
190
|
|
191 FUNCTION NAME: ulaw_compress
|
|
192
|
|
193 DESCRIPTION: Mu law encoding rule according ITU-T Rec. G.711.
|
|
194
|
|
195 PROTOTYPE: void ulaw_compress(long lseg, short *linbuf, short *logbuf)
|
|
196
|
|
197 PARAMETERS:
|
|
198 lseg: (In) number of samples
|
|
199 linbuf: (In) buffer with linear samples (only 12 MSBits are taken
|
|
200 into account)
|
|
201 logbuf: (Out) buffer with compressed samples (8 bit right justified,
|
|
202 without sign extension)
|
|
203
|
|
204 RETURN VALUE: none.
|
|
205
|
|
206 HISTORY:
|
|
207 10.Dec.91 1.0 Separated mu-law compression function
|
|
208
|
|
209 ==========================================================================
|
|
210 */
|
|
211 void ulaw_compress(long lseg, short *linbuf, Byte *logbuf)
|
|
212 {
|
|
213 long n; /* samples's count */
|
|
214 short i; /* aux.var. */
|
|
215 short absno; /* absolute value of linear (input) sample */
|
|
216 short segno; /* segment (Table 2/G711, column 1) */
|
|
217 short low_nibble; /* low nibble of log companded sample */
|
|
218 short high_nibble; /* high nibble of log companded sample */
|
|
219
|
|
220 for (n = 0; n < lseg; n++) {
|
|
221 /* -------------------------------------------------------------------- */
|
|
222 /* Change from 14 bit left justified to 14 bit right justified */
|
|
223 /* Compute absolute value; adjust for easy processing */
|
|
224 /* -------------------------------------------------------------------- */
|
|
225 absno = linbuf[n] < 0 /* compute 1's complement in case of */
|
|
226 ? ((~linbuf[n]) >> 2) + 33 /* negative samples */
|
|
227 : ((linbuf[n]) >> 2) + 33; /* NB: 33 is the difference value */
|
|
228 /* between the thresholds for */
|
|
229 /* A-law and u-law. */
|
|
230 if (absno > (0x1FFF)) /* limitation to "absno" < 8192 */
|
|
231 absno = (0x1FFF);
|
|
232
|
|
233 /* Determination of sample's segment */
|
|
234 i = absno >> 6;
|
|
235 segno = 1;
|
|
236 while (i != 0) {
|
|
237 segno++;
|
|
238 i >>= 1;
|
|
239 }
|
|
240
|
|
241 /* Mounting the high-nibble of the log-PCM sample */
|
|
242 high_nibble = (0x0008) - segno;
|
|
243
|
|
244 /* Mounting the low-nibble of the log PCM sample */
|
|
245 low_nibble = (absno >> segno) /* right shift of mantissa and */
|
|
246 &(0x000F); /* masking away leading '1' */
|
|
247 low_nibble = (0x000F) - low_nibble;
|
|
248
|
|
249 /* Joining the high-nibble and the low-nibble of the log PCM sample */
|
|
250 logbuf[n] = (high_nibble << 4) | low_nibble;
|
|
251
|
|
252 /* Add sign bit */
|
|
253 if (linbuf[n] >= 0)
|
|
254 logbuf[n] = logbuf[n] | (0x0080);
|
|
255 }
|
|
256 }
|
|
257
|
|
258 /* ................... End of ulaw_compress() ..................... */
|
|
259
|
|
260
|
|
261
|
|
262 /* ................... Begin of ulaw_expand() ..................... */
|
|
263 /*
|
|
264 ==========================================================================
|
|
265
|
|
266 FUNCTION NAME: ulaw_expand
|
|
267
|
|
268 DESCRIPTION: Mu law decoding rule according ITU-T Rec. G.711.
|
|
269
|
|
270 PROTOTYPE: void ulaw_expand(long lseg, short *logbuf, short *linbuf)
|
|
271
|
|
272 PARAMETERS:
|
|
273 lseg: (In) number of samples
|
|
274 logbuf: (In) buffer with compressed samples (8 bit right justified,
|
|
275 without sign extension)
|
|
276 linbuf: (Out) buffer with linear samples (14 bits left justified)
|
|
277
|
|
278 RETURN VALUE: none.
|
|
279
|
|
280 HISTORY:
|
|
281 10.Dec.91 1.0 Separated mu law expansion function
|
|
282
|
|
283 ============================================================================
|
|
284 */
|
|
285
|
|
286 void ulaw_expand(long lseg, Byte *logbuf, short *linbuf)
|
|
287 {
|
|
288 long n; /* aux.var. */
|
|
289 short segment; /* segment (Table 2/G711, column 1) */
|
|
290 short mantissa; /* low nibble of log companded sample */
|
|
291 short exponent; /* high nibble of log companded sample */
|
|
292 short sign; /* sign of output sample */
|
|
293 short step;
|
|
294
|
|
295 for (n = 0; n < lseg; n++) {
|
|
296 sign = logbuf[n] < (0x0080) /* sign-bit = 1 for positiv values */
|
|
297 ? -1 : 1;
|
|
298 mantissa = ~logbuf[n]; /* 1's complement of input value */
|
|
299 exponent = (mantissa >> 4) & (0x0007); /* extract exponent */
|
|
300 segment = exponent + 1; /* compute segment number */
|
|
301 mantissa = mantissa & (0x000F); /* extract mantissa */
|
|
302
|
|
303 /* Compute Quantized Sample (14 bit left justified!) */
|
|
304 step = (4) << segment; /* position of the LSB */
|
|
305 /* = 1 quantization step) */
|
|
306 linbuf[n] = sign * /* sign */
|
|
307 (((0x0080) << exponent) /* '1', preceding the mantissa */
|
|
308 +step * mantissa /* left shift of mantissa */
|
|
309 + step / 2 /* 1/2 quantization step */
|
|
310 - 4 * 33);
|
|
311 }
|
|
312 }
|
|
313
|
|
314 /* ................... End of ulaw_expand() ..................... */
|