view libtwamr/d4_17pf.c @ 577:d68b2c92464a
libgsmhr1: bring in parts of dtx.[ch] needed for RxFE
author |
Mychaela Falconia <falcon@freecalypso.org> |
date |
Thu, 13 Feb 2025 03:06:11 +0000 (6 weeks ago) |
parents |
dfaa8f322a8d |
children |
|
line source
/*
********************************************************************************
*
* GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001
* R99 Version 3.3.0
* REL-4 Version 4.1.0
*
********************************************************************************
*
* File : d4_17pf.c
* Purpose : Algebraic codebook decoder
*
********************************************************************************
*/
/*
********************************************************************************
* MODULE INCLUDE FILE AND VERSION ID
********************************************************************************
*/
#include "namespace.h"
#include "d4_17pf.h"
/*
********************************************************************************
* INCLUDE FILES
********************************************************************************
*/
#include "typedef.h"
#include "basic_op.h"
#include "no_count.h"
#include "cnst.h"
#include "graytab.h"
/*
********************************************************************************
* LOCAL VARIABLES AND TABLES
********************************************************************************
*/
#define NB_PULSE 4
/*
********************************************************************************
* PUBLIC PROGRAM CODE
********************************************************************************
*/
/*************************************************************************
*
* FUNCTION: decod_ACELP()
*
* PURPOSE: Algebraic codebook decoder
*
*************************************************************************/
void decode_4i40_17bits(
Word16 sign, /* i : signs of 4 pulses. */
Word16 index, /* i : Positions of the 4 pulses. */
Word16 cod[] /* o : algebraic (fixed) codebook excitation */
)
{
Word16 i, j;
Word16 pos[NB_PULSE];
/* Decode the positions */
i = index & 7; logic16 ();
i = dgray[i]; move16 ();
pos[0] = add(i, shl(i, 2)); /* pos0 =i*5 */ move16 ();
index = shr(index, 3);
i = index & 7; logic16 ();
i = dgray[i]; move16 ();
i = add(i, shl(i, 2)); /* pos1 =i*5+1 */
pos[1] = add(i, 1); move16 ();
index = shr(index, 3);
i = index & 7; logic16 ();
i = dgray[i]; move16 ();
i = add(i, shl(i, 2)); /* pos2 =i*5+1 */
pos[2] = add(i, 2); move16 ();
index = shr(index, 3);
j = index & 1; logic16 ();
index = shr(index, 1);
i = index & 7; logic16 ();
i = dgray[i]; move16 ();
i = add(i, shl(i, 2)); /* pos3 =i*5+3+j */
i = add(i, 3);
pos[3] = add(i, j); move16 ();
/* decode the signs and build the codeword */
for (i = 0; i < L_SUBFR; i++) {
cod[i] = 0; move16 ();
}
for (j = 0; j < NB_PULSE; j++) {
i = sign & 1; logic16 ();
sign = shr(sign, 1);
test ();
if (i != 0) {
cod[pos[j]] = 8191; move16 ();
} else {
cod[pos[j]] = -8192; move16 ();
}
}
return;
}