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

📄 dtx_enc.c

📁 AMR-NB 的编码实现,纯C, VC下建立工程即可用.
💻 C
📖 第 1 页 / 共 2 页
字号:
	  lsp[6] = (Word16)(L_lsp[6]>> 3);
	  lsp[7] = (Word16)(L_lsp[7]>> 3);
	  lsp[8] = (Word16)(L_lsp[8]>> 3);
	  lsp[9] = (Word16)(L_lsp[9]>> 3);

      /*  quantize logarithmic energy to 6 bits */      pst->log_en_index = (log_en + 2560);          /* +2.5 in Q10      */
      pst->log_en_index = (pst->log_en_index + 128); /* add 0.5/4 in Q10 */
      pst->log_en_index = (pst->log_en_index >> 8);
       pst->log_en_index =  ( pst->log_en_index > 63) ? 63 : ((pst->log_en_index < 0)  ? 0 :  pst->log_en_index );
    
      /* update gain predictor memory */      log_en = (pst->log_en_index<< 8 ); /* Q11 and divide by 4 */
      log_en -=  11560 ;            /* add 2.5 in Q11      */
            //log_en -=  9000;
      log_en = (log_en > 0) ? 0 : (( log_en <  -14436) ? -14436 : log_en );
	 
      /* past_qua_en for other modes than MR122 */            ppredState->past_qua_en[0] = log_en;                  
      ppredState->past_qua_en[1] = log_en;                
      ppredState->past_qua_en[2] = log_en;                  
      ppredState->past_qua_en[3] = log_en;                  
      /* scale down by factor 20*log10(2) in Q15 */      log_en = (5443* log_en >> 15 );            /* past_qua_en for mode MR122 */            ppredState->past_qua_en_MR122[0] = log_en;            
      ppredState->past_qua_en_MR122[1] = log_en;           
      ppredState->past_qua_en_MR122[2] = log_en;            
      ppredState->past_qua_en_MR122[3] = log_en;             
       /* make sure that LSP's are ordered */      Lsp_lsf(lsp, lsf, M);//      Reorder_lsf(lsf, LSF_GAP, M);


	lsf_min1 =  LSF_GAP;        
  //  for (i = 0; i < M; i++)
    {	lsf[0] = ( lsf[0]< lsf_min1)? lsf_min1 : lsf[0];
	lsf_min1 =   lsf[0]+ LSF_GAP;

	lsf[1] = ( lsf[1]< lsf_min1)? lsf_min1 : lsf[1];
	lsf_min1 =   lsf[1]+ LSF_GAP;
	
	lsf[2] = ( lsf[2]< lsf_min1)? lsf_min1 : lsf[2];
	lsf_min1 =   lsf[2]+ LSF_GAP;
	
	lsf[3] = ( lsf[3]< lsf_min1)? lsf_min1 : lsf[3];
	lsf_min1 =   lsf[3]+ LSF_GAP;
	
	lsf[4] = ( lsf[4]< lsf_min1)? lsf_min1 : lsf[4];
	lsf_min1 =   lsf[4]+ LSF_GAP;
	
	lsf[5] = ( lsf[5]< lsf_min1)? lsf_min1 : lsf[5];
	lsf_min1 =   lsf[5]+ LSF_GAP;
	
	lsf[6] = ( lsf[6]< lsf_min1)? lsf_min1 : lsf[6];
	lsf_min1 =   lsf[6]+ LSF_GAP;
	
	lsf[7] = ( lsf[7]< lsf_min1)? lsf_min1 : lsf[7];
	lsf_min1 =   lsf[7]+ LSF_GAP;
	
	lsf[8] = ( lsf[8]< lsf_min1)? lsf_min1 : lsf[8];
	lsf_min1 =   lsf[8]+ LSF_GAP;
	
	lsf[9] = ( lsf[9]< lsf_min1)? lsf_min1 : lsf[9];
	lsf_min1 =   lsf[9]+ LSF_GAP;
    }

