diff libgsmfrp/comfort_noise.c @ 108:3b64f255689a

libgsmfrp: factor out PRNG into its own module, in preparation for using it as part of speech muting too
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 28 Nov 2022 04:00:18 +0000
parents 286d5f097eb4
children f081a6850fb5
line wrap: on
line diff
--- a/libgsmfrp/comfort_noise.c	Sun Nov 27 21:02:07 2022 +0000
+++ b/libgsmfrp/comfort_noise.c	Mon Nov 28 04:00:18 2022 +0000
@@ -17,53 +17,11 @@
 static const uint8_t bc[4] = {0, 0, 0, 0};
 static const uint8_t Nc[4] = {40, 120, 40, 120};
 
-/* pseudonoise() function is based on ETSI EFR code */
-
-static uint16_t pseudonoise(struct gsmfr_preproc_state *st, uint16_t no_bits)
-{
-    uint16_t noise_bits, Sn, i;
-
-    noise_bits = 0;
-    for (i = 0; i < no_bits; i++)
-    {
-        /* State n == 31 */
-        if ((st->cn_random_lfsr & 0x00000001L) != 0)
-        {
-            Sn = 1;
-        }
-        else
-        {
-            Sn = 0;
-        }
-
-        /* State n == 3 */
-        if ((st->cn_random_lfsr & 0x10000000L) != 0)
-        {
-            Sn = Sn ^ 1;
-        }
-        else
-        {
-            Sn = Sn ^ 0;
-        }
-
-        noise_bits = noise_bits << 1;
-        noise_bits = noise_bits | st->cn_random_lfsr & 1;
-
-        st->cn_random_lfsr >>= 1;
-        if (Sn & 1)
-        {
-            st->cn_random_lfsr |= 0x40000000L;
-        }
-    }
-
-    return noise_bits;
-}
-
 static uint8_t random_1to6(struct gsmfr_preproc_state *st)
 {
 	uint8_t range8, range6;
 
-	range8 = pseudonoise(st, 3);
+	range8 = gsmfr_preproc_prng(st, 3);
 	range6 = fold_table_8to6[(st->cn_random_6fold << 3) | range8];
 	st->cn_random_6fold++;
 	if (st->cn_random_6fold >= 3)
@@ -82,7 +40,7 @@
 	c = frame + 5;
 	/* now do the 4 subframes, mostly PRNG output */
 	for (sub = 0; sub < 4; sub++) {
-		Mc = pseudonoise(st, 2);
+		Mc = gsmfr_preproc_prng(st, 2);
 		for (pulse = 0; pulse < 13; pulse++)
 			xmc[pulse] = random_1to6(st);
 		/* packing code from libgsm */