view libgsmefr/e_homing.c @ 494:aaf4dec8bee0

libgsmhr1: implement perfect SID detection
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 17 Jun 2024 23:14:19 +0000
parents 035424a6ca83
children
line wrap: on
line source

/**************************************************************************
 *
 *   File Name:  e_homing.c
 *
 *   Purpose:
 *      This file contains the following functions:
 *
 *      encoder_homing_frame_test()  checks if a frame of input samples
 *                                   matches the Encoder Homing Frame pattern.
 *
 *      encoder_reset()              called by reset_enc() to reset all
 *                                   the state variables for the encoder.
 *
 *      reset_enc()                  calls functions to reset the state
 *                                   variables for the encoder and VAD, and
 *                                   for the transmit DTX and Comfort Noise.
 *
 **************************************************************************/

#include "gsm_efr.h"
#include "typedef.h"
#include "namespace.h"
#include "cnst.h"
#include "vad.h"
#include "dtx.h"
#include "codec.h"
#include "sig_proc.h"
#include "memops.h"
#include "enc_state.h"
#include "e_homing.h"

/***************************************************************************
 *
 *   FUNCTION NAME:  encoder_homing_frame_test
 *
 *   PURPOSE:
 *      Checks if a frame of input samples matches the Encoder Homing Frame
 *      pattern, which is 0x0008 for all 160 samples in the frame.
 *
 *   INPUT:
 *      input_frame[]    one frame of speech samples
 *
 *   OUTPUT:
 *      None
 *
 *   RETURN:
 *      0       input frame does not match the Encoder Homing Frame pattern.
 *      1       input frame matches the Encoder Homing Frame pattern.
 *
 **************************************************************************/

Word16 encoder_homing_frame_test (const Word16 input_frame[])
{
    Word16 i, j;

    for (i = 0; i < L_FRAME; i++)
    {
        j = input_frame[i] ^ EHF_MASK;

        if (j)
            break;
    }

    return !j;
}

/***************************************************************************
 *
 *   FUNCTION NAME:  encoder_reset
 *
 *   PURPOSE:
 *      resets all of the state variables for the encoder
 *
 *   INPUT:
 *      None
 *
 *   OUTPUT:
 *      None
 *
 *   RETURN:
 *      None
 *
 **************************************************************************/

void encoder_reset (struct EFR_encoder_state *st)
{
    Word16 i;

    /* reset all the encoder state variables */
    /* ------------------------------------- */

    /* Variables in cod_12k2.c: */
    Init_Coder_12k2 (st);

    /* Variables in levinson.c: */
    st->old_A[0] = 4096;        /* Last A(z) for case of unstable filter */
    for (i = 1; i < M + 1; i++)
    {
        st->old_A[i] = 0;
    }

    /* Variables in pre_proc.c: */
    Init_Pre_Process (st);

    /* Variables in q_gains.c: */
    for (i = 0; i < 4; i++)
    {
        st->past_qua_en[i] = -2381; /* past quantized energies */
    }

    st->pred[0] = 44;               /* MA prediction coeff */
    st->pred[1] = 37;               /* MA prediction coeff */
    st->pred[2] = 22;               /* MA prediction coeff */
    st->pred[3] = 12;               /* MA prediction coeff */

    /* Variables in q_plsf_5.c: */
    for (i = 0; i < M; i++)
    {
        st->past_r2_q[i] = 0;       /* Past quantized prediction error */
    }

    return;
}

/***************************************************************************
 *
 *   FUNCTION NAME:  reset_enc
 *
 *   PURPOSE:
 *      resets all of the state variables for the encoder and VAD, and for
 *      the transmit DTX and Comfort Noise.
 *
 *   INPUT:
 *      None
 *
 *   OUTPUT:
 *      None
 *
 *   RETURN:
 *      None
 *
 **************************************************************************/

void EFR_encoder_reset (struct EFR_encoder_state *st, int dtx)
{
    st->dtx_mode = dtx;

    encoder_reset (st); /* reset all the state variables in the speech encoder*/
    vad_reset (st);     /* reset all the VAD state variables */
    reset_tx_dtx (st);  /* reset all the transmit DTX and CN variables */

    return;
}