view hr-sid/sidgen.c @ 47:ee54b9748c09

hr-sid: add conversion of misordered SID field
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 24 Jul 2024 05:39:51 +0000
parents 5c82f2e56d56
children
line wrap: on
line source

/*
 * This program generates a sequence of GSM-HR codec frames in raw packed
 * format (aka TS 101 318) that aims to reverse-engineer the logic of
 * the SID detector in TI Calypso DSP, and maybe later in historical
 * E1 BTS implementations too.
 */

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>

static const uint8_t perfect_sid[14] = {
	0x11, 0x22, 0x33, 0x44, 0xFF, 0xFF, 0xFF,
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};

static void
clear_bit(buf, num)
	uint8_t *buf;
	unsigned num;
{
	unsigned nbyte = num / 8;
	unsigned nbit = num % 8;
	unsigned mask = 0x80 >> nbit;

	buf[nbyte] &= ~mask;
}

static void
corrupt_class1_bit(buf, num)
	uint8_t *buf;
	unsigned num;
{
	clear_bit(buf, num + 36);
}

static void
corrupt_class2_bit(buf, num)
	uint8_t *buf;
	unsigned num;
{
	if (num < 8)
		clear_bit(buf, num + 81);
	else
		clear_bit(buf, (num - 8) + 98);
}

main(argc, argv)
	char **argv;
{
	FILE *outf;
	uint8_t class1[14], class2[14];
	unsigned n1, n2;

	if (argc != 2) {
		fprintf(stderr, "usage: %s outfile\n", argv[0]);
		exit(1);
	}
	outf = fopen(argv[1], "w");
	if (!outf) {
		perror(argv[1]);
		exit(1);
	}
	bcopy(perfect_sid, class1, 14);
	for (n1 = 0; n1 < 20; n1++) {
		bcopy(class1, class2, 14);
		for (n2 = 0; n2 < 17; n2++) {
			fwrite(class2, 1, 14, outf);
			corrupt_class2_bit(class2, n2);
		}
		fwrite(class2, 1, 14, outf);
		corrupt_class1_bit(class1, n1);
	}
	fclose(outf);
	exit(0);
}