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

📄 quantgain.dsp

📁 基于ADSP的G.729语音编解码程序
💻 DSP
📖 第 1 页 / 共 2 页
字号:
/************************************************************************/
/* $$01/10/2000 checked Quagain 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        Quagain;

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

/************************************************************************/
/* Gain predictor, Past quantized energies = -14.0 in Q10               */
/* $$01/10/2000 static varaibles used in decoder frame speech process   */
/************************************************************************/
.VAR/DM/RAM/SEG=App_DMmem    Enc_pastqua_en[4];
.VAR/DM/RAM/SEG=App_DMmem    tmp_m6, tmp_i6, alias_m7, alias_i7;		//+sunny
/************************************************************************/
.EXTERNAL      div_s;
.EXTERNAL      Gain_update;
.EXTERNAL      Gain_predict;
.EXTERNAL      Enc_gcoeff_cs,Enc_exp_gcoeff_cs,tameflag;

/************************************************************************
* Function  init the quantizer of gain                                  *
* $$01/10/2000 used only in encoder									    *
* Calling Parameters										         	*	
* Return Values														    *
* Altered Registers: I1,M1						                        * 	
* Computation Time : 18 cycles									  	    *	
*************************************************************************/
.ENTRY         Init_QuantGain;

Init_QuantGain:
			   I1=^Enc_pastqua_en;
			   DM(I1,M1)=H#C800;
			   DM(I1,M1)=H#C800;
			   DM(I1,M1)=H#C800;
			   DM(I1,M1)=H#C800;
			   RTS;
/************************************************************************
* Function  Qua_gain                                                    *
* $$01/10/2000 used only in encoder									    *
* $$01/11/2000 modify pointer and varaibles to adapt table change       *
* Calling Parameters										         	*	
*         I2       : Q13 Innovative vector.                             *
*         Enc_gcoeff_cs: Correlations coefficents                       *
*         Enc_exp_gcoeff_cs : Q-Format g_coeff[]                        *
*         SI       : Subframe length.									*
*         tameflag : set to 1 if taming is needed                       *
* Return Values														    *
*         MR0      : Q14 Pitch gain.                                    *
*         MY1      : Q1  Code gain.                                     * 
*         AR       : Index of quantization.                             *
* Altered Registers: MR,SR,SE,AR,I0,AY0,MY0                             * 	
* Computation Time : 18 cycles									  	    *	
*************************************************************************/
.ENTRY         Qua_gain;
.VAR/DM/RAM/SEG=App_DMbuf    coeff[5], coeff_lsf[5];
.VAR/DM/RAM/SEG=App_DMbuf    exp_min[5],best_gain[2];
.VAR/DM/RAM/SEG=App_DMtmp    exp_gcode0,gcode0;
.VAR/DM/RAM/SEG=App_DMtmp    gain_pitch,gain_code;

Qua_gain:	   //CNTR=SI;
  /*---------------------------------------------------*
   *-  energy due to innovation                       -*
   *-  predicted energy                               -*
   *-  predicted codebook gain => gcode0[exp_gcode0]  -*
   *---------------------------------------------------*/
               I1=^Enc_pastqua_en;
			   CNTR=SI;
			   CALL Gain_predict;
			   DM(gcode0)=SR0;
			   DM(exp_gcode0)=AR;
  /*--------------------------------------------------------------*
   *  pre-selection                                               *
   *  calculate best gain                                         *
   *--------------------------------------------------------------*/
			   M3=2;
			   I1=^Enc_gcoeff_cs;
			   I2=^Enc_exp_gcoeff_cs;
			   MX0=DM(I1,M3);
			   MY0=DM(I1,M3);
			   MR=MX0 * MY0(SS),AX0=DM(I2,M3);
			   AY0=DM(I2,M3);
			   AF=AX0+AY0,SR0=MR0;
			   AF=AF-1,AY0=DM(I2,M0);
			   AR=AY0+1,MX0=DM(I1,M0);
			   AR=AR+AY0,SR1=MR1;
			   MR=MX0 * MX0(SS);
			   AR=AF-AR,AX0=AR;
			   IF GT AR=-AR;
			   AR=AF-AX0,SE=AR;
			   IF LE JUMP quagain_br1;
			   SR=LSHIFT SR0(LO),AR=SR1;
			   SR=SR OR ASHIFT AR(HI);
			   AY0=SR0;
			   DIS AR_SAT;
			   AR=MR0-AY0,AY1=SR1;
			   ENA AR_SAT;
			   MR0=AR,AR=MR1-AY1+C-1;
			   AR=PASS AX0,MR1=AR;
			   JUMP quagain_comm1;
