view libgsmefr/d1035pf.c @ 183:452c1d5a6268

libgsmefr BFI w/o data: emit zero output after decoder reset In real-life usage, each EFR decoder session will most likely begin with lots of BFI frames before the first real frame arrives. However, because the spec-defined home state of the decoder is speech rather than CN, our regular logic for BFI w/o data would have to feed pseudorandom noise to the decoder (in the "fixed codebook excitation pulses" part), which is silly to do at the beginning of the decoder session right out of reset. Therefore, let's check reset_flag_old, and if we are still in the reset state, simply emit zero output.
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 03 Jan 2023 00:12:18 +0000
parents d80e9f12a1d1
children 6ad363f7ea30
line wrap: on
line source

/*************************************************************************
 *
 *  FUNCTION:   dec_10i40_35bits()
 *
 *  PURPOSE:  Builds the innovative codevector from the received
 *            index of algebraic codebook.
 *
 *   See  c1035pf.c  for more details about the algebraic codebook structure.
 *
 *************************************************************************/

#include "gsm_efr.h"
#include "typedef.h"
#include "namespace.h"
#include "basic_op.h"
#include "memops.h"
#include "no_count.h"
#include "codec.h"

#define L_CODE    40            /* codevector length */
#define NB_PULSE  10            /* number of pulses  */
#define NB_TRACK  5             /* number of track */

void dec_10i40_35bits (
    const Word16 index[], /* (i)  : index of 10 pulses (sign+position)       */
    Word16 cod[]          /* (o)  : algebraic (fixed) codebook excitation    */
)
{
    static const Word16 dgray[8] = {0, 1, 3, 2, 5, 6, 4, 7};
    Word16 i, j, pos1, pos2, sign, tmp;

    Set_zero (cod, L_CODE);

    /* decode the positions and signs of pulses and build the codeword */

    for (j = 0; j < NB_TRACK; j++)
    {
        /* compute index i */

        tmp = index[j];                                 move16 ();
        i = tmp & 7;                                    logic16 (); 
        i = dgray[i];                                   move16 (); 

        i = extract_l (L_shr (L_mult (i, 5), 1));
        pos1 = add (i, j); /* position of pulse "j" */

        i = shr (tmp, 3) & 1;                           logic16 (); 
        if (i == 0)
        {
            sign = 4096;                                move16 (); /* +1.0 */
        }
        else
        {
            sign = -4096;                               move16 (); /* -1.0 */
        }

        cod[pos1] = sign;                               move16 (); 

        /* compute index i */

        i = index[add (j, 5)] & 7;                      logic16 (); 
        i = dgray[i];                                   move16 (); 
        i = extract_l (L_shr (L_mult (i, 5), 1));

        pos2 = add (i, j);      /* position of pulse "j+5" */

        if (sub (pos2, pos1) < 0)
        {
            sign = negate (sign);
        }
        cod[pos2] = add (cod[pos2], sign);              move16 (); 
    }

    return;
}