diff dev/u2s-regen.c @ 230:20750ffb1c3e

dev: new program u2s-regen
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 07 May 2023 17:41:51 +0000
parents dev/a2s-regen.c@ba737a0203e2
children
line wrap: on
line diff
--- /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);
+}