FreeCalypso > hg > gsm-codec-lib
diff dev/s2a-regen.c @ 222:842136bbd0da
dev: new program s2a-regen
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 23 Apr 2023 04:09:24 +0000 |
parents | |
children | 3afbc6c64172 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dev/s2a-regen.c Sun Apr 23 04:09:24 2023 +0000 @@ -0,0 +1,52 @@ +/* + * This program regenerates a G.711 A-law encoding table equivalent to the + * s2a[] 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_compress() from ITU-T G.191 STL. + */ + +#include <stdio.h> +#include <stdlib.h> + +static unsigned +alaw_compress (input) + unsigned input; +{ + short ix, iexp; + + ix = input >= 2048 /* 0 <= ix < 2048 */ + ? ~input & 2047 /* 1's complement for negative values */ + : input; + + /* 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 (input < 2048) + ix |= (0x0080); /* add sign bit */ + + return ix ^ (0x0055); /* toggle even bits */ +} + +main(argc, argv) + char **argv; +{ + unsigned input, output; + + for (input = 0; input < 4096; input++) { + if ((input & 15) == 0) + putchar('\t'); + output = alaw_compress(input); + printf("%03u,", output); + if ((input & 15) == 15) + putchar('\n'); + } + exit(0); +}