FreeCalypso > hg > gsm-codec-lib
view libgsmefr/d1035pf.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 | 6ad363f7ea30 |
children |
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 *= 5; pos1 = 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 *= 5; pos2 = i + j; /* position of pulse "j+5" */ if (pos2 < pos1) { sign = negate (sign); } cod[pos2] = add (cod[pos2], sign); move16 (); } return; }