FreeCalypso > hg > gsm-codec-lib
view dev/u2s-regen.c @ 230:20750ffb1c3e
dev: new program u2s-regen
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 07 May 2023 17:41:51 +0000 |
parents | dev/a2s-regen.c@ba737a0203e2 |
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); }