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

语音压缩

开发平台:

C/C++

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