FreeCalypso > hg > gsm-codec-lib
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dev/u2s-regen.c Sun May 07 17:41:51 2023 +0000 @@ -0,0 +1,53 @@ +/* + * 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); +}