BITS.C
上传用户:meifeng08
上传日期:2013-06-18
资源大小:5304k
文件大小:4k
源码类别:

语音压缩

开发平台:

C/C++

  1. /* Version 3.3    Last modified: December 26, 1995 */
  2. /*****************************************************************************/
  3. /* bit stream manipulation routines                                          */
  4. /*****************************************************************************/
  5. #include "typedef.h"
  6. #include "ld8k.h"
  7. #include "tab_ld8k.h"
  8. /* prototypes for local functions */
  9. static void  int2bin(Word16 value, Word16 no_of_bits, Word16 *bitstream);
  10. static Word16   bin2int(Word16 no_of_bits, Word16 *bitstream);
  11. /*----------------------------------------------------------------------------
  12.  * prm2bits_ld8k -converts encoder parameter vector into vector of serial bits
  13.  * bits2prm_ld8k - converts serial received bits to  encoder parameter vector
  14.  *
  15.  * The transmitted parameters are:
  16.  *
  17.  *     LPC:     1st codebook           7+1 bit
  18.  *              2nd codebook           5+5 bit
  19.  *
  20.  *     1st subframe:
  21.  *          pitch period                 8 bit
  22.  *          parity check on 1st period   1 bit
  23.  *          codebook index1 (positions) 13 bit
  24.  *          codebook index2 (signs)      4 bit
  25.  *          pitch and codebook gains   4+3 bit
  26.  *
  27.  *     2nd subframe:
  28.  *          pitch period (relative)      5 bit
  29.  *          codebook index1 (positions) 13 bit
  30.  *          codebook index2 (signs)      4 bit
  31.  *          pitch and codebook gains   4+3 bit
  32.  *----------------------------------------------------------------------------
  33.  */
  34. void prm2bits_ld8k(
  35.  Word16   prm[],           /* input : encoded parameters  (PRM_SIZE parameters)  */
  36.   Word16 bits[]           /* output: serial bits (SERIAL_SIZE ) bits[0] = bfi
  37.                                     bits[1] = 80 */
  38. )
  39. {
  40.    Word16 i;
  41.    *bits++ = SYNC_WORD;     /* bit[0], at receiver this bits indicates BFI */
  42.    *bits++ = SIZE_WORD;     /* bit[1], to be compatible with hardware */
  43.    for (i = 0; i < PRM_SIZE; i++)
  44.      {
  45.         int2bin(prm[i], bitsno[i], bits);
  46.         bits += bitsno[i];
  47.      }
  48.    return;
  49. }
  50. /*----------------------------------------------------------------------------
  51.  * int2bin convert integer to binary and write the bits bitstream array
  52.  *----------------------------------------------------------------------------
  53.  */
  54. static void int2bin(
  55.  Word16 value,             /* input : decimal value */
  56.  Word16 no_of_bits,        /* input : number of bits to use */
  57.  Word16 *bitstream       /* output: bitstream  */
  58. )
  59. {
  60.    Word16 *pt_bitstream;
  61.    Word16   i, bit;
  62.    pt_bitstream = bitstream + no_of_bits;
  63.    for (i = 0; i < no_of_bits; i++)
  64.    {
  65.      bit = value & (Word16)0x0001;      /* get lsb */
  66.      if (bit == 0)
  67.          *--pt_bitstream = BIT_0;
  68.      else
  69.          *--pt_bitstream = BIT_1;
  70.      value >>= 1;
  71.    }
  72. }
  73. /*----------------------------------------------------------------------------
  74.  *  bits2prm_ld8k - converts serial received bits to  encoder parameter vector
  75.  *----------------------------------------------------------------------------
  76.  */
  77. void bits2prm_ld8k(
  78.  Word16 bits[],          /* input : serial bits (80)                       */
  79.  Word16   prm[]            /* output: decoded parameters (11 parameters)     */
  80. )
  81. {
  82.    Word16 i;
  83.    for (i = 0; i < PRM_SIZE; i++)
  84.      {
  85.         prm[i] = bin2int(bitsno[i], bits);
  86.         bits  += bitsno[i];
  87.      }
  88. }
  89. /*----------------------------------------------------------------------------
  90.  * bin2int - read specified bits from bit array  and convert to integer value
  91.  *----------------------------------------------------------------------------
  92.  */
  93. static Word16 bin2int(            /* output: decimal value of bit pattern */
  94.  Word16 no_of_bits,        /* input : number of bits to read */
  95.  Word16 *bitstream       /* input : array containing bits */
  96. )
  97. {
  98.    Word16   value, i;
  99.    Word16 bit;
  100.    value = 0;
  101.    for (i = 0; i < no_of_bits; i++)
  102.    {
  103.      value <<= 1;
  104.      bit = *bitstream++;
  105.      if (bit == BIT_1)  value += 1;
  106.    }
  107.    return(value);
  108. }