//	Lsf_lsp(lsf, lsp, M);
			
      ind1 = (lsf[0]>> 8);       offset1 = lsf[0] & 0x00ff;   
	L_tmp1 =  ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])*  offset1) <<1 ;
	lsp[0] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);


	ind1 = (lsf[1]>> 8);       offset1 = lsf[1] & 0x00ff;      
	L_tmp1 =  ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])*  offset1) <<1 ;
	lsp[1] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);

	ind1 = (lsf[2]>> 8);       offset1 = lsf[2] & 0x00ff;   
	L_tmp1 =  ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])*  offset1) <<1 ;
	lsp[2] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);

	ind1 = (lsf[3]>> 8);       offset1 = lsf[3] & 0x00ff;   
	L_tmp1 =  ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])*  offset1) <<1 ;
	lsp[3] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);

	ind1 = (lsf[4]>> 8);       offset1 = lsf[4] & 0x00ff;   
	L_tmp1 =  ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])*  offset1) <<1 ;
	lsp[4] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);

	ind1 = (lsf[5]>> 8);       offset1 = lsf[5] & 0x00ff;      
	L_tmp1 =  ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])*  offset1) <<1 ;
	lsp[5] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);

	ind1 = (lsf[6]>> 8);       offset1 = lsf[6] & 0x00ff;     
	L_tmp1 =  ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])*  offset1) <<1 ;
	lsp[6] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);

	ind1 = (lsf[7]>> 8);       offset1 = lsf[7] & 0x00ff;     
	L_tmp1 =  ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])*  offset1) <<1 ;
	lsp[7] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);

	ind1 = (lsf[8]>> 8);       offset1 = lsf[8] & 0x00ff;   
	L_tmp1 =  ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])*  offset1) <<1 ;
	lsp[8] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);

	ind1 = (lsf[9]>> 8);       offset1 = lsf[9] & 0x00ff;        
	L_tmp1 =  ((plsp_lsf_table[ind1 + 1]- plsp_lsf_table[ind1])*  offset1) <<1 ;
	lsp[9] = plsp_lsf_table[ind1] + (Word16) (L_tmp1>> 9);
	  
            /* Quantize lsp and put on parameter list */      Q_plsf_3(qSt, MRDTX, lsp, lsp_q, pst->lsp_index, 
               &pst->init_lsf_vq_index);
   }      *(*anap)++ = pst->init_lsf_vq_index; /* 3 bits */        
      *(*anap)++ = pst->lsp_index[0];      /* 8 bits */        
   *(*anap)++ = pst->lsp_index[1];      /* 9 bits */       
   *(*anap)++ = pst->lsp_index[2];      /* 9 bits */       
         *(*anap)++ = pst->log_en_index;      /* 6 bits    */     
 
   return 0;}/***************************************************************************

  Function    : dtx_buffer
  Purpose     : handles the DTX buffer
  Input          :
		st                : State struct                 
		lsp_new[]  : LSP vector                 
		speech[]     : speech samples            
  Output       :
             st                : State struct     
  Return:
                
**************************************************************************/

int dtx_buffer(dtx_encState *st,Word16 lsp_new[], Word16 speech[] )
{
   Word16 i;   Word32 L_frame_en;   Word16 log_en_e;   Word16 log_en_m;   Word16 log_en;
   Word16*plsp_new = lsp_new, *pspeech = speech;
   dtx_encState *pst = st;
      /* update pointer to circular buffer      */   pst->hist_ptr ++;
   pst->hist_ptr = (pst->hist_ptr == DTX_HIST_SIZE ) ? 0 : pst->hist_ptr;
   
      /* copy lsp vector into buffer */    memcpy( &pst->lsp_hist[pst->hist_ptr * M], plsp_new, 20);
      /* compute log energy based on frame energy */   L_frame_en = 0;     /* Q0 */                             for (i=0; i < L_FRAME; i++)   {
      L_frame_en +=  (pspeech[i]*pspeech[i] << 1); 
      if(L_frame_en < 0)      	{           L_frame_en = MAX_32; break;	 }
	      }      Log2(L_frame_en, &log_en_e, &log_en_m);      /* convert exponent and mantissa to Word16 Q10 */   log_en =  (log_en_e<< 10);  /* Q10 */   log_en +=  (log_en_m>> 5);      /* divide with L_FRAME i.e subtract with log2(L_FRAME) = 7.32193 */   log_en -=  8521;      /* insert into log energy buffer with division by 2 */   log_en >>= 1;   pst->log_en_hist[pst->hist_ptr] = log_en; /* Q10 */      

   return 0;}
Word16 tx_dtx_handler(dtx_encState *st, Word16 vad_flag, Mode *usedMode  )
{
	Word16 compute_new_sid_possible;
	dtx_encState *pst = st;

	/* this state machine is in synch with the GSMEFR txDtx machine      */ 
	pst->decAnaElapsedCount = pst->decAnaElapsedCount == 0x7fff ? 0x7fff : pst->decAnaElapsedCount + 1;  
	compute_new_sid_possible = 0;   

	if (vad_flag != 0)
	{
		pst->dtxHangoverCount = DTX_HANG_CONST;           
	}
	else 
	{  
		/* non-speech */
		if (pst->dtxHangoverCount == 0)
		{  
			/* out of decoder analysis hangover  */
			pst->decAnaElapsedCount = 0;                      
			*usedMode = MRDTX;                            
			compute_new_sid_possible = 1;                
		}
		else
		{ 
			/* in possible analysis hangover */
			pst->dtxHangoverCount  -- ;

			/* decAnaElapsedCount + dtxHangoverCount < DTX_ELAPSED_FRAMES_THRESH */
			*usedMode = ( pst->decAnaElapsedCount + pst->dtxHangoverCount < DTX_ELAPSED_FRAMES_THRESH ) ? MRDTX : *usedMode ; 
		}
	}
	return compute_new_sid_possible;
}

⌨️ 快捷键说明

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