⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitscp.c

📁 语音编码G.729 语音编码G.729
💻 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 + -