FreeCalypso > hg > efr-experiments
diff src/bits2prm.c @ 0:56410792419a
src: original EFR source from ETSI
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 03 Apr 2024 05:31:37 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/bits2prm.c Wed Apr 03 05:31:37 2024 +0000 @@ -0,0 +1,99 @@ +/************************************************************************* + * + * FUNCTION: Bits2prm_12k2 + * + * PURPOSE: Retrieves the vector of encoder parameters from the received + * serial bits in a frame. + * + * DESCRIPTION: The encoder parameters are: + * + * BFI bad frame indicator 1 bit + * + * LPC: + * 1st codebook 7 bit + * 2nd codebook 8 bit + * 3rd codebook 8+1 bit + * 4th codebook 8 bit + * 5th codebook 6 bit + * + * 1st and 3rd subframes: + * pitch period 9 bit + * pitch gain 4 bit + * codebook index 35 bit + * codebook gain 5 bit + * + * 2nd and 4th subframes: + * pitch period 6 bit + * pitch gain 4 bit + * codebook index 35 bit + * codebook gain 5 bit + * + *************************************************************************/ + +#include "typedef.h" +#include "basic_op.h" +#include "count.h" + +/* Local function */ + +Word16 Bin2int ( /* Reconstructed parameter */ + Word16 no_of_bits, /* input : number of bits associated with value */ + Word16 *bitstream /* output: address where bits are written */ +); + +#define BIT_0 0 +#define BIT_1 1 +#define PRM_NO 57 + +void Bits2prm_12k2 ( + Word16 bits[], /* input : serial bits (244 + bfi) */ + Word16 prm[] /* output: analysis parameters (57+1 parameters) */ +) +{ + Word16 i; + + static const Word16 bitno[PRM_NO] = + { + 7, 8, 9, 8, 6, /* LSP VQ */ + 9, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 5, /* first subframe */ + 6, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 5, /* second subframe */ + 9, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 5, /* third subframe */ + 6, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 5}; /* fourth subframe */ + + *prm++ = *bits++; move16 (); /* read BFI */ + + for (i = 0; i < PRM_NO; i++) + { + prm[i] = Bin2int (bitno[i], bits); move16 (); + bits += bitno[i]; + } + return; +} + +/************************************************************************* + * + * FUNCTION: Bin2int + * + * PURPOSE: Read "no_of_bits" bits from the array bitstream[] and convert + * to integer. + * + *************************************************************************/ + +Word16 Bin2int ( /* Reconstructed parameter */ + Word16 no_of_bits, /* input : number of bits associated with value */ + Word16 *bitstream /* output: address where bits are written */ +) +{ + Word16 value, i, bit; + + value = 0; move16 (); + for (i = 0; i < no_of_bits; i++) + { + value = shl (value, 1); + bit = *bitstream++; move16 (); + test (); + if (sub (bit, BIT_1) == 0) + value = add (value, 1); + } + return (value); +}