FreeCalypso > hg > gsm-codec-lib
view libgsmefr/bfi_nodata.c @ 530:96c4ed5529bf
libgsmfr2 preproc: implement support for DTXd
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 19 Sep 2024 20:15:54 +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); }