diff dev/s2a-regen.c @ 222:842136bbd0da

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