# HG changeset patch # User Mychaela Falconia # Date 1683481311 0 # Node ID 20750ffb1c3e15eb42df84d8ada091d559e24c42 # Parent f00bf36872865844dfa7a3ea842478618e6935ec dev: new program u2s-regen diff -r f00bf3687286 -r 20750ffb1c3e .hgignore --- a/.hgignore Sun Apr 23 17:19:03 2023 +0000 +++ b/.hgignore Sun May 07 17:41:51 2023 +0000 @@ -25,6 +25,8 @@ ^dev/s2u-regen\.out$ ^dev/s2u-regen-plus4$ ^dev/s2u-regen-plus4\.out$ +^dev/u2s-regen$ +^dev/u2s-regen\.out$ ^efrtest/gsmefr-cod-parse$ ^efrtest/gsmefr-dec-parse$ diff -r f00bf3687286 -r 20750ffb1c3e dev/Makefile --- a/dev/Makefile Sun Apr 23 17:19:03 2023 +0000 +++ b/dev/Makefile Sun May 07 17:41:51 2023 +0000 @@ -1,9 +1,10 @@ CC= gcc CFLAGS= -O2 PROGS= a2s-regen efr-bit-packing efr-sid-insert efr-tidsp gsm0611-silence-fr \ - s2a-regen s2u-regen s2u-regen-plus4 + s2a-regen s2u-regen s2u-regen-plus4 u2s-regen DATAOUT=a2s-regen.out efr-bit-packing.out efr-sid-insert.out efr-tidsp.out \ - gsm0611-silence-fr.out s2a-regen.out s2u-regen.out s2u-regen-plus4.out + gsm0611-silence-fr.out s2a-regen.out s2u-regen.out s2u-regen-plus4.out \ + u2s-regen.out all: ${PROGS} ${DATAOUT} @@ -55,5 +56,11 @@ s2u-regen-plus4.out: s2u-regen-plus4 ./s2u-regen-plus4 > $@ +u2s-regen: u2s-regen.c + ${CC} ${CFLAGS} -o $@ $@.c + +u2s-regen.out: u2s-regen + ./u2s-regen > $@ + clean: rm -f *.o *.out ${PROGS} diff -r f00bf3687286 -r 20750ffb1c3e dev/u2s-regen.c --- /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 +#include + +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); +}