changeset 230:20750ffb1c3e

dev: new program u2s-regen
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 07 May 2023 17:41:51 +0000
parents f00bf3687286
children 67cbfa0aeb1c
files .hgignore dev/Makefile dev/u2s-regen.c
diffstat 3 files changed, 64 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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$
--- 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}
--- /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);
+}