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

📄 chan_dec.c

📁 语音压缩编码和解码的标准,其中包含部分源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
     /* Silence */
      EndLoop = NBitsSID;
      for (i=0;i<EndLoop;i++) BitOrder[i] = BitOrderSID[i];
      crc_window = CrcWindowSID;
      nbit_all = NInfoBitsSID+CrcLen+4;
   }
   if( (G723_mode_r & 0x3) == 3) {   
     /* not used */
     exit;
   }


   for (i = 0; i < crc_window; ++i) {  /* without CRC */
      info_bit_hd[i] = info_bit_r[i];
   }
   for (i=crc_window+CrcLen; i<nbit_all-4; ++i) {  /* without Tail */
      info_bit_hd[i-CrcLen] = info_bit_r[i];
   }

    for( i=0; i < 25; i++ )  CInfoBitStream_r[i]=0;

    for( i=0; i < EndLoop; i++ ) {
       pw = i/8;
       pb = i - pw*8;
       j  = (pw*8)+7-pb;
       if (BitOrder[j] != (-1)){
          if (info_bit_hd[BitOrder[j]] == 1) setbit( CInfoBitStream_r[pw], pb );
       }
    }       
    CInfoBitStream_r[0] = CInfoBitStream_r[0] | G723_mode_r;
    return;
}




static void   CrcDecoder(Word16 info_bit_r[], Word16 *bad_frame, Word16 G723_mode_r)
{

   Word16        crc_window;
   Word16        CrcCarry, ShiftReg, i;

   if ((G723_mode_r & 0x3) == 0){
      /* Rate 6.3 */
      crc_window = CrcWindow63;
   }
   if ((G723_mode_r & 0x3) == 1){
      /* Rate 5.3 */
      crc_window = CrcWindow53;
   }
   if( (G723_mode_r & 0x3) == 2) {   
     /* Silence */
      crc_window = CrcWindowSID;
   }
   if( (G723_mode_r & 0x3) == 3) {   
     /* not used */
     exit;
   }

   ShiftReg = 0;
   for (i = 0; i < crc_window; ++i) {
     CrcCarry = (info_bit_r[i] ^ ShiftReg) & 1;
     ShiftReg = shr(ShiftReg, 1);
     if (CrcCarry != 0) ShiftReg = ShiftReg ^ CrcGen;
   }


   /* determine CRC-badframe */
   /* ---------------------- */
   *bad_frame = 0;
   for (i=CrcLen-1;i>=0;i--){
      if (info_bit_r[crc_window + i] != (ShiftReg & (Word16) 1)) *bad_frame=1;
      ShiftReg = shr(ShiftReg, 1);
   }
   return;
}




