/*************************************************************************
 *
 *  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 "typedef.h"

#define L_CODE    40            /* codevector length */
#define NB_TRACK  5             /* number of track */

void dec_10i40_35bits (
    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;

    for (i = 0; i < L_CODE; i++)
    {
        cod[i] = 0;
    }

    /* decode the positions and signs of pulses and build the codeword */

    for (j = 0; j < NB_TRACK; j++)
    {
        /* compute index i */

        tmp = index[j];
        i = tmp & 7;
        i = dgray[i];

        i = (i*5);
        pos1 = i + j; /* position of pulse "j" */

        i = (tmp >> 3) & 1;
        if (i == 0)
        {
            sign = 4096; /* +1.0 */
        }
        else
        {
            sign = -4096; /* -1.0 */
        }

        cod[pos1] = sign;

        /* compute index i */

        i = index[j + 5] & 7;
        i = dgray[i];
        i = (i*5);

        pos2 = i + j;      /* position of pulse "j+5" */

        if (pos2 < pos1)
        {
            sign = -sign;
        }
        cod[pos2] += sign;
    }
}
