123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- /* Version 3.01 - 31.Jan.2000
- =============================================================================
- U U GGG SSS TTTTT
- U U G S T
- U U G GG SSS T
- U U G G S T
- UUUU GGG SSS T
- ========================================
- ITU-T - USER'S GROUP ON SOFTWARE TOOLS
- ========================================
- =============================================================
- COPYRIGHT NOTE: This source code, and all of its derivations,
- is subject to the "ITU-T General Public License". Please have
- it read in the distribution disk, or in the ITU-T
- Recommendation G.191 on "SOFTWARE TOOLS FOR SPEECH AND AUDIO
- CODING STANDARDS".
- =============================================================
- MODULE: G711.C, G.711 ENCODING/DECODING FUNCTIONS
- ORIGINAL BY:
- Simao Ferraz de Campos Neto Rudolf Hofmann
- CPqD/Telebras PHILIPS KOMMUNIKATIONS INDUSTRIE AG
- DDS/Pr.11 Kommunikationssysteme
- Rd. Mogi Mirim-Campinas Km.118 Thurn-und-Taxis-Strasse 14
- 13.085 - Campinas - SP (Brazil) D-8500 Nuernberg 10 (Germany)
- Phone : +55-192-39-6396 Phone : +49 911 526-2603
- FAX : +55-192-53-4754 FAX : +49 911 526-3385
- EMail : tdsimao@venus.cpqd.ansp.br EMail : HF@PKINBG.UUCP
- FUNCTIONS:
- alaw_compress: ... compands 1 vector of linear PCM samples to A-law;
- uses 13 Most Sig.Bits (MSBs) from input and 8 Least
- Sig. Bits (LSBs) on output.
- alaw_expand: ..... expands 1 vector of A-law samples to linear PCM;
- use 8 Least Sig. Bits (LSBs) from input and
- 13 Most Sig.Bits (MSBs) on output.
- ulaw_compress: ... compands 1 vector of linear PCM samples to u-law;
- uses 14 Most Sig.Bits (MSBs) from input and 8 Least
- Sig. Bits (LSBs) on output.
- ulaw_expand: ..... expands 1 vector of u-law samples to linear PCM
- use 8 Least Sig. Bits (LSBs) from input and
- 14 Most Sig.Bits (MSBs) on output.
- PROTOTYPES: in g711.h
- HISTORY:
- Apr/91 1.0 First version of the G711 module
- 10/Dec/1991 2.0 Break-up in individual functions for A,u law;
- correction of bug in compression routines (use of 1
- and 2 complement); Demo program inside module.
- 08/Feb/1992 3.0 Demo as separate file;
- 31/Jan/2000 3.01 Updated documentation text; no change in functions
- <simao.campos@labs.comsat.com>
- =============================================================================
- */
- /*
- * .......... I N C L U D E S ..........
- */
- /* Global prototype functions */
- #include "g711.h"
- /*
- * .......... F U N C T I O N S ..........
- */
- /* ................... Begin of alaw_compress() ..................... */
- /*
- ==========================================================================
- FUNCTION NAME: alaw_compress
- DESCRIPTION: ALaw encoding rule according ITU-T Rec. G.711.
- PROTOTYPE: void alaw_compress(long lseg, short *linbuf, short *logbuf)
- PARAMETERS:
- lseg: (In) number of samples
- linbuf: (In) buffer with linear samples (only 12 MSBits are taken
- into account)
- logbuf: (Out) buffer with compressed samples (8 bit right justified,
- without sign extension)
- RETURN VALUE: none.
- HISTORY:
- 10.Dec.91 1.0 Separated A-law compression function
- ==========================================================================
- */
- void alaw_compress (long lseg, short *linbuf, short *logbuf) {
- short ix, iexp;
- long n;
- for (n = 0; n < lseg; n++) {
- ix = linbuf[n] < 0 /* 0 <= ix < 2048 */
- ? (~linbuf[n]) >> 4 /* 1's complement for negative values */
- : (linbuf[n]) >> 4;
- /* Do more, if exponent > 0 */
- if (ix > 15) { /* exponent=0 for ix <= 15 */
- iexp = 1; /* first step: */
- while (ix > 16 + 15) { /* find mantissa and exponent */
- ix >>= 1;
- iexp++;
- }
- ix -= 16; /* second step: remove leading '1' */
- ix += iexp << 4; /* now compute encoded value */
- }
- if (linbuf[n] >= 0)
- ix |= (0x0080); /* add sign bit */
- logbuf[n] = ix ^ (0x0055); /* toggle even bits */
- }
- }
- /* ................... End of alaw_compress() ..................... */
- /* ................... Begin of alaw_expand() ..................... */
- /*
- ==========================================================================
- FUNCTION NAME: alaw_expand
- DESCRIPTION: ALaw decoding rule according ITU-T Rec. G.711.
- PROTOTYPE: void alaw_expand(long lseg, short *logbuf, short *linbuf)
- PARAMETERS:
- lseg: (In) number of samples
- logbuf: (In) buffer with compressed samples (8 bit right justified,
- without sign extension)
- linbuf: (Out) buffer with linear samples (13 bits left justified)
- RETURN VALUE: none.
- HISTORY:
- 10.Dec.91 1.0 Separated A-law expansion function
- ============================================================================
- */
- void alaw_expand (long lseg, short *logbuf, short *linbuf) {
- short ix, mant, iexp;
- long n;
- for (n = 0; n < lseg; n++) {
- ix = logbuf[n] ^ (0x0055); /* re-toggle toggled bits */
- ix &= (0x007F); /* remove sign bit */
- iexp = ix >> 4; /* extract exponent */
- mant = ix & (0x000F); /* now get mantissa */
- if (iexp > 0)
- mant = mant + 16; /* add leading '1', if exponent > 0 */
- mant = (mant << 4) + (0x0008); /* now mantissa left justified and */
- /* 1/2 quantization step added */
- if (iexp > 1) /* now left shift according exponent */
- mant = mant << (iexp - 1);
- linbuf[n] = logbuf[n] > 127 /* invert, if negative sample */
- ? mant : -mant;
- }
- }
- /* ................... End of alaw_expand() ..................... */
- /* ................... Begin of ulaw_compress() ..................... */
- /*
- ==========================================================================
- FUNCTION NAME: ulaw_compress
- DESCRIPTION: Mu law encoding rule according ITU-T Rec. G.711.
- PROTOTYPE: void ulaw_compress(long lseg, short *linbuf, short *logbuf)
- PARAMETERS:
- lseg: (In) number of samples
- linbuf: (In) buffer with linear samples (only 12 MSBits are taken
- into account)
- logbuf: (Out) buffer with compressed samples (8 bit right justified,
- without sign extension)
- RETURN VALUE: none.
- HISTORY:
- 10.Dec.91 1.0 Separated mu-law compression function
- ==========================================================================
- */
- void ulaw_compress (long lseg, short *linbuf, short *logbuf) {
- long n; /* samples's count */
- short i; /* aux.var. */
- short absno; /* absolute value of linear (input) sample */
- short segno; /* segment (Table 2/G711, column 1) */
- short low_nibble; /* low nibble of log companded sample */
- short high_nibble; /* high nibble of log companded sample */
- for (n = 0; n < lseg; n++) {
- /* -------------------------------------------------------------------- */
- /* Change from 14 bit left justified to 14 bit right justified */
- /* Compute absolute value; adjust for easy processing */
- /* -------------------------------------------------------------------- */
- absno = linbuf[n] < 0 /* compute 1's complement in case of */
- ? ((~linbuf[n]) >> 2) + 33 /* negative samples */
- : ((linbuf[n]) >> 2) + 33; /* NB: 33 is the difference value */
- /* between the thresholds for */
- /* A-law and u-law. */
- if (absno > (0x1FFF)) /* limitation to "absno" < 8192 */
- absno = (0x1FFF);
- /* Determination of sample's segment */
- i = absno >> 6;
- segno = 1;
- while (i != 0) {
- segno++;
- i >>= 1;
- }
- /* Mounting the high-nibble of the log-PCM sample */
- high_nibble = (0x0008) - segno;
- /* Mounting the low-nibble of the log PCM sample */
- low_nibble = (absno >> segno) /* right shift of mantissa and */
- &(0x000F); /* masking away leading '1' */
- low_nibble = (0x000F) - low_nibble;
- /* Joining the high-nibble and the low-nibble of the log PCM sample */
- logbuf[n] = (high_nibble << 4) | low_nibble;
- /* Add sign bit */
- if (linbuf[n] >= 0)
- logbuf[n] = logbuf[n] | (0x0080);
- }
- }
- /* ................... End of ulaw_compress() ..................... */
- /* ................... Begin of ulaw_expand() ..................... */
- /*
- ==========================================================================
- FUNCTION NAME: ulaw_expand
- DESCRIPTION: Mu law decoding rule according ITU-T Rec. G.711.
- PROTOTYPE: void ulaw_expand(long lseg, short *logbuf, short *linbuf)
- PARAMETERS:
- lseg: (In) number of samples
- logbuf: (In) buffer with compressed samples (8 bit right justified,
- without sign extension)
- linbuf: (Out) buffer with linear samples (14 bits left justified)
- RETURN VALUE: none.
- HISTORY:
- 10.Dec.91 1.0 Separated mu law expansion function
- ============================================================================
- */
- void ulaw_expand (long lseg, short *logbuf, short *linbuf) {
- long n; /* aux.var. */
- short segment; /* segment (Table 2/G711, column 1) */
- short mantissa; /* low nibble of log companded sample */
- short exponent; /* high nibble of log companded sample */
- short sign; /* sign of output sample */
- short step;
- for (n = 0; n < lseg; n++) {
- sign = logbuf[n] < (0x0080) /* sign-bit = 1 for positiv values */
- ? -1 : 1;
- mantissa = ~logbuf[n]; /* 1's complement of input value */
- exponent = (mantissa >> 4) & (0x0007); /* extract exponent */
- segment = exponent + 1; /* compute segment number */
- mantissa = mantissa & (0x000F); /* extract mantissa */
- /* Compute Quantized Sample (14 bit left justified!) */
- step = (4) << segment; /* position of the LSB */
- /* = 1 quantization step) */
- linbuf[n] = sign * /* sign */
- (((0x0080) << exponent) /* '1', preceding the mantissa */
- +step * mantissa /* left shift of mantissa */
- + step / 2 /* 1/2 quantization step */
- - 4 * 33);
- }
- }
- /* ................... End of ulaw_expand() ..................... */
|