diff dev/xmaxc-tables.c @ 247:56d3fbacd115

dev: new program xmaxc-tables
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 12 May 2023 02:04:42 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dev/xmaxc-tables.c	Fri May 12 02:04:42 2023 +0000
@@ -0,0 +1,94 @@
+/*
+ * For libgsmfrp: if we are going to initiate comfort noise generation
+ * upon receiving an invalid SID, and if we are going to harvest the
+ * needed LARc and Xmaxc parameters from the last speech frame, we'll
+ * need a way to compute a single mean Xmaxc from the 4 subframe Xmaxc
+ * parameters of that last speech frame.
+ *
+ * This program generates Xmaxc dequantization and requantization tables
+ * that are specifically optimized for performing this mean manipulation.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+static uint16_t dequant_table[64];
+static uint8_t requant_table[1024];
+
+static void
+compute_dequant()
+{
+	unsigned xmaxc, dequant, step;
+
+	dequant = 0;
+	step = 1;
+	for (xmaxc = 0; xmaxc < 64; xmaxc++) {
+		dequant_table[xmaxc] = dequant;
+		dequant += step;
+		if ((xmaxc & 7) == 7 && xmaxc != 7)
+			step <<= 1;
+	}
+}
+
+static void
+compute_requant()
+{
+	unsigned x, c;
+
+	for (x = 0; x < 1024; x++) {
+		for (c = 0; c < 63; c++) {
+			if (x < dequant_table[c+1])
+				break;
+		}
+		requant_table[x] = c;
+	}
+}
+
+static void
+print_dequant()
+{
+	unsigned c, r;
+
+	puts("const uint16_t dequant_table[64] = {");
+	for (c = 0; c < 64; c++) {
+		r = c & 7;
+		if (!r)
+			putchar('\t');
+		printf("%3u,", dequant_table[c]);
+		if (r == 7)
+			putchar('\n');
+		else
+			putchar(' ');
+	}
+	fputs("};\n\n", stdout);
+}
+
+static void
+print_requant()
+{
+	unsigned x, r;
+
+	puts("const uint8_t requant_table[1024] = {");
+	for (x = 0; x < 1024; x++) {
+		r = x & 15;
+		if (!r)
+			putchar('\t');
+		printf("%2u,", requant_table[x]);
+		if (r == 15)
+			putchar('\n');
+		else
+			putchar(' ');
+	}
+	fputs("};\n", stdout);
+}
+
+main(argc, argv)
+	char **argv;
+{
+	compute_dequant();
+	compute_requant();
+	print_dequant();
+	print_requant();
+	exit(0);
+}