changeset 224:b502321000aa

dev: new program a2s-regen
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 23 Apr 2023 04:34:09 +0000
parents 3afbc6c64172
children ba737a0203e2
files .hgignore dev/Makefile dev/a2s-regen.c
diffstat 3 files changed, 59 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Sun Apr 23 04:14:24 2023 +0000
+++ b/.hgignore	Sun Apr 23 04:34:09 2023 +0000
@@ -9,6 +9,8 @@
 ^amrconv/gsm-amr2efr$
 ^amrconv/gsm-efr2amr$
 
+^dev/a2s-regen$
+^dev/a2s-regen\.out$
 ^dev/efr-bit-packing$
 ^dev/efr-bit-packing\.out$
 ^dev/efr-sid-insert$
--- a/dev/Makefile	Sun Apr 23 04:14:24 2023 +0000
+++ b/dev/Makefile	Sun Apr 23 04:34:09 2023 +0000
@@ -1,11 +1,18 @@
 CC=	gcc
 CFLAGS=	-O2
-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 \
+PROGS=	a2s-regen efr-bit-packing efr-sid-insert efr-tidsp gsm0611-silence-fr \
+	s2a-regen
+DATAOUT=a2s-regen.out efr-bit-packing.out efr-sid-insert.out efr-tidsp.out \
 	gsm0611-silence-fr.out s2a-regen.out
 
 all:	${PROGS} ${DATAOUT}
 
+a2s-regen:	a2s-regen.c
+	${CC} ${CFLAGS} -o $@ $@.c
+
+a2s-regen.out:	a2s-regen
+	./a2s-regen > $@
+
 efr-bit-packing:	efr-bit-packing.c
 	${CC} ${CFLAGS} -o $@ $@.c
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dev/a2s-regen.c	Sun Apr 23 04:34:09 2023 +0000
@@ -0,0 +1,48 @@
+/*
+ * This program regenerates a G.711 A-law decoding table equivalent to the
+ * a2s[] 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_expand() from ITU-T G.191 STL.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+static unsigned
+alaw_expand (input)
+    unsigned input;
+{
+    short ix, mant, iexp;
+
+    ix = input ^ (0x0055);      /* re-toggle toggled bits */
+
+    ix &= (0x007F);             /* remove sign bit */
+    iexp = ix >> 4;             /* extract exponent */
+    mant = ix & (0x000F);       /* now get mantissa */
+    if (iexp > 0)
+      mant = mant + 16;         /* add leading '1', if exponent > 0 */
+
+    mant = (mant << 4) + (0x0008);      /* now mantissa left justified and */
+    /* 1/2 quantization step added */
+    if (iexp > 1)               /* now left shift according exponent */
+      mant = mant << (iexp - 1);
+
+    if (input & 0x80)           /* invert, if negative sample */
+	return mant;
+    else
+	return mant + 0x8000;
+}
+
+main(argc, argv)
+	char **argv;
+{
+	unsigned input, output;
+
+	for (input = 0; input < 256; input++) {
+		output = alaw_expand(input);
+		printf("%6u,", output);
+		if ((input & 7) == 7)
+			putchar('\n');
+	}
+	exit(0);
+}