FreeCalypso > hg > gsm-codec-lib
changeset 160:eefef9f6d533
libgsmefr: randomize d1035pf params in no-data BFI case
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 15 Dec 2022 07:23:18 +0000 |
parents | aa4cdab30dc8 |
children | fe5aceaf51e0 |
files | libgsmefr/bfi_nodata.c libgsmefr/d_homing.c libgsmefr/dec_state.h |
diffstat | 3 files changed, 41 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/libgsmefr/bfi_nodata.c Thu Dec 15 02:54:31 2022 +0000 +++ b/libgsmefr/bfi_nodata.c Thu Dec 15 07:23:18 2022 +0000 @@ -2,14 +2,44 @@ * 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. We could of course call - * EFR_decode_frame() with a dummy frame of all zeros and BFI=1, but the - * EFR_decode_bfi_nodata() function provided in this module accomplishes - * the same effect more efficiently. + * 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) @@ -17,5 +47,7 @@ int16_t params[EFR_NUM_PARAMS]; 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); }
--- a/libgsmefr/d_homing.c Thu Dec 15 02:54:31 2022 +0000 +++ b/libgsmefr/d_homing.c Thu Dec 15 07:23:18 2022 +0000 @@ -301,5 +301,8 @@ decoder_reset (st); /* reset all the state variables in the speech decoder*/ reset_rx_dtx (st); /* reset all the receive DTX and CN state variables */ + /* Themyscira libgsmefr addition for no-data BFI handling */ + st->L_pn_seed_nodata = PN_INITIAL_SEED; + return; }