# HG changeset patch # User Mychaela Falconia # Date 1671088998 0 # Node ID eefef9f6d533c687ab848e10b6f31594d0378e9c # Parent aa4cdab30dc8bc64fb1b4f64889854bec0519b88 libgsmefr: randomize d1035pf params in no-data BFI case diff -r aa4cdab30dc8 -r eefef9f6d533 libgsmefr/bfi_nodata.c --- 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 #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); } diff -r aa4cdab30dc8 -r eefef9f6d533 libgsmefr/d_homing.c --- 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; } diff -r aa4cdab30dc8 -r eefef9f6d533 libgsmefr/dec_state.h --- a/libgsmefr/dec_state.h Thu Dec 15 02:54:31 2022 +0000 +++ b/libgsmefr/dec_state.h Thu Dec 15 07:23:18 2022 +0000 @@ -52,4 +52,6 @@ /* from pstfilt2.c */ Word16 res2[L_SUBFR]; Word16 mem_syn_pst[M]; + /* our own addition */ + Word32 L_pn_seed_nodata; };