📄 bitscp.c
字号:
/* ITU-T G.729 Annex C+ - Reference C code for floating point implementation of G.729 Annex C+ (integration of Annexes B, D and E) Version 2.1 of October 1999*/ /*File : BITSCP.CUsed for the floating point version of G729B main body, G729D and G729E*//*****************************************************************************//* bit stream manipulation routines *//*****************************************************************************/#include "typedef.h"#include "ld8k.h"#include "ld8cp.h"#include "tab_ld8k.h"#include "tabld8cp.h"#include "sid.h"#include "vad.h"#include "dtx.h"#include "tab_dtx.h"#include "octet.h"/* prototypes for local functions */static void int2bin(int value, int no_of_bits, INT16 *bitstream);static int bin2int(int no_of_bits, INT16 *bitstream);/*----------------------------------------------------------------------------* prm2bits_ld8c -converts encoder parameter vector into vector of serial bits* bits2prm_ld8c - converts serial received bits to encoder parameter vector*----------------------------------------------------------------------------** G.729 main Recommendation: 8 kb/s** The transmitted parameters are:** LPC: 1st codebook 7+1 bit* 2nd codebook 5+5 bit** 1st subframe:* pitch period 8 bit* parity check on 1st period 1 bit* codebook index1 (positions) 13 bit* codebook index2 (signs) 4 bit* pitch and codebook gains 4+3 bit** 2nd subframe:* pitch period (relative) 5 bit* codebook index1 (positions) 13 bit* codebook index2 (signs) 4 bit* pitch and codebook gains 4+3 bit**----------------------------------------------------------------------------** G.729 Annex D: 6.4 kb/s** The transmitted parameters are:** LPC: 1st codebook 7+1 bit* 2nd codebook 5+5 bit** 1st subframe:* pitch period 8 bit* codebook index1 (positions) 9 bit* codebook index2 (signs) 2 bit* pitch and codebook gains 3+3 bit** 2nd subframe:* pitch period (relative) 4 bit* codebook index1 (positions) 9 bit* codebook index2 (signs) 2 bit* pitch and codebook gains 3+3 bit**----------------------------------------------------------------------------** G.729 Annex E: 11.8 kb/s** The transmitted parameters in forward mode are:** mode (including parity) 1+1 bit** LPC: 1st codebook 7+1 bit* 2nd codebook 5+5 bit** 1st subframe:* pitch period 8 bit* parity check on 1st period 1 bit* codebook index 7x5 bit* pitch and codebook gains 4+3 bit** 2nd subframe:* pitch period (relative) 5 bit* codebook index 7x5 bit* pitch and codebook gains 4+3 bit** The transmitted parameters in backward mode are:** mode (including parity) 1+1 bit** 1st subframe:* pitch period 8 bit* parity check on 1st period 1 bit* codebook index 13+10+7+7+7 bit* pitch and codebook gains 4+3 bit** 2nd subframe:* pitch period (relative) 5 bit* codebook index 13+10+7+7+7 bit* pitch and codebook gains 4+3 bit*----------------------------------------------------------------------------*/void prm2bits_ld8c( int prm[], /* input : encoded parameters */ INT16 bits[] /* output: serial bits */){ int i; INT16 *ptr_bits; ptr_bits = bits; *ptr_bits++ = SYNC_WORD; /* bit[0], at receiver this bits indicates BFI */ switch(prm[0]){ case 0 : { /* DTX: no bits transmitted */ *ptr_bits = RATE_0; break; } case 1 : { /* SID: 15 bits (or 16 bits if OCTET mode) */ #ifndef OCTET_TX_MODE *ptr_bits++ = RATE_SID; for (i = 0; i < PRM_SIZE_SID; i++) { int2bin(prm[i+1], bitsno_B[i], ptr_bits); ptr_bits += bitsno_B[i]; }#else *ptr_bits++ = RATE_SID_OCTET; for (i = 0; i < PRM_SIZE_SID; i++) { int2bin(prm[i+1], bitsno_B[i], ptr_bits); ptr_bits += bitsno_B[i]; } *ptr_bits++ = BIT_0;#endif break; } case 2 : { *ptr_bits++ = RATE_6400; for (i = 0; i < PRM_SIZE_D; i++) { int2bin(prm[i+1], bitsno_D[i], ptr_bits); ptr_bits += bitsno_D[i]; } break; } case 3 : { *ptr_bits++ = RATE_8000; for (i = 0; i < PRM_SIZE; i++) { int2bin(prm[i+1], bitsno[i], ptr_bits); ptr_bits += bitsno[i]; } break; } case 4 : { *ptr_bits++ = RATE_11800; /* case 11.8 kbps */ if((prm[1]) == 0) { /* mode parameter */ *ptr_bits++ = BIT_0; /* "Backward / Forward" Indication bit */ *ptr_bits++ = BIT_0; /* Parity bit */ for (i = 0; i < PRM_SIZE_E_fwd-1; i++) { int2bin(prm[i+2], bitsno_E_fwd[i], ptr_bits); ptr_bits += bitsno_E_fwd[i]; } } else { *ptr_bits++ = BIT_1; /* "Backward / Forward" Indication bit */ *ptr_bits++ = BIT_1; /* Parity bit */ for (i = 0; i < PRM_SIZE_E_bwd-1; i++) { int2bin(prm[i+2], bitsno_E_bwd[i], ptr_bits); ptr_bits += bitsno_E_bwd[i]; } } break; } default : { printf("Unrecognized frame type\n"); exit(-1); } } return;}/*----------------------------------------------------------------------------* int2bin convert integer to binary and write the bits bitstream array*----------------------------------------------------------------------------*/static void int2bin( int value, /* input : decimal value */ int no_of_bits, /* input : number of bits to use */ INT16 *bitstream /* output: bitstream */ ){ INT16 *pt_bitstream; int i, bit; pt_bitstream = bitstream + no_of_bits; for (i = 0; i < no_of_bits; i++) { bit = value & 0x0001; /* get lsb */ if (bit == 0) *--pt_bitstream = BIT_0; else *--pt_bitstream = BIT_1; value >>= 1; } return;}/*----------------------------------------------------------------------------* bits2prm_ld8c - converts serial received bits to encoder parameter vector*----------------------------------------------------------------------------*/void bits2prm_ld8c( INT16 bits[], /* input : serial bits */ int prm[] /* output: decoded parameters */){ int i, mode, parity_mode; int nb_bits; nb_bits = (int)*bits++; /* Number of bits in this frame */ switch(nb_bits){ case RATE_0 : { /* DTX: no bits transmitted */ prm[1] = 0; break; } #ifndef OCTET_TX_MODE case RATE_SID : { /* SID: 15 bits (not in OCTET mode) */ prm[1] = 1; for (i = 0; i < PRM_SIZE_SID; i++) { prm[i+2] = bin2int(bitsno_B[i], bits); bits += bitsno_B[i]; } break; }#else /* the last bit of the SID bit stream under octet mode will be discarded */ case RATE_SID_OCTET : { /* SID: 16 bits (OCTET mode) */ prm[1] = 1; for (i = 0; i < PRM_SIZE_SID; i++) { prm[i+2] = bin2int(bitsno_B[i], bits); bits += bitsno_B[i]; } break; }#endif case RATE_6400 : { /* G729 Annex D: 64 bits*/ prm[1] = 2; for (i = 0; i < PRM_SIZE_D; i++) { prm[i+2] = bin2int(bitsno_D[i], bits); bits += bitsno_D[i]; } break; } case RATE_8000 : { /* G729: 80 bits*/ prm[1] = 3; for (i = 0; i < PRM_SIZE; i++) { prm[i+2] = bin2int(bitsno[i], bits); bits += bitsno[i]; } break; } case RATE_11800 : { /* G729 Annex E: 118 bits*/ prm[1] = 4; if( *bits++ == BIT_0) { mode = 0; } else { mode = 1; } if( *bits++ == BIT_0) { parity_mode = 0; } else { parity_mode = 1; } if (mode != parity_mode) { /* ==> frame erased */ for (i=0; i<RATE_11800-2; i++) bits[i] = 0; } prm[2] = mode; if (mode == 0) { for (i = 0; i < PRM_SIZE_E_fwd-1; i++) { prm[i+3] = bin2int(bitsno_E_fwd[i], bits); bits += bitsno_E_fwd[i]; } } else { for (i = 0; i < PRM_SIZE_E_bwd-1; i++) { prm[i+3] = bin2int(bitsno_E_bwd[i], bits); bits += bitsno_E_bwd[i]; } } break; } default : { printf("Unrecognized frame type: uncorrect value of serial_size\n"); exit(-1); } } return;} /*----------------------------------------------------------------------------* bin2int - read specified bits from bit array and convert to integer value*----------------------------------------------------------------------------*/static int bin2int( /* output: decimal value of bit pattern */ int no_of_bits, /* input : number of bits to read */ INT16 *bitstream /* input : array containing bits */ ){ int value, i; int bit; value = 0; for (i = 0; i < no_of_bits; i++) { value <<= 1; bit = *bitstream++; if (bit == BIT_1) value += 1; } return(value);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -