view dev/a2s-regen.c @ 288:e0b46ac2c326

gsmfr-encode-r: convert to libgsmfr2
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 14 Apr 2024 06:20:04 +0000
parents ba737a0203e2
children
line wrap: on
line source

/*
 * This program regenerates a G.711 A-law decoding table equivalent to the
 * a2s[] table in the toast_alaw.c module in libgsm/toast; the intent is
 * to check that table for correctness.  The "engine" function that does
 * the computation is based on alaw_expand() from ITU-T G.191 STL.
 */

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

static unsigned
alaw_expand (input)
    unsigned input;
{
    short ix, mant, iexp;

    ix = input ^ (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);

    if (input & 0x80)           /* invert, if negative sample */
	return mant;
    else
	return -mant & 0xFFFF;
}

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

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