Mercurial > hg > audiostuff
comparison intercom/g711/g711.c @ 2:13be24d74cd2
import intercom-0.4.1
| author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
|---|---|
| date | Fri, 25 Jun 2010 09:57:52 +0200 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 1:9cadc470e3da | 2:13be24d74cd2 |
|---|---|
| 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() ..................... */ |