quagain_br1:   AY0=SR0;
			   SR=LSHIFT MR0 (LO),AY1=SR1;
			   SR=SR OR ASHIFT MR1(HI);
			   DIS AR_SAT;
			   AR=AY0-SR0;
			   ENA AR_SAT;
			   MR0=AR,AR=AY1-SR1+C-1;
			   AR=PASS AF,MR1=AR;
quagain_comm1: SE=EXP MR1(HI);
               SE=EXP MR0(LO);
			   SR=NORM MR0(LO),AY0=SE;
			   SR=SR OR NORM MR1(HI);
			   SR=ASHIFT SR1 BY 0(LO);
			   AR=AR-AY0;
			   AR=AR-16;
			   AX0=AR;
			   MR1=H#0000;
			   MR0=H#4000;
			   CALL div_s;
			   AY0=29;
			   AR=-AR;
			   AR=AY0-AX0,MY1=AR;
			   AX1=AR;	
  /*--------------------------------------------------------------*
   *  best_gain[0] = (2.*coeff[2]*coeff[1]-coeff[3]*coeff[4])*tmp *
   *--------------------------------------------------------------*/
			   I1=^Enc_gcoeff_cs+1;
			   I2=^Enc_exp_gcoeff_cs+1;
			   MX0=DM(I1,M1);
			   MY0=DM(I1,M1);
			   MR=MX0 * MY0(SS),AX0=DM(I2,M1);
			   AY0=DM(I2,M1);
			   AF=AX0+AY0,SR0=MR0; 
			   AY0=DM(I2,M1);
			   AR=AY0+1,SR1=MR1;
			   MX0=DM(I1,M1);
			   AY0=DM(I2,M1);
			   AR=AR+AY0,MY0=DM(I1,M1);
			   MR=MX0 * MY0(SS),AX0=AR;
			   AR=AF-AX0;
			   IF GT AR=-AR;
			   AR=AR-1;
			   AR=AF-AX0,SE=AR;
			   IF LE JUMP quagain_br2;
			   SR=LSHIFT SR0 (LO),AR=SR1;
			   SR=SR OR ASHIFT AR (HI);
			   AY0=SR0;
			   AY1=SR1;
			   SR=LSHIFT MR0 BY -1(LO);
			   SR=SR OR ASHIFT MR1 BY -1(HI);
			   DIS AR_SAT;
			   AR=AY0-SR0,AY0=AX0;
			   ENA AR_SAT;
			   MR0=AR,AR=AY1-SR1+C-1;
			   AR=AY0-1,MR1=AR;
			   JUMP quagain_comm2;
quagain_br2:   AR=PASS SR1;
			   SR=LSHIFT SR0 BY -1(LO);
			   SR=SR OR ASHIFT AR BY -1(HI);
			   AY0=SR0;
			   SR=LSHIFT MR0(LO),AY1=SR1;
			   SR=SR OR ASHIFT MR1(HI);
			   DIS AR_SAT;
			   AR=AY0-SR0;
			   ENA AR_SAT;
			   MR0=AR,AR=AY1-SR1+C-1;
			   AR=AF-1,MR1=AR;
quagain_comm2: SE=EXP MR1(HI);
			   SE=EXP MR0(LO);
			   SR=NORM MR0(LO),AY0=SE;
			   SR=SR OR NORM MR1(HI);
			   MR=SR1 * MY1(SS);
			   AF=AR-AY0;
			   AR=AX1+AF,AY1=MR1;
			   AY0=40;
			   AR=AY0-AR;
			   AF=MR0 OR AY1,SE=AR;
			   IF EQ JUMP lacc_dto1;
			   NONE=PASS AR;
			   IF LE JUMP lacc_dto1;
			   SE=EXP MR1(HI);
			   SE=EXP MR0(LO);
			   AY1=SE;
			   AR=AR+AY1,SE=AR;
			   IF LE JUMP lacc_dto1;
			   SR1=H#7FFF;
			   NONE=PASS MR1;
			   IF GE JUMP quagain_con1;
			   SR1=H#8000;
			   JUMP quagain_con1;
