FreeCalypso > hg > gsm-codec-lib
view libgsmefr/bfi_nodata.c @ 604:54f0f1b74c25
libgsmhr1 TFO: require BFI=0 and SID=0 for homing
In order for a received frame to be recognized as DHF, we need
not only the correct bit pattern, but also BFI=0 and SID=0.
The BFI=0 requirement should be obvious, while the SID=0 requirement
is needed only for HR codec. With FR and EFR, SID classification
comes from the payload bits and no separate check is needed -
but in HR we get an out-of-band SID ternary flag. When SID=1,
no payload bits are used at all; when SID=2, we use only the first
33 bits of the payload. Therefore, it is proper to conditionalize
DHF acceptance on SID=0.
We already implemented this logic in the just finished full decoder;
now bring TFO code into agreement.
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Thu, 04 Dec 2025 19:40: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); }
