diff dev/a2s-regen.c @ 224:b502321000aa

dev: new program a2s-regen
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 23 Apr 2023 04:34:09 +0000
parents dev/s2a-regen.c@3afbc6c64172
children ba737a0203e2
line wrap: on
line diff
--- /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);
+}