changeset 222:842136bbd0da

dev: new program s2a-regen
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 23 Apr 2023 04:09:24 +0000
parents 6555dae764b3
children 3afbc6c64172
files .hgignore dev/Makefile dev/s2a-regen.c
diffstat 3 files changed, 62 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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$
--- 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}
--- /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);
+}