lacc_dto1:	   SR=LSHIFT MR0 (LO);
			   SR=SR OR ASHIFT MR1(HI);			   
quagain_con1:  AY0=DM(tameflag);
			   AF=AY0-1,AR=SR1;
			   IF NE JUMP no_change;
			   AY0=GPCLIP2;
			   AF=AR-AY0;
			   IF GT AR=PASS AY0;
  /*--------------------------------------------------------------*
   *  best_gain[1] = (2.*coeff[0]*coeff[3]-coeff[1]*coeff[4])*tmp *
   *--------------------------------------------------------------*/
no_change:     DM(best_gain)=AR;
               I1=^Enc_gcoeff_cs;
			   I2=^Enc_exp_gcoeff_cs;
			   MX0=DM(I1,M1);
			   MX1=DM(I1,M3);
			   MY0=DM(I1,M1);
			   MR=MX0 * MY0(SS),AX0=DM(I2,M1);
			   AY1=DM(I2,M3);
			   AR=AY1+1,AY0=DM(I2,M1);
			   MY0=DM(I1,M1);
			   AF=AX0+AY0,SR0=MR0;
			   MR=MX1 * MY0(SS),SR1=MR1;
			   AY0=DM(I2,M1);
			   AR=AR+AY0;
			   AR=AF-AR,AX0=AR;
			   IF GT AR=-AR;
			   AR=AR-1;
			   AR=AF-AX0,SE=AR;
			   IF LE JUMP quagain_br3;
			   SR=LSHIFT SR0(LO),AR=SR1;
			   SR=SR OR ASHIFT AR(HI);
			   AY0=SR0;
			   AY1=SR1;
			   SR=LSHIFT MR0 BY -1(LO);
			   SR=SR OR ASHIFT MR1 by -1(HI);
			   DIS AR_SAT;
			   AR=AY0-SR0,AY0=AX0;
			   ENA AR_SAT;
			   MR0=AR,AR=AY1-SR1+C-1;
			   AR=AY0-1,MR1=AR;
 	           JUMP quagain_comm3;
quagain_br3:   AR=PASS SR1;
			   SR=LSHIFT SR0 BY -1(LO);
			   SR=SR OR ASHIFT AR BY -1(HI);
			   AY0=SR0;
			   SR=LSHIFT MR0(LO),AY1=SR1;
			   SR=SR OR ASHIFT MR1(HI);
               DIS AR_SAT;			  
 			   AR=AY0-SR0;
			   ENA AR_SAT;
			   MR0=AR,AR=AY1-SR1+C-1;
			   AR=AF-1,MR1=AR;
quagain_comm3: SE=EXP MR1(HI);
			   SE=EXP MR0(LO);
			   SR=NORM MR0(LO),AY0=SE;
			   SR=SR OR NORm MR1(HI);
			   MR=SR1 * MY1(SS);
			   AF=AR-AY0;
			   AR=AX1+AF;
			   AY0=33;
			   AR=AY0-AR;
			   AF=MR0 OR AY1,SE=AR;
			   IF EQ JUMP lacc_dto2;
			   NONE=PASS AR;
			   IF LE JUMP lacc_dto2;
			   SE=EXP MR1(HI);
			   SE=EXP MR0(LO);
			   AY1=SE;
			   AR=AR+AY1,SE=AR;
			   IF LE JUMP lacc_dto2;
			   SR1=H#7FFF;
			   NONE=PASS MR1;
			   IF GE JUMP quagain_con2;
			   SR1=H#8000;
			   JUMP quagain_con2;
lacc_dto2:	   SR=LSHIFT MR0 (LO);
			   SR=SR OR ASHIFT MR1(HI);			   
