view libgsmfr2/prng.c @ 282:9ee8ad3d4d30

frtest: rm gsmfr-hand-test and gsmfr-max-out utils These hack programs were never properly documented and were written only as part of a debug chase, in pursuit of a bug that ultimately turned out to be in our then-hacky patch to osmo-bts-sysmo, before beginning of proper patches in Osmocom. These hack programs need to be dropped from the present sw package because they depend on old libgsm, and we are eliminating that dependency.
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 14 Apr 2024 05:44:47 +0000
parents 573afa985df6
children
line wrap: on
line source

/*
 * We use a pseudorandom sequence generator function in two places:
 * when generating comfort noise (GSM 06.12 section 6.1), and when
 * randomizing grid position parameters as part of speech muting
 * during error handling (GSM 06.11 section 6).
 *
 * Our PRNG is a copy of the pseudonoise() function from ETSI EFR code,
 * where it is used for similar purposes.
 */

#include <stdint.h>
#include "tw_gsmfr.h"
#include "pp_state.h"
#include "pp_internal.h"

uint16_t gsmfr_preproc_prng(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;
}