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

📄 prm2bits.c

📁 AMR-NB 的编码实现,纯C, VC下建立工程即可用.
💻 C
字号:

#include "prm2bits.h"

#include "AmrCode_Comm.h"
#include "basic_op.h" 
#include "bitno_tab.h"

#define MASK      0x0001

const static unsigned char bytemask_1[8]= 
{
0x80, 0x40,0x20, 0x10, 0x08, 0x04, 0x02, 0x01
};
const static  unsigned char bytemask_0[8] = 
{
 0x7f, 0xbf, 0xdf,0xef, 0xf7, 0xfb, 0xfd, 0xfe
};

 /**********************************************************************************                         LOCAL PROGRAM CODE*********************************************************************************//************************************************************************* * *  FUNCTION:  Int2bin * *  PURPOSE:  convert integer to binary and write the bits to the array *            bitstream[]. The most significant bits are written first. * *************************************************************************/static void Int2bin (    Word16 value,           /* input : value to be converted to binary      */
    Word16 no_of_bits,   /* input : number of bits associated with value */
    Word16 *bitstream   /* output: address where bits are written       */){    Word16 *pt_bitstream, i, bit;    pt_bitstream = &bitstream[no_of_bits];      
    for (i = 0; i < no_of_bits; i++)    {        bit = value & MASK;                    
      
        if (bit == 0)        {            *--pt_bitstream = BIT_0;         
        }        else        {            *--pt_bitstream = BIT_1;           
        }        value = value>> 1;
    }}
/************************************************************************* * *  FUNCTION:    Prm2bits * *  PURPOSE:     converts the encoder parameter vector into a vector of serial *               bits. * *  DESCRIPTION: depending on the mode, different numbers of parameters *               (with differing numbers of bits) are processed. Details *               are found in bitno.tab * *************************************************************************/

void Prm2bits (Mode usedmode, Mode mode ,TXFrameType tx_ftype,Word16 prm[],  unsigned char  bits[] )
{   Word16 i,j;

   /*前4比特为发送帧类型信息*/
   short bitoffset = 4;   
   short byteoffset = 0;
   
   /*输出的比特统计信息*/
   short bitcount = 4;

   short value, bitnum, prmbitcnt;

   unsigned char* pbits = bits;

   // transfer frame type info: 4bits
   pbits[0]  = 0;
   pbits[0] |= (tx_ftype<<4)&0x00f0;
	 
   
   for (i = 0; i < prmno[usedmode]; i++)
   {

     // Int2bin (prm[i], bitno[mode][i], bits);

	value          =  prm[i];
	bitnum        =  bitno[usedmode][i];
	prmbitcnt    =  bitnum - 1;
	   
	for( j = 0; j < bitnum ;j ++)
	{

             if(  (value>>prmbitcnt) & 0x0001 )
             	{
          	       pbits[byteoffset] |= bytemask_1[bitoffset];
             	}
		else
		{
		      pbits[byteoffset]  &= bytemask_0[bitoffset];
		}
		
	       bitcount ++;
	       bitoffset   =  bitcount & 0x07;
	       byteoffset =  bitcount >> 3;

		prmbitcnt --;
      
	}
     
   }     

    //mode info : 4 bits
    
     //value = mode;
     //prmbitcnt = 3;
	 
     if (tx_ftype != TX_NO_DATA)
     {
        pbits[31] |= mode& 0x000f;

     }


   
   return;}


/************************************************************ Function: Bin2int Description : Reconstructed parameter      Input:          no_of_bits: number of bits associated with value           Output:          bitstream: address where bits are written Return: *************************************************************/static Word16 Bin2int ( Word16 no_of_bits, Word16 *bitstream ){    Word16 value, i, bit;    value = 0;                                    for (i = 0; i < no_of_bits; i++)    {        value <<= 1;        bit = *bitstream++;                               if (bit ==BIT_1 )            value ++;    }    return (value);}

typedef struct {    char *name;      int   id;         } conv_table;/* * mode name <-> mode id conversion table */static const conv_table modetable[] = {    {"MR475", MR475},    {"MR515", MR515},    {"MR59",  MR59},    {"MR67",  MR67},    {"MR74",  MR74},    {"MR795", MR795},    {"MR102", MR102},    {"MR122", MR122},    {"MRDTX", MRDTX},    {NULL,    -1}};/*  * frame type name <-> frame type id conversion tabl  */static const conv_table rxframetable[] = {  {"RX_SPEECH_GOOD", RX_SPEECH_GOOD},  {"RX_SPEECH_DEGRADED", RX_SPEECH_DEGRADED},  {"RX_SPEECH_BAD", RX_SPEECH_BAD},  {"RX_SID_FIRST", RX_SID_FIRST},  {"RX_SID_UPDATE", RX_SID_UPDATE},  {"RX_SID_BAD", RX_SID_BAD},  {"RX_ONSET", RX_ONSET},  {"RX_NO_DATA", RX_NO_DATA},  {NULL, -1}};/** frame type name <-> frame type id conversion table*/static const conv_table txframetable[] = {  {"TX_SPEECH_GOOD", TX_SPEECH_GOOD},  {"TX_SPEECH_DEGRADED", TX_SPEECH_DEGRADED},  {"TX_SPEECH_BAD", TX_SPEECH_BAD},  {"TX_SID_FIRST", TX_SID_FIRST},  {"TX_SID_UPDATE", TX_SID_UPDATE},  {"TX_SID_BAD", TX_SID_BAD},  {"TX_ONSET", TX_ONSET},  {"TX_NO_DATA", TX_NO_DATA},  {NULL, -1}};static int search_string(const conv_table *p, const char *str){    if (str == NULL)        return -1;        do    {        if (strcmp(p->name, str) == 0)            return p->id;        p++;    } while (p->name != NULL);    return -1;}int str2mode(const char* str,   Mode *mode){    int m;    if ((m = search_string(modetable, str)) == -1)        return 1;    *mode = (  Mode) m;    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -