📄 bits.c
字号:
/*
ITU-T G.729A Speech Coder ANSI-C Source Code
Version 1.1 Last modified: September 1996
Copyright (c) 1996,
AT&T, France Telecom, NTT, Universite de Sherbrooke
All rights reserved.
*/
/*****************************************************************************/
/* bit stream manipulation routines */
/*****************************************************************************/
#include "typedef.h"
#include "ld8a.h"
#include "tab_ld8a.h"
/* prototypes for local functions */
static void bit2byte(Word16 para,int bitlen,unsigned char * bits,int bitpos) ;
static Word16 byte2bit(int bitlen,unsigned char * bits,int bitpos) ;
/*----------------------------------------------------------------------------
* prm2bits_ld8k -converts encoder parameter vector into vector of serial bits
* bits2prm_ld8k - converts serial received bits to encoder parameter vector
*
* 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
*----------------------------------------------------------------------------
*/
void prm2bits_ld8k(Word16 *para,unsigned char *bits)
{
int i;
int bitpos = 0;
for (i = 0;i<PRM_SIZE;i++) {
bit2byte(*para++,bitsno[i],bits,bitpos);
bitpos += bitsno[i];
}
}
/*----------------------------------------------------------------------------
* int2bin convert integer to binary and write the bits bitstream array
*----------------------------------------------------------------------------
*/
void bit2byte(Word16 para,int bitlen,unsigned char * bits,int bitpos)
{
int i;
int bit = 0;
unsigned char newbyte = 0;
unsigned char *p = bits + (bitpos / 8);
for (i = 0 ;i < bitlen; i++) {
bit = (para >> (bitlen - i -1) ) &0x01;
newbyte = (1 << (7 - bitpos % 8));
if (bit == 1)
*p |= newbyte;
else
*p &= ~newbyte;
bitpos++;
if (bitpos % 8 == 0)
p++;
}
}
/*----------------------------------------------------------------------------
* bits2prm_ld8k - converts serial received bits to encoder parameter vector
*----------------------------------------------------------------------------
*/
void bits2prm_ld8k(unsigned char *bits,Word16 *para)
{
int i;
int bitpos = 0;
for (i = 0;i<PRM_SIZE;i++) {
*para++ = byte2bit(bitsno[i],bits,bitpos);
bitpos += bitsno[i];
}
}
/*----------------------------------------------------------------------------
* bin2int - read specified bits from bit array and convert to integer value
*----------------------------------------------------------------------------
*/
Word16 byte2bit(int bitlen,unsigned char * bits,int bitpos)
{
int i;
int bit = 0;
Word16 newbyte = 0;
Word16 value = 0;
unsigned char *p = bits + (bitpos / 8);
for (i = 0 ;i < bitlen; i++) {
bit = (*p >> (7 - bitpos % 8)) &0x01;
if (bit == 1) {
newbyte = (1 << (bitlen - i -1));
value |= newbyte;
}
bitpos++;
if (bitpos % 8 == 0)
p++;
}
return value;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -