# HG changeset patch # User Mychaela Falconia # Date 1682222964 0 # Node ID 842136bbd0dad9ca165f64fce84b4bcd36dac7b3 # Parent 6555dae764b37f412da8ace283689c0354e9791b dev: new program s2a-regen diff -r 6555dae764b3 -r 842136bbd0da .hgignore --- a/.hgignore Sun Apr 23 03:36:25 2023 +0000 +++ b/.hgignore Sun Apr 23 04:09:24 2023 +0000 @@ -17,6 +17,8 @@ ^dev/efr-tidsp\.out$ ^dev/gsm0611-silence-fr$ ^dev/gsm0611-silence-fr\.out$ +^dev/s2a-regen$ +^dev/s2a-regen\.out$ ^efrtest/gsmefr-cod-parse$ ^efrtest/gsmefr-dec-parse$ diff -r 6555dae764b3 -r 842136bbd0da dev/Makefile --- a/dev/Makefile Sun Apr 23 03:36:25 2023 +0000 +++ b/dev/Makefile Sun Apr 23 04:09:24 2023 +0000 @@ -1,8 +1,8 @@ CC= gcc CFLAGS= -O2 -PROGS= efr-bit-packing efr-sid-insert efr-tidsp gsm0611-silence-fr +PROGS= efr-bit-packing efr-sid-insert efr-tidsp gsm0611-silence-fr s2a-regen DATAOUT=efr-bit-packing.out efr-sid-insert.out efr-tidsp.out \ - gsm0611-silence-fr.out + gsm0611-silence-fr.out s2a-regen.out all: ${PROGS} ${DATAOUT} @@ -30,5 +30,11 @@ gsm0611-silence-fr.out: gsm0611-silence-fr ./gsm0611-silence-fr > $@ +s2a-regen: s2a-regen.c + ${CC} ${CFLAGS} -o $@ $@.c + +s2a-regen.out: s2a-regen + ./s2a-regen > $@ + clean: rm -f *.o *.out ${PROGS} diff -r 6555dae764b3 -r 842136bbd0da dev/s2a-regen.c --- /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 +#include + +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); +}