changeset 292:6c3c396c1f99

rm libgsmfrp; it is now fully supplanted by libgsmfr2
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 14 Apr 2024 06:58:06 +0000
parents da533081fb95
children fa8845306e07
files libgsmfrp/Makefile libgsmfrp/bad_frame.c libgsmfrp/comfort_noise.c libgsmfrp/good_frame.c libgsmfrp/gsm_fr_preproc.h libgsmfrp/internal.h libgsmfrp/prng.c libgsmfrp/sidclass.c libgsmfrp/silence_frame.c libgsmfrp/state.c libgsmfrp/xmaxc_mean.c
diffstat 11 files changed, 0 insertions(+), 615 deletions(-) [+]
line wrap: on
line diff
--- a/libgsmfrp/Makefile	Sun Apr 14 06:36:13 2024 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-CC=	gcc
-CFLAGS=	-O2
-OBJS=	bad_frame.o comfort_noise.o good_frame.o prng.o sidclass.o \
-	silence_frame.o state.o xmaxc_mean.o
-HDRS=	gsm_fr_preproc.h internal.h
-LIB=	libgsmfrp.a
-
-INSTALL_PREFIX=	/usr/local
-
-all:	${LIB}
-
-${OBJS}:	${HDRS}
-
-${LIB}:	${OBJS}
-	ar rcu $@ ${OBJS}
-	ranlib $@
-
-install:
-	mkdir -p ${INSTALL_PREFIX}/include
-	install -c -m 444 gsm_fr_preproc.h ${INSTALL_PREFIX}/include
-	mkdir -p ${INSTALL_PREFIX}/lib
-	install -c -m 444 ${LIB} ${INSTALL_PREFIX}/lib
-
-clean:
-	rm -f *.[oa] errs
--- a/libgsmfrp/bad_frame.c	Sun Apr 14 06:36:13 2024 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,135 +0,0 @@
-/*
- * In this module we implement our handling of BFI frame gaps
- * and invalid SID frames.
- */
-
-#include <stdint.h>
-#include <string.h>
-#include "gsm_fr_preproc.h"
-#include "internal.h"
-
-static int reduce_xmaxc(gsm_byte *frame)
-{
-	int mute_flag = 1;
-	unsigned sub, xmaxc;
-
-	for (sub = 0; sub < 4; sub++) {
-		xmaxc = ((frame[sub*7+6] & 0x1F) << 1) | (frame[sub*7+7] >> 7);
-		if (xmaxc > 4) {
-			xmaxc -= 4;
-			mute_flag = 0;
-		} else
-			xmaxc = 0;
-		frame[sub*7+6] &= 0xE0;
-		frame[sub*7+6] |= xmaxc >> 1;
-		frame[sub*7+7] &= 0x7F;
-		frame[sub*7+7] |= (xmaxc & 1) << 7;
-	}
-	return mute_flag;
-}
-
-static void random_grid_pos(struct gsmfr_preproc_state *st, gsm_byte *frame)
-{
-	unsigned sub, Mc;
-
-	for (sub = 0; sub < 4; sub++) {
-		Mc = gsmfr_preproc_prng(st, 2);
-		frame[sub*7+6] &= 0x9F;
-		frame[sub*7+6] |= Mc << 5;
-	}
-}
-
-static int reduce_xmaxc_sid(struct gsmfr_preproc_state *st)
-{
-	if (st->sid_xmaxc > 4) {
-		st->sid_xmaxc -= 4;
-		return 0;
-	} else {
-		st->sid_xmaxc = 0;
-		return 1;
-	}
-}
-
-void gsmfr_preproc_bfi(struct gsmfr_preproc_state *st, int taf, gsm_byte *frame)
-{
-	int mute;
-
-	switch (st->rx_state) {
-	case NO_DATA:
-		memcpy(frame, &gsmfr_preproc_silence_frame, sizeof(gsm_frame));
-		return;
-	case SPEECH:
-		memcpy(frame, &st->speech_frame, sizeof(gsm_frame));
-		st->rx_state = SPEECH_MUTING;
-		return;
-	case SPEECH_MUTING:
-		mute = reduce_xmaxc(st->speech_frame);
-		memcpy(frame, &st->speech_frame, sizeof(gsm_frame));
-		random_grid_pos(st, frame);
-		if (mute)
-			st->rx_state = NO_DATA;
-		return;
-	case COMFORT_NOISE:
-		if (taf)
-			st->rx_state = LOST_SID;
-		gsmfr_preproc_gen_cn(st, frame);
-		return;
-	case LOST_SID:
-		if (taf) {
-			st->rx_state = CN_MUTING;
-			reduce_xmaxc_sid(st);
-		}
-		gsmfr_preproc_gen_cn(st, frame);
-		return;
-	case CN_MUTING:
-		if (reduce_xmaxc_sid(st)) {
-			st->rx_state = NO_DATA;
-			memcpy(frame, &gsmfr_preproc_silence_frame,
-				sizeof(gsm_frame));
-		} else
-			gsmfr_preproc_gen_cn(st, frame);
-		return;
-	}
-}
-
-void gsmfr_preproc_invalid_sid(struct gsmfr_preproc_state *st, gsm_byte *frame)
-{
-	int mute;
-
-	switch (st->rx_state) {
-	case NO_DATA:
-		memcpy(frame, &gsmfr_preproc_silence_frame, sizeof(gsm_frame));
-		return;
-	case SPEECH:
-		/*
-		 * Make CN out of the last good speech frame, following the
-		 * "NOTE" at the end of section 6.1.2 in TS 46.031.
-		 */
-		st->rx_state = COMFORT_NOISE;
-		memcpy(st->sid_prefix, &st->speech_frame, 5);
-		st->sid_xmaxc = gsmfr_preproc_xmaxc_mean(st->speech_frame);
-		gsmfr_preproc_gen_cn(st, frame);
-		return;
-	case SPEECH_MUTING:
-		/* ignore invalid SID in this state and act as if we got BFI */
-		mute = reduce_xmaxc(st->speech_frame);
-		memcpy(frame, &st->speech_frame, sizeof(gsm_frame));
-		random_grid_pos(st, frame);
-		if (mute)
-			st->rx_state = NO_DATA;
-		return;
-	case COMFORT_NOISE:
-	case LOST_SID:
-		st->rx_state = COMFORT_NOISE;
-		gsmfr_preproc_gen_cn(st, frame);
-		return;
-	case CN_MUTING:
-		if (reduce_xmaxc_sid(st)) {
-			st->rx_state = NO_DATA;
-			memcpy(frame, &gsmfr_preproc_silence_frame,
-				sizeof(gsm_frame));
-		} else
-			gsmfr_preproc_gen_cn(st, frame);
-		return;
-	}
-}
--- a/libgsmfrp/comfort_noise.c	Sun Apr 14 06:36:13 2024 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,111 +0,0 @@
-/*
- * In this module we implement comfort noise generation per GSM 06.12
- * or 3GPP TS 46.012.
- */
-
-#include <stdint.h>
-#include <string.h>
-#include "gsm_fr_preproc.h"
-#include "internal.h"
-
-static const uint8_t fold_table_8to6[24] = {
-	1, 2, 3, 4, 5, 6, 1, 2,
-	1, 2, 3, 4, 5, 6, 3, 4,
-	1, 2, 3, 4, 5, 6, 5, 6,
-};
-
-static const uint8_t bc[4] = {0, 0, 0, 0};
-static const uint8_t Nc[4] = {40, 120, 40, 120};
-
-static uint8_t random_1to6(struct gsmfr_preproc_state *st)
-{
-	uint8_t range8, range6;
-
-	range8 = gsmfr_preproc_prng(st, 3);
-	range6 = fold_table_8to6[(st->cn_random_6fold << 3) | range8];
-	st->cn_random_6fold++;
-	if (st->cn_random_6fold >= 3)
-		st->cn_random_6fold = 0;
-	return range6;
-}
-
-void gsmfr_preproc_gen_cn(struct gsmfr_preproc_state *st, gsm_byte *frame)
-{
-	unsigned sub, pulse;
-	uint8_t Mc, xmc[13];
-	gsm_byte *c;
-
-	/* global bytes (magic and LARc) are fixed */
-	memcpy(frame, st->sid_prefix, 5);
-	c = frame + 5;
-	/* now do the 4 subframes, mostly PRNG output */
-	for (sub = 0; sub < 4; sub++) {
-		Mc = gsmfr_preproc_prng(st, 2);
-		for (pulse = 0; pulse < 13; pulse++)
-			xmc[pulse] = random_1to6(st);
-		/* packing code from libgsm */
-		*c++ =   ((Nc[sub] & 0x7F) << 1)
-		       | ((bc[sub] >> 1) & 0x1);
-		*c++ =   ((bc[sub] & 0x1) << 7)
-		       | ((Mc & 0x3) << 5)
-		       | ((st->sid_xmaxc >> 1) & 0x1F);
-		*c++ =   ((st->sid_xmaxc & 0x1) << 7)
-		       | ((xmc[0] & 0x7) << 4)
-		       | ((xmc[1] & 0x7) << 1)
-		       | ((xmc[2] >> 2) & 0x1);
-		*c++ =   ((xmc[2] & 0x3) << 6)
-		       | ((xmc[3] & 0x7) << 3)
-		       | (xmc[4] & 0x7);
-		*c++ =   ((xmc[5] & 0x7) << 5)
-		       | ((xmc[6] & 0x7) << 2)
-		       | ((xmc[7] >> 1) & 0x3);
-		*c++ =   ((xmc[7] & 0x1) << 7)
-		       | ((xmc[8] & 0x7) << 4)
-		       | ((xmc[9] & 0x7) << 1)
-		       | ((xmc[10] >> 2) & 0x1);
-		*c++ =   ((xmc[10] & 0x3) << 6)
-		       | ((xmc[11] & 0x7) << 3)
-		       | (xmc[12] & 0x7);
-	}
-}
-
-void gsmfr_preproc_sid2cn(struct gsmfr_preproc_state *st, gsm_byte *frame)
-{
-	unsigned sub, pulse;
-	uint8_t Mc, xmc[13];
-	gsm_byte *c;
-
-	/* save LARc and Xmaxc from the last subframe for subsequent CN gen */
-	memcpy(st->sid_prefix, frame, 5);
-	st->sid_xmaxc = ((frame[27] & 0x1F) << 1) | (frame[28] >> 7);
-	/* ... and turn *this* frame into very first CN output */
-	c = frame + 5;
-	for (sub = 0; sub < 4; sub++) {
-		Mc = gsmfr_preproc_prng(st, 2);
-		for (pulse = 0; pulse < 13; pulse++)
-			xmc[pulse] = random_1to6(st);
-		/* keep each of Xmaxc and replace the rest with CN */
-		*c++ =   ((Nc[sub] & 0x7F) << 1)
-		       | ((bc[sub] >> 1) & 0x1);
-		*c &= 0x1F;
-		*c++ |=  ((bc[sub] & 0x1) << 7)
-		       | ((Mc & 0x3) << 5);
-		*c &= 0x80;
-		*c++ |=  ((xmc[0] & 0x7) << 4)
-		       | ((xmc[1] & 0x7) << 1)
-		       | ((xmc[2] >> 2) & 0x1);
-		*c++ =   ((xmc[2] & 0x3) << 6)
-		       | ((xmc[3] & 0x7) << 3)
-		       | (xmc[4] & 0x7);
-		*c++ =   ((xmc[5] & 0x7) << 5)
-		       | ((xmc[6] & 0x7) << 2)
-		       | ((xmc[7] >> 1) & 0x3);
-		*c++ =   ((xmc[7] & 0x1) << 7)
-		       | ((xmc[8] & 0x7) << 4)
-		       | ((xmc[9] & 0x7) << 1)
-		       | ((xmc[10] >> 2) & 0x1);
-		*c++ =   ((xmc[10] & 0x3) << 6)
-		       | ((xmc[11] & 0x7) << 3)
-		       | (xmc[12] & 0x7);
-	}
-}
--- a/libgsmfrp/good_frame.c	Sun Apr 14 06:36:13 2024 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * In this module we implement preprocessing of received good frames.
- */
-
-#include <stdint.h>
-#include <string.h>
-#include "gsm_fr_preproc.h"
-#include "internal.h"
-
-void gsmfr_preproc_good_frame(struct gsmfr_preproc_state *st, gsm_byte *frame)
-{
-	int sid;
-
-	/* always set correct magic */
-	frame[0] = 0xD0 | frame[0] & 0x0F;
-	/* now classify by SID */
-	sid = gsmfr_preproc_sid_classify(frame);
-	switch (sid) {
-	case 0:		/* good speech frame */
-		st->rx_state = SPEECH;
-		memcpy(&st->speech_frame, frame, sizeof(gsm_frame));
-		return;
-	case 1:		/* invalid SID frame */
-		/* state-dependent handling, similar to BFI */
-		gsmfr_preproc_invalid_sid(st, frame);
-		return;
-	case 2:		/* valid SID frame */
-		st->rx_state = COMFORT_NOISE;
-		gsmfr_preproc_sid2cn(st, frame);
-		return;
-	}
-}
--- a/libgsmfrp/gsm_fr_preproc.h	Sun Apr 14 06:36:13 2024 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * This header file is the external public interface to libgsmfrp;
- * it should be installed in the same system include directory
- * as <gsm.h> from libgsm, on which we depend.
- */
-
-#ifndef	__GSM_FR_PREPROC_H
-#define	__GSM_FR_PREPROC_H
-
-#include <gsm.h>
-
-struct gsmfr_preproc_state;	/* opaque to external users */
-
-extern struct gsmfr_preproc_state *gsmfr_preproc_create(void);
-/* use standard free() call to free it afterward */
-
-/* reset state to initial */
-extern void gsmfr_preproc_reset(struct gsmfr_preproc_state *state);
-
-/* main processing functions */
-extern void gsmfr_preproc_good_frame(struct gsmfr_preproc_state *state,
-				     gsm_byte *frame);
-extern void gsmfr_preproc_bfi(struct gsmfr_preproc_state *state, int taf,
-			      gsm_byte *frame_out);
-
-/* utility function */
-extern int gsmfr_preproc_sid_classify(const gsm_byte *frame);
-
-/* utility datum */
-extern const gsm_frame gsmfr_preproc_silence_frame;
-
-#endif	/* include guard */
--- a/libgsmfrp/internal.h	Sun Apr 14 06:36:13 2024 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-/*
- * This header file is internal to libgsmfrp;
- * here we define our state structure.
- */
-
-enum rx_state {
-	NO_DATA = 0,
-	SPEECH,
-	SPEECH_MUTING,
-	COMFORT_NOISE,
-	LOST_SID,
-	CN_MUTING,
-};
-
-struct gsmfr_preproc_state {
-	enum rx_state	rx_state;
-	gsm_frame	speech_frame;
-	gsm_byte	sid_prefix[5];
-	uint8_t		sid_xmaxc;
-	uint32_t	cn_random_lfsr;
-	unsigned	cn_random_6fold;
-};
-
-/* we use the same LFSR PRNG for CN as ETSI EFR implementation */
-#define PN_INITIAL_SEED 0x70816958L   /* Pseudo noise generator seed value  */
-
-/* internal functions */
-extern void gsmfr_preproc_gen_cn(struct gsmfr_preproc_state *state,
-				 gsm_byte *frame);
-extern void gsmfr_preproc_sid2cn(struct gsmfr_preproc_state *state,
-				 gsm_byte *frame);
-extern void gsmfr_preproc_invalid_sid(struct gsmfr_preproc_state *state,
-				      gsm_byte *frame);
-extern uint16_t gsmfr_preproc_prng(struct gsmfr_preproc_state *state,
-				   uint16_t no_bits);
-extern uint8_t gsmfr_preproc_xmaxc_mean(const gsm_byte *frame);
--- a/libgsmfrp/prng.c	Sun Apr 14 06:36:13 2024 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * We use a pseudorandom sequence generator function in two places:
- * when generating comfort noise (GSM 06.12 section 6.1), and when
- * randomizing grid position parameters as part of speech muting
- * during error handling (GSM 06.11 section 6).
- *
- * Our PRNG is a copy of the pseudonoise() function from ETSI EFR code,
- * where it is used for similar purposes.
- */
-
-#include <stdint.h>
-#include "gsm_fr_preproc.h"
-#include "internal.h"
-
-uint16_t gsmfr_preproc_prng(struct gsmfr_preproc_state *st, uint16_t no_bits)
-{
-    uint16_t noise_bits, Sn, i;
-
-    noise_bits = 0;
-    for (i = 0; i < no_bits; i++)
-    {
-        /* State n == 31 */
-        if ((st->cn_random_lfsr & 0x00000001L) != 0)
-        {
-            Sn = 1;
-        }
-        else
-        {
-            Sn = 0;
-        }
-
-        /* State n == 3 */
-        if ((st->cn_random_lfsr & 0x10000000L) != 0)
-        {
-            Sn = Sn ^ 1;
-        }
-        else
-        {
-            Sn = Sn ^ 0;
-        }
-
-        noise_bits = noise_bits << 1;
-        noise_bits = noise_bits | st->cn_random_lfsr & 1;
-
-        st->cn_random_lfsr >>= 1;
-        if (Sn & 1)
-        {
-            st->cn_random_lfsr |= 0x40000000L;
-        }
-    }
-
-    return noise_bits;
-}
--- a/libgsmfrp/sidclass.c	Sun Apr 14 06:36:13 2024 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * gsmfr_preproc_sid_classify() utility function classifies
- * a GSM 06.10 frame in RTP encoding according to the rules
- * of GSM 06.31 (or 3GPP TS 46.031) section 6.1.1, judging it
- * as SID=0, SID=1 or SID=2.
- */
-
-#include "gsm_fr_preproc.h"
-
-static const unsigned short sid_field_bits[95] = {
-	57, 58, 60, 61, 63, 64, 66, 67, 69, 70, 72, 73,
-	75, 76, 78, 79, 81, 82, 84, 85, 87, 88, 90, 91,
-	93, 94, 113, 114, 116, 117, 119, 120, 122, 123,
-	125, 126, 128, 129, 131, 132, 134, 135, 137,
-	138, 140, 141, 143, 144, 146, 147, 149, 150,
-	169, 170, 172, 173, 175, 176, 178, 179, 181,
-	182, 184, 185, 187, 188, 190, 191, 193, 194,
-	196, 197, 199, 200, 202, 203, 205, 206, 225,
-	226, 228, 229, 231, 232, 234, 235, 237, 240,
-	243, 246, 249, 252, 255, 258, 261
-};
-
-static inline int get_bit(const gsm_byte *frame, unsigned bitnum)
-{
-	unsigned bytenum = bitnum >> 3;
-	unsigned bit_in_byte = 7 - (bitnum & 7);
-	unsigned bitmask = 1 << bit_in_byte;
-
-	if (frame[bytenum] & bitmask)
-		return 1;
-	else
-		return 0;
-}
-
-int gsmfr_preproc_sid_classify(const gsm_byte *frame)
-{
-	unsigned idx, n;
-
-	n = 0;
-	for (idx = 0; idx < 95; idx++) {
-		if (get_bit(frame, sid_field_bits[idx]))
-			n++;
-		if (n >= 16)
-			return 0;
-	}
-	if (n < 2)
-		return 2;
-	else
-		return 1;
-}
--- a/libgsmfrp/silence_frame.c	Sun Apr 14 06:36:13 2024 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-/*
- * Table 1 in section 6 of 3GPP TS 46.011 specifies a silence frame
- * in the form of GSM 06.10 parameters; here we implement this exact
- * silence frame in libgsm encoding, which is also RTP encoding.
- */
-
-#include "gsm_fr_preproc.h"
-
-const gsm_frame gsmfr_preproc_silence_frame = {
-	0xDA, 0xA7, 0xAA, 0xA5, 0x1A,
-	0x50, 0x20, 0x38, 0xE4, 0x6D, 0xB9, 0x1B,
-	0x50, 0x20, 0x38, 0xE4, 0x6D, 0xB9, 0x1B,
-	0x50, 0x20, 0x38, 0xE4, 0x6D, 0xB9, 0x1B,
-	0x50, 0x20, 0x38, 0xE4, 0x6D, 0xB9, 0x1B,
-};
--- a/libgsmfrp/state.c	Sun Apr 14 06:36:13 2024 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/*
- * In this module we implement allocation and initialization
- * of state structures for our GSM FR preprocessor.
- */
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include "gsm_fr_preproc.h"
-#include "internal.h"
-
-struct gsmfr_preproc_state *gsmfr_preproc_create(void)
-{
-	struct gsmfr_preproc_state *st;
-
-	st = malloc(sizeof(struct gsmfr_preproc_state));
-	if (st)
-		gsmfr_preproc_reset(st);
-	return st;
-}
-
-void gsmfr_preproc_reset(struct gsmfr_preproc_state *st)
-{
-	memset(st, 0, sizeof(struct gsmfr_preproc_state));
-	st->cn_random_lfsr = PN_INITIAL_SEED;
-}
--- a/libgsmfrp/xmaxc_mean.c	Sun Apr 14 06:36:13 2024 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-/*
- * The function implemented in this module computes a mean Xmaxc
- * for comfort noise generation from the 4 subframe Xmaxc parameters
- * extracted from an input frame.
- */
-
-#include <stdint.h>
-#include "gsm_fr_preproc.h"
-#include "internal.h"
-
-static const uint16_t dequant_table[64] = {
-	  0,   1,   2,   3,   4,   5,   6,   7,
-	  8,   9,  10,  11,  12,  13,  14,  15,
-	 16,  18,  20,  22,  24,  26,  28,  30,
-	 32,  36,  40,  44,  48,  52,  56,  60,
-	 64,  72,  80,  88,  96, 104, 112, 120,
-	128, 144, 160, 176, 192, 208, 224, 240,
-	256, 288, 320, 352, 384, 416, 448, 480,
-	512, 576, 640, 704, 768, 832, 896, 960,
-};
-
-static const uint8_t requant_table[1024] = {
-	 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
-	16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23,
-	24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27,
-	28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
-	32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33,
-	34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35,
-	36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37,
-	38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39,
-	40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
-	41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
-	42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
-	43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
-	44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
-	45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-	46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
-	47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-	48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
-	48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
-	49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
-	49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
-	50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
-	50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
-	51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
-	51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
-	52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
-	52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
-	53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
-	53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
-	54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
-	54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
-	55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
-	55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
-	56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
-	56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
-	56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
-	56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
-	57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
-	57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
-	57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
-	57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
-	58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
-	58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
-	58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
-	58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
-	59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-	59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-	59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-	59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
-	60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
-	60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
-	60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
-	60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
-	61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
-	61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
-	61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
-	61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
-	62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
-	62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
-	62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
-	62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
-	63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
-	63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
-	63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
-	63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
-};
-
-uint8_t gsmfr_preproc_xmaxc_mean(const gsm_byte *frame)
-{
-	unsigned sub, xmaxc, sum;
-
-	sum = 0;
-	for (sub = 0; sub < 4; sub++) {
-		xmaxc = ((frame[sub*7+6] & 0x1F) << 1) | (frame[sub*7+7] >> 7);
-		sum += dequant_table[xmaxc];
-	}
-	xmaxc = requant_table[sum >> 2];
-	return xmaxc;
-}