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;
 }
--- 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;
 };