view libgsmefr/bfi_nodata.c @ 490:4d80730683d4

libgsmhr1: implement TS 101 318 packing and unpacking
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 15 Jun 2024 05:33:35 +0000
parents 452c1d5a6268
children
line wrap: on
line source

/*
 * In the expected usage mode of our libgsmefr decoder as part of "soft TRAU"
 * uplink implementation, there will be times when the radio subsystem tells
 * us that a frame has been lost, but we don't have any errored bits to feed
 * to the decoder as ETSI canon calls for.  Specifically, the canonical EFR
 * decoder will use the "fixed codebook excitation pulses" part of errored
 * frames when a BFI comes in after speech, although not when BFI comes in
 * after SID.  Our solution in EFR_decode_bfi_nodata(): we look in the
 * decoder state to see if we are in speech mode, and if we are, we fill
 * the needed parameters with a PRNG.
 */

#include <string.h>
#include "gsm_efr.h"
#include "typedef.h"
#include "namespace.h"
#include "cnst.h"
#include "dtx.h"
#include "dec_state.h"

static void random_1035(Word32 *lfsr, Word16 *param_1035)
{
	Word16 *p = param_1035;
	Word16 i;

	/* 5 params of bit width 4 */
	for (i = 0; i < 5; i++)
		*p++ = pseudonoise(lfsr, 4);
	/* another 5 params of bit width 3 */
	for (i = 0; i < 5; i++)
		*p++ = pseudonoise(lfsr, 3);
}

static void random_bad_frame(struct EFR_decoder_state *st, Word16 *params)
{
	Word32 *lfsr = &st->L_pn_seed_nodata;

	random_1035(lfsr, params + 7);
	random_1035(lfsr, params + 20);
	random_1035(lfsr, params + 33);
	random_1035(lfsr, params + 46);
}

void EFR_decode_bfi_nodata(struct EFR_decoder_state *st, int taf,
			   int16_t *pcm_out)
{
	int16_t params[EFR_NUM_PARAMS];

	if (st->reset_flag_old) {
		memset(pcm_out, 0, sizeof(int16_t) * L_FRAME);
		return;
	}
	memset(params, 0, sizeof(int16_t) * EFR_NUM_PARAMS);
	if (st->rxdtx_ctrl & RX_SP_FLAG)
		random_bad_frame(st, params);
	EFR_decode_params(st, params, 1, 0, taf, pcm_out);
}