view dev/u2s-regen.c @ 478:936a08cc73ce

doc/AMR-library-API: describe the decoder
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 19 May 2024 21:32:31 +0000
parents 20750ffb1c3e
children
line wrap: on
line source

/*
 * This program generates a G.711 mu-law decoding table of the same form
 * as the u2s[] table in the toast_ulaw.c module in libgsm/toast; the intent
 * is to replace that incorrect table with a corrected one.  The "engine"
 * function that does the computation is based on ulaw_expand() from ITU-T
 * G.191 STL.
 */

#include <stdio.h>
#include <stdlib.h>

static unsigned
ulaw_expand (input)
    unsigned input;
{
    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;
    short output;

    sign = input < (0x0080)     /* sign-bit = 1 for positiv values */
      ? -1 : 1;
    mantissa = ~input;          /* 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) */
    output = sign *             /* sign */
      (((0x0080) << exponent)   /* '1', preceding the mantissa */
       +step * mantissa         /* left shift of mantissa */
       + step / 2               /* 1/2 quantization step */
       - 4 * 33);
    return output & 0xFFFF;
}

main(argc, argv)
	char **argv;
{
	unsigned input, output;

	for (input = 0; input < 256; input++) {
		output = ulaw_expand(input);
		printf("%6u,", output);
		if ((input & 7) == 7)
			putchar('\n');
	}
	exit(0);
}