quagain_con2:  DM(best_gain+1)=SR1;
   /*----------Change Q-format of gcode0 ( Q[exp_gcode0] -> Q4 )---*/
			   MR1=DM(gcode0);
			   AR=DM(exp_gcode0);
			   AR=AR-4;
			   IF LT JUMP no_expgain;
			   AR=-AR;
               SE=AR;  
			   SR=ASHIFT MR1(HI);
			   JUMP presearch_codebook;
no_expgain:    AR=16-AR;
			   SE=AR;
			   SR=LSHIFT MR1 (LO);
			   SR=SR OR ASHIFT MR2(HI);
  /*----------------------------------------------*
   *   - presearch for gain codebook -            *
   *----------------------------------------------*/
presearch_codebook:
               I1=^best_gain;
			   MY1=SR1;
               CALL Gbk_presel;
  /*-----------------------------------------------*
   *     Find the best quantizer.                  *
   *-----------------------------------------------*/
			   AY0=13;
               I0=^exp_min;
			   I3=^Enc_exp_gcoeff_cs;
			   AX0=DM(I3,M1);
			   AR=AX0+AY0,AX0=DM(I3,M1);
			   AF=AX0+AY0,DM(I0,M1)=AR;
			   AY0=21;
			   MR0=DM(exp_gcode0);
			   SR=ASHIFT MR0 BY 1(LO);
			   AR=AF+1,AX0=DM(I3,M1);
			   AF=SR0-AY0,DM(I0,M1)=AR;	
			   AR=AX0+AF,AX1=MR0;
			   AY1=3;
			   AX0=DM(I3,M1);
			   AF=AX1-AY1,DM(I0,M1)=AR;
			   AR=AX0+AF,AX0=DM(I3,M1);
			   AF=AF-1,DM(I0,M1)=AR;
			   AR=AX0+AF;
			   DM(I0,M1)=AR;
			   CNTR=4;
			   I3=^exp_min;
			   AR=DM(I3,M1);
			   DO find_minexp UNTIL CE;
			   AF=PASS AR,AY0=DM(I3,M1);
			   NONE=AY0-AR;
			   IF LT AF=PASS AY0;
find_minexp:   AR=PASS AF;
   /*----------align coeff[] and save in special----------*/
   /*----------32 bit double precision--------------------*/
//			   CNTR=5;
			   I1=^coeff;
			   I3=^exp_min;
			   I2=^coeff_lsf;
			   I0=^Enc_gcoeff_cs;
			   CNTR=5;
			   DO align_coeff UNTIL CE;
			   AX0=DM(I3,M1);
			   AR=AF-AX0,SR1=DM(I0,M1);
               SE=AR;			   
			   SR=ASHIFT SR1(HI);
			   DM(I1,M1)=SR1;
			   SR=LSHIFT SR0 BY -1(LO);
align_coeff:   DM(I2,M1)=SR0;
   /*----------Codebook search-------------*/
			   MX1=H#FFFF;
			   AY1=H#7FFF;
			   AX1=DM(gcode0);
			   CALL search_codbook;
  /*-----------Read the quantized gain--------------------------*
   * *gain_pit = gbk1[indice1][0] + gbk2[indice2][0];           *
   *------------------------------------------------------------*/
read_quagain:  MY0=DM(gcode0);
			   M5=M2;
			   M6=M3;
			   I5=^gbk11;
			   I6=^gbk21;
			   MODIFY(I5,M5);
			   MODIFY(I6,M6);
			   AX0=PM(I5,M5);
			   AY0=PM(I6,M6);
  /*-----------------------------------------------------------*
   * *gain_code = (gbk1[indice1][1]+gbk2[indice2][1]) * gcode0 *
   *-----------------------------------------------------------*/
               I5=^gbk12;
			   I6=^gbk22;
			   MODIFY(I5,M5);
			   MODIFY(I6,M6);
			   AR=AX0+AY0,SR0=PM(I5,M5);
			   DM(gain_pitch)=AR;
			   SR=ASHIFT SR0 BY 0(LO);		    
			   AF=PASS SR0,MR0=PM(I6,M6);
			   DIS AR_SAT;         
			   AR=MR0+AF,AY1=SR1;

⌨️ 快捷键说明

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