static void LSP_Reorder_decoder (LINEDEF *Line)
{

/* Band0Tb8 */
static	Word16 tabd2_10[LspCbSize] = {
	 140,  185,  135,  137,  169,  168,  164,  166, 
	 187,  192,  238,  191,  180,  141,  177,  179, 
	 181,  183,  195,  184,  172,  173,  165,  161, 
	 194,  197,  196,  198,  188,  186,  189,  190, 
	   7,   43,   16,   17,    5,   40,    8,    9, 
	  20,   19,   22,   21,   42,  130,  131,  240, 
	 246,  249,  250,  251,  182,  239,  241,  242, 
	  23,   24,  247,  248,  253,  254,  252,  255, 
	 201,  143,  144,  136,  115,  114,  203,  202, 
	 139,  158,   28,  157,   97,   98,  228,  121, 
	 211,  171,    0,  174,  227,   27,  199,  200, 
	  87,  210,   25,    1,  219,  151,  162,  163, 
	 146,  142,  145,  170,  154,  138,  176,  178, 
	 243,  244,  236,  237,  105,  153,  155,  156, 
	  11,  175,  160,  159,   14,  132,  104,  103, 
	  15,  106,   18,  245,  134,  133,  193,  129, 
	  68,   67,  110,   65,   93,   92,   72,   71, 
	  90,   89,   88,   55,  225,   85,  224,  223, 
	  61,   60,   59,   50,   66,  234,  233,  230, 
	 205,  204,   51,   47,  231,   58,  147,   44, 
	  57,   69,  207,   56,  209,   53,   12,  208, 
	  26,   32,   29,  229,   33,  206,   31,   13, 
	  63,   62,   34,   37,   39,   38,   35,   45, 
	  36,   10,   41,    6,   46,    4,    2,    3, 
	 100,  102,  128,  101,   96,   95,  126,  222, 
	  74,   94,  220,   73,   77,   78,   75,   76, 
	 213,  221,  116,  122,   80,   82,  235,  216, 
	  86,   91,   54,   70,   83,   84,   81,  226, 
	 119,  120,  117,  118,  149,  150,  167,  152, 
	 214,  215,   30,  113,  217,  232,  212,  218, 
	 111,  112,  127,   99,   64,  109,   52,  108, 
	 148,  107,  123,  124,   49,   48,   79,  125
	};

/* Band1Tb8 */
static	Word16 tabd1_10[LspCbSize] = {
	 250,  249,  255,  254,  248,  251,  253,  252, 
	 150,  238,  243,  242,  226,  225,  227,  213, 
	 237,  234,  247,  246,  148,  147,  146,  145, 
	 240,  230,  244,  232,  239,  149,  212,  231, 
	 137,  221,  224,  223,  135,  134,  136,  141, 
	 220,  217,  222,  158,  153,  102,  105,  104, 
	 144,  143,  218,  219,  215,  157,  216,  152, 
	 151,   98,   75,   74,  155,  156,  103,  101, 
	 245,  241,  236,  235,   66,   65,   68,   67, 
	  70,   69,   64,   63,  208,  207,   60,  209, 
	 233,  140,  127,  126,  229,  228,  125,  139, 
	 131,  117,  123,  122,  133,  142,  124,  121, 
	 138,  214,  108,  106,  211,  210,  111,  109, 
	 120,  119,  113,  112,  206,  107,   18,  205, 
	  99,   76,   73,  160,  132,  130,  118,  129, 
	  97,   94,    0,   72,  110,   96,   95,   33, 
	 115,  114,   10,  116,   83,   81,   11,    9, 
	   8,   78,  128,   71,   12,   79,  163,  159, 
	  23,   25,   15,   24,   84,   87,    1,   82, 
	  22,   19,   62,   61,   20,   91,   21,   85, 
	  50,   45,   49,   48,  182,   51,  164,   47, 
	  40,   39,   77,  100,   35,   37,   36,  154, 
	 161,   43,   46,   38,  162,   41,   42,   44, 
	 165,   34,   80,   88,  166,   89,   93,   90, 
	 180,   28,  172,  171,   86,   27,   92,   26, 
	 181,    2,  184,  185,   29,   30,  168,  167, 
	  17,   16,  179,  177,    5,    3,    4,  178, 
	  13,  174,   14,  173,  195,  175,  199,  176, 
	 191,  192,  183,  187,  194,  188,  186,  169, 
	  52,   55,   53,   54,   57,   56,   58,   59, 
	 196,  197,  198,  193,    7,  200,    6,  203, 
	  32,   31,  202,  201,  170,  189,  204,  190
	};

/* Band0Tb8 */
static	Word16 tabd0_10[LspCbSize] = {
	 183,  196,  195,  179,  165,  180,  220,  221, 
	 203,  187,  206,  205,   36,   23,  198,  199, 
	 214,  178,  216,   26,  176,  177,  218,  219, 
	 141,  136,  142,  224,  155,  137,  229,  228, 
	 124,  117,  122,  123,  161,  169,  194,  170, 
	 138,  127,  134,  135,  201,  204,  149,  150, 
	 147,  168,  172,  171,  166,  167,  162,  164, 
	 133,  132,  130,  129,  121,  120,  128,  131, 
	 222,  223,  248,  249,  208,  209,   31,   32, 
	  35,   37,   24,   25,   28,   27,   30,   29, 
	 240,  253,  241,  242,  250,  252,  254,  255, 
	 234,  235,  236,  237,  246,  251,  239,  247, 
	 233,  230,  244,  238,  211,  245,  227,  210, 
	 152,  151,  215,  173,  154,  153,  207,  217, 
	 157,  158,  231,  232,  156,  226,  225,  243, 
	 140,  148,  146,  144,  145,  139,  126,  143, 
	  76,  185,   77,   41,   15,   43,  107,  110, 
	  58,   64,   65,   66,    6,  112,   60,   59, 
	  19,   78,   14,   21,   22,  163,   39,   40, 
	  92,   86,    1,  106,   93,  104,   18,  105, 
	 101,  102,   97,  100,   11,   12,   10,  103, 
	   9,    5,    3,    8,   69,   68,   67,   61, 
	 116,  114,   95,   87,   89,   88,   99,   98, 
	  94,   96,  108,  111,    7,    4,    2,  109, 
	  53,  192,  190,   55,   52,   54,   33,   34, 
	  48,   49,   56,   57,   42,   44,   63,   62, 
	 202,   72,  193,  174,  197,  212,  213,  175, 
	  13,  188,  186,  189,   38,  191,  182,  181, 
	  73,   47,   50,   51,   71,   46,   45,  184, 
	  85,   91,   17,   90,   80,   81,   74,   75, 
	  70,  200,   16,    0,  118,  119,  160,  159, 
	  83,  125,   79,  115,   20,   84,  113,   82
	};

Word16   lsp0,lsp1,lsp2;

/* Extract and reorder Band 2 */
   lsp2 = (Word16) (Line->LspId & (Word32) 0x000000FF);
   lsp2 = tabd2_10[lsp2];

/* Extract and reorder Band 1 */
   lsp1 = (Word16) ((Line->LspId >> 8) & (Word32) 0x000000FF);
   lsp1 = tabd1_10[lsp1];

/* Extract and reorder Band 0 */
   lsp0 = (Word16) ((Line->LspId >> 16) & (Word32) 0x000000FF);
   lsp0 = tabd0_10[lsp0];

/* Construct new Line->LspId */
   Line->LspId = (Word32) lsp0;
   Line->LspId = (Line->LspId << 8) + (Word32) lsp1;
   Line->LspId = (Line->LspId << 8) + (Word32) lsp2;

   return;
}




