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

📄 gainpred.dsp

📁 基于ADSP的G.729语音编解码程序
💻 DSP
字号:
/****************************************************************************/
/* $$01/10/2000 checked gain predict module data variables and function     */
/* $$01/16/2001 modified and printed,Author: Jason.wang (zhigang wang)      */
/* $$01/16/2001 Email: wzg119@yeah.net,  BP: 86+02195950-161452             */
/* $$01/16/2001 This modlue is not optimized! should be test on Emulator    */
/****************************************************************************/
.MODULE/SEG=App_PM        GainPred;

/****************************************************************************/
#include       "ld8a.inc"
#include       "tab_ld8a.inc"

/****************************************************************************/
.EXTERNAL      Log2,Pow2;

/*****************************************************************************
* MA prediction performed on the innovation energy (in dB with mean removed) *
* $$01/10/2000 only used in encoder                                          *
* $$01/11/2000 move dm data table to pm data table                           *
* $$01/11/2000 modify pointer and varaibles to adapt table change            *
* Calling Parameters   					  					                 *	
*         I1   : Q10 Past quantized energies                                 *
*         I2   : Q13 Innovative vector.                                      *
*         CNTR : Subframe length.                                            *
* Return Values														         *
*         SR0  : Qxx Predicted codebook gain                                 *
*         AR   : Q-Format(gcode0)                                            *
* Altered Registers: MR,MF,SR,SE,AR,AF,AY0,MY0,I1,I2,I5                      *	
* Computation Time : 18 cycles				                                 *
******************************************************************************/
.ENTRY         Gain_predict;

Gain_predict:  MR=0;
   /*---------------------------------------------*
   *   Energy coming from code                    *
   *----------------------------------------------*/
			   DO sum_gain UNTIL CE;
               AR=DM(I2,M1);
sum_gain:	   IF NOT MV MR=MR+AR*AR(SS);
               IF MV SAT MR;
  /*-----------------------------------------------------------------*
   *  Compute: means_ener - 10log10(ener_code/ L_sufr)               *
   *  Note: mean_ener change from 36 dB to 30 dB because input/2     *
   *-----------------------------------------------------------------*/
			   CALL Log2;   
			   AR=PASS 1;
			   MY0=H#9FAC;
			   MR0=H#D300;
			   MR1=H#001F;
			   MF=SR0 * MY0(SS);
			   MR=MR+AR * MF(SS);
			   MR=MR+SR1*MY0(SS);
  /*-----------------------------------------------------------------*
   * Compute gcode0.                                                 *
   *  = Sum(i=0,3) pred[i]*past_qua_en[i] - ener_code + mean_ener    *
   *-----------------------------------------------------------------*/
			   SR=LSHIFT MR0 BY 10(LO);
			   SR=SR OR ASHIFT MR1 BY 10(HI);
			   MR0=SR0;
			   MR1=SR1;
//			   CNTR=4;
			   I5=^pred;
			   CNTR=4;
			   DO sum_pre_qua UNTIL CE;
			   MX0=DM(I1,M1),MY0=PM(I5,M4);
sum_pre_qua:   IF NOT MV MR=MR+MX0*MY0(SS);
               IF MV SAT MR;
  /*---------------------------------------------------------*
   * gcode0 = pow(10.0, gcode0/20)                           *
   *        = pow(2, 3.3219*gcode0/20)                       *
   *        = pow(2, 0.166*gcode0)                           *
   *---------------------------------------------------------*/
			   AY0=14;
			   MY0=5439;
			   MR=MR1*MY0(SS);
			   SR=LSHIFT MR0 BY -8(LO);
			   SR=SR OR ASHIFT MR1 BY -8(HI);
			   AF=AY0-SR1,MR1=AY0;
			   SR=LSHIFT SR0 BY -1(LO);
			   MR0=SR0;
			   CALL Pow2;
			   AR=PASS AF;
			   RTS;
/****************************************************************************
* Function Gain_update is update table of past quantized energies           *
* $$01/10/2000 only used in encoder                                         *
* Calling Parameters												        *	
*         MR1  : Q13 gbk1[indice1][1]+gbk2[indice2][1]                      *
*         MR0  : Q13 gbk1[indice1][1]+gbk2[indice2][1]                      *
* Return Values													         	*
*         I1 : Q10 Past quantized energies                                  *
* Altered Registers: MR,SR,SE,AR,AF,AY0,MY0,I1,I5                           *	
* Computation Time : 18 cycles										        *	
*****************************************************************************/
.ENTRY         Gain_update;

Gain_update:   CALL Log2;
			   AY0=13;
			   AF=SR1-AY0;
			   SR=ASHIFT SR0 BY 1(LO);
			   AR=SR1+AF;
			   SR=LSHIFT SR0 BY 13(LO);
			   SR=SR OR ASHIFT AR BY 13(HI);
			   MY0=24660;
			   MR=SR1*MY0(SS),SR0=DM(I1,M0);  
               DM(I1,M1)=MR1;  
			   AR=DM(I1,M0);   
               DM(I1,M1)=SR0;  
			   SR0=DM(I1,M0);  
               DM(I1,M1)=AR;   
               DM(I1,M1)=SR0;  
			   RTS;
/****************************************************************************
* update table of past quantized energies (frame erasure)                   *
* $$01/10/2000 only used in decoder                                         *
* Calling Parameters												        *	
*         I1   : Q10 Past quantized energies                                *
* Return Values														        *
* Altered Registers: MR,SR,SE,AR,AF,I1,I2,I5,AY0,AY1,MY0                    *	
* Computation Time : 18 cycles										        *	
*****************************************************************************/
.ENTRY         Gain_update_erasure;

Gain_update_erasure:
			   MR=0;
			   SE=0;
               I2=I1;
			   CNTR=4;
			   DO add_gain UNTIL CE;
			   AR=DM(I2,M1); 
			   SR=ASHIFT AR (LO),AY0=AR;
			   DIS AR_SAT;
			   AR=MR0+AY0,AY1=SR1;
			   ENA AR_SAT;
			   MR0=AR,AR=MR1+AY1+C;
               IF NOT AV JUMP add_gain;
			   AR=PASS AR,MR1=AR;
			   AR=H#FFFF;
			   IF NEG AR=AR+1;
			   AR=PASS MR1,MR0=AR;
add_gain:	   MR1=AR;			    
               SR=LSHIFT MR0 BY -2(LO);
			   SR=SR OR ASHIFT AR BY -2(HI);
			   AR=SR0-4096;
			   AY0=-14336;
			   AF=AR-AY0,SR0=DM(I1,M0); 
			   IF LT AR=PASS AY0;
               DM(I1,M1)=AR;  
			   AR=DM(I1,M0);  
               DM(I1,M1)=SR0; 
			   SR0=DM(I1,M0); 
               DM(I1,M1)=AR;   
               DM(I1,M1)=SR0; 
               RTS;
/****************************************************************************/
.ENDMOD;

⌨️ 快捷键说明

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