bits.c
上传用户:zhouyunkk
上传日期:2013-01-10
资源大小:59k
文件大小:6k
源码类别:

语音压缩

开发平台:

C/C++

  1. /*
  2.    ITU-T G.729 Annex C - Reference C code for floating point
  3.                          implementation of G.729
  4.                          Version 1.01 of 15.September.98
  5. */
  6. /*
  7. ----------------------------------------------------------------------
  8.                     COPYRIGHT NOTICE
  9. ----------------------------------------------------------------------
  10.    ITU-T G.729 Annex C ANSI C source code
  11.    Copyright (C) 1998, AT&T, France Telecom, NTT, University of
  12.    Sherbrooke.  All rights reserved.
  13. ----------------------------------------------------------------------
  14. */
  15. /*
  16.  File : BITS.C
  17.  Used for the floating point version of both
  18.  G.729 main body and G.729A
  19. */
  20. /*****************************************************************************/
  21. /* bit stream manipulation routines                                          */
  22. /*****************************************************************************/
  23. #include "typedef.h"
  24. #include "version.h"
  25. #ifdef VER_G729A
  26.  #include "ld8a.h"
  27.  #include "tab_ld8a.h"
  28. #else
  29.  #include "ld8k.h"
  30.  #include "tab_ld8k.h"
  31. #endif
  32. /* prototypes for local functions */
  33. static void   int2bin(int  value, int  no_of_bits, INT16 *bitstream);
  34. static int    bin2int(int  no_of_bits, INT16 *bitstream);
  35. /*----------------------------------------------------------------------------
  36.  * prm2bits_ld8k -converts encoder parameter vector into vector of serial bits
  37.  * bits2prm_ld8k - converts serial received bits to  encoder parameter vector
  38.  *
  39.  * The transmitted parameters for 8000 bits/sec are:
  40.  *
  41.  *     LPC:     1st codebook           7+1 bit
  42.  *              2nd codebook           5+5 bit
  43.  *
  44.  *     1st subframe:
  45.  *          pitch period                 8 bit
  46.  *          parity check on 1st period   1 bit
  47.  *          codebook index1 (positions) 13 bit
  48.  *          codebook index2 (signs)      4 bit
  49.  *          pitch and codebook gains   4+3 bit
  50.  *
  51.  *     2nd subframe:
  52.  *          pitch period (relative)      5 bit
  53.  *          codebook index1 (positions) 13 bit
  54.  *          codebook index2 (signs)      4 bit
  55.  *          pitch and codebook gains   4+3 bit
  56.  *
  57.  *----------------------------------------------------------------------------
  58.  */
  59. void prm2bits_ld8k(
  60.  int  prm[],            /* input : encoded parameters  */
  61.  unsigned char *bits           /* output: serial bits         */
  62. )
  63. {
  64.    bits[0] = (unsigned char)(prm[0] & 0xff);
  65.    bits[1] = (unsigned char)((prm[1] & 0x03fc) >> 2);
  66.    bits[2] = (unsigned char)((prm[1] & 0x0003) << 6);
  67.    bits[2] |= (unsigned char)((prm[2] & 0x00fc) >> 2);
  68.    bits[3] = (unsigned char)((prm[2] & 0x0003) << 6);
  69.    bits[3] |= (unsigned char)((prm[3] & 0x0001) << 5);
  70.    bits[3] |= (unsigned char)((prm[4] & 0x1f00) >> 8);
  71.    bits[4] = (unsigned char)(prm[4] & 0x00ff);
  72.    bits[5] = (unsigned char)((prm[5] & 0x000f) << 4);
  73.    bits[5] |= (unsigned char)((prm[6] & 0x0078) >> 3);
  74.    bits[6] = (unsigned char)((prm[6] & 0x0007) << 5);
  75.    bits[6] |= (unsigned char)(prm[7] & 0x001f);
  76.    bits[7] = (unsigned char)((prm[8] & 0x1fe0) >> 5);
  77.    bits[8] = (unsigned char)((prm[8] & 0x001f) << 3);
  78.    bits[8] |= (unsigned char)((prm[9] & 0x000e) >> 1);
  79.    bits[9] = (unsigned char)((prm[9] & 0x0001) << 7);
  80.    bits[9] |= (unsigned char)(prm[10] & 0x007f);
  81.    return;
  82. }
  83. /*----------------------------------------------------------------------------
  84.  * int2bin convert integer to binary and write the bits bitstream array
  85.  *----------------------------------------------------------------------------
  86.  */
  87. static void int2bin(
  88.  int  value,             /* input : decimal value */
  89.  int  no_of_bits,        /* input : number of bits to use */
  90.  INT16 *bitstream        /* output: bitstream  */
  91. )
  92. {
  93.    INT16 *pt_bitstream;
  94.    int    i, bit;
  95.    pt_bitstream = bitstream + no_of_bits;
  96.    for (i = 0; i < no_of_bits; i++)
  97.    {
  98.      bit = value & 0x0001;      /* get lsb */
  99.      if (bit == 0)
  100.          *--pt_bitstream = BIT_0;
  101.      else
  102.          *--pt_bitstream = BIT_1;
  103.      value >>= 1;
  104.    }
  105.    return;
  106. }
  107. /*----------------------------------------------------------------------------
  108.  *  bits2prm_ld8k - converts serial received bits to  encoder parameter vector
  109.  *----------------------------------------------------------------------------
  110.  */
  111. void bits2prm_ld8k(
  112.  unsigned char *bits,      /* input : serial bits        */
  113.  int prm[]                 /* output: decoded parameters */
  114. )
  115. {
  116.    prm[0] = (int)(bits[0]);
  117.    prm[1] = ((int)bits[1]) << 2;
  118.    prm[1] |= (int)(bits[2] >> 6);
  119.    prm[2] = ((int)(bits[2] & 0x3f)) << 2;
  120.    prm[2] |= (int)(bits[3] >> 6);
  121.    prm[3] = (int)((bits[3] & 0x20) >> 5);
  122.    prm[4] = (int)(bits[3] & 0x1f) << 8;
  123.    prm[4] |= (int)bits[4];
  124.    prm[5] = (int)(bits[5] >> 4);
  125.    prm[6] = (int)(bits[5] & 0x0f) << 3;
  126.    prm[6] |= (int)(bits[6] >> 5);
  127.    prm[7] = (int)(bits[6] & 0x1f);
  128.    prm[8] = (int)bits[7] << 5;
  129.    prm[8] |= (int)(bits[8] >> 3);
  130.    prm[9] = ((int)bits[8] & 0x07) << 1;
  131.    prm[9] |= (int)(bits[9] >> 7);
  132.    prm[10] = (int)bits[9] & 0x7f;
  133.    return;
  134. }
  135. /*----------------------------------------------------------------------------
  136.  * bin2int - read specified bits from bit array  and convert to integer value
  137.  *----------------------------------------------------------------------------
  138.  */
  139. static int  bin2int(            /* output: decimal value of bit pattern */
  140.  int  no_of_bits,        /* input : number of bits to read       */
  141.  INT16 *bitstream        /* input : array containing bits        */
  142. )
  143. {
  144.    int    value, i;
  145.    int  bit;
  146.    value = 0;
  147.    for (i = 0; i < no_of_bits; i++)
  148.    {
  149.      value <<= 1;
  150.      bit = *bitstream++;
  151.      if (bit == BIT_1)  value += 1;
  152.    }
  153.    return(value);
  154. }