static void speech_decoder_adaptation (char CInfoBitStream_r[],
                                       char InfoBitStream_r[],Word16 IndexError[])
{
   Word16     FrType, i;
   LINEDEF  Line ;

   FrType = CInfoBitStream_r[0] & 3;

   if (FrType < 2) {
      Line = Line_Unpk_Channel( CInfoBitStream_r, IndexError) ;

      LSP_Reorder_decoder (&Line);

      /* This is a G.723.1 routine which uses the global "WrkRate"*/
      if (FrType == 0) WrkRate=Rate63;
      if (FrType == 1) WrkRate=Rate53;
      Line_Pack( &Line, InfoBitStream_r, (Word16) 1 ) ;   /* Ftyp = 1 */
      InfoBitStream_r[0] = InfoBitStream_r[0] & 0xFC;
      InfoBitStream_r[0] = InfoBitStream_r[0] | FrType;
   }else{
      for (i=0;i<4;i++) InfoBitStream_r[i] = CInfoBitStream_r[i];
      for (i=0;i<3;i++) IndexError[i] = 0;
   }
   return;
}



static LINEDEF  Line_Unpk_Channel( char *Vinp, Word16 IndexError[] )
{
        Word32    i,j;
	Word16	InfoBitStream_tmp[195] ;
	Word16    *Bsp = InfoBitStream_tmp ;
	Word16	FrType,error, Bound_AcGn ;
        LINEDEF Line ;
	Word32	Temp ;
        static Word16  MapIndexMamp[24]={0,1,2,3,4,5,6, 7, 8, 9,10,11,12,13,
                                       14,15,16,17,18,19,20,21,22,23};
        static Word16 Olp0_old={0},Olp1_old={0},AcGn_old={0},Mamp_old={0};
        static Word16 Tran_old={0};

        /* Clear index error counters */
        for (i=0;i<3;i++) IndexError[i]=0;

	/* Unpack the byte info to InfoBitStream vector */
	for ( i = 0 ; i < 192+3 ; i ++ )
		InfoBitStream_tmp[i] = ( Vinp[i>>3] >> (i & (Word16)0x0007) ) & (Word16)1 ;

	/* Decode the first two bits */
	FrType = (Word16)Ser2Par( &Bsp, 2 ) ;

	/* Decode the LspId */
	Line.LspId = Ser2Par( &Bsp, 24 ) ;

	if ( FrType == 2 ) {
		/* Decode the Noise Gain */

		return Line ;
	}

	/*
		Decode the common information to both rates
	*/

	/* Decode the adaptive codebook lags */
	Temp = Ser2Par( &Bsp, 7 ) ;
        if( Temp <= 123) {
           Line.Olp[0] = (Word16) Temp + (Word16)PitchMin ;
           Olp0_old = Line.Olp[0];
        }else {
           Line.Olp[0] = Olp0_old;
           IndexError[0] += 1;
        }

	Line.Sfs[1].AcLg = (Word16) Ser2Par( &Bsp, 2 ) ;

	Temp = Ser2Par( &Bsp, 7 ) ;
        if( Temp <= 123) {
           Line.Olp[1] = (Word16) Temp + (Word16)PitchMin ;
           Olp1_old = Line.Olp[1];
        }else {
           Line.Olp[1] = Olp1_old;
           IndexError[0] += 2;
        }

	Line.Sfs[3].AcLg = (Word16) Ser2Par( &Bsp, 2 ) ;

	Line.Sfs[0].AcLg = 1 ;
	Line.Sfs[2].AcLg = 1 ;

	/* Decode the 8 bit adaptive gains */
	for ( i = 0 ; i < SubFrames ; i ++ ) {

		Temp = Ser2Par( &Bsp, 8 ) ;

		Line.Sfs[i].Tran = 0 ;
                Bound_AcGn = NbFilt170 ;
		if ( (FrType == 0) && (Line.Olp[i>>1] < (SubFrLen-2) ) ) {
			Line.Sfs[i].Tran = (Word16)(Temp >> 7) ;
			Temp &= 0x0000007fL ;
                        Bound_AcGn = NbFilt085 ;
		}
                Line.Sfs[i].AcGn = (Word16) Temp;
                if((Line.Sfs[i].AcGn < Bound_AcGn)&&( (IndexError[0]&(1<<(i>>1)) ) == 0) ) {
                   AcGn_old = Line.Sfs[i].AcGn;
       		   Tran_old = Line.Sfs[i].Tran;
                }else{
       		   Line.Sfs[i].Tran = Tran_old ;
                   Line.Sfs[i].AcGn = AcGn_old;
                   IndexError[1]++;
                }
	}


	/* Decode the 5 bit fixed gains */
	for ( i = 0 ; i < SubFrames ; i ++ ) {
	   Line.Sfs[i].Mamp = (Word16) Ser2Par( &Bsp, 5 ) ;
           error = 1;
           for (j=0;j<NumOfGainLev;j++){
              if (Line.Sfs[i].Mamp == MapIndexMamp[j]){
                 Line.Sfs[i].Mamp = j;
                 error = 0;
              }
           }
           if (error == 0){
              Mamp_old = Line.Sfs[i].Mamp;
           }else{
              Line.Sfs[i].Mamp = Mamp_old;
              IndexError[2]++;
      	   }
	}


⌨️ 快捷键说明

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