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

📄 calcexc.dsp

📁 基于ADSP的G.729语音编解码程序
💻 DSP
字号:
/************************************************************************/
/* $$01/10/2000 checked Calcexc module data 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        Calcexc;

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

/************************************************************************/
.EXTERNAL      flag_cod;
.EXTERNAL      Sqrt;
.EXTERNAL      Gauss;
.EXTERNAL      Random;
.EXTERNAL      Inv_sqrt;
.EXTERNAL      Pred_lt_3;
.EXTERNAL      update_exc_err;

/************************************************************************
* Comfort Noise excitation for SID and not-transmitted frames			*
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters													*	
*         AX0      : target sample gain									*
*         MX0      : current Vad decision								*
*         flag_cod : encoder/decoder flag								*
* Return Values															*
*         I1       : excitation array									*
* Altered Registers: MR,SR,AR,I0,I1,I2,I3,AX0,MY0						*	
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Calc_exc_rand;
.VAR/DM/RAM/SEG=App_DMbuf    sign[4],position[4];
.VAR/DM/RAM/SEG=App_DMbuf    excg[L_SUBFR],excs[L_SUBFR];
.VAR/DM/RAM/SEG=App_DMtmp    inter_exc,cur_exc;
.VAR/DM/RAM/SEG=App_DMtmp    Inter,sh,frac,Gp,Gp2;
.VAR/DM/RAM/SEG=App_DMtmp    seed,cur_gain,subfr_ind;

Calc_exc_rand: DM(seed)=MX0;
			   DM(cur_gain)=AX0;
			   AR=PASS 0;
			   NONE=PASS AX0;
			   IF NE JUMP calc_exc_loop;	
			   CNTR=L_FRAME;
			   DO zero_exc UNTIL CE;
zero_exc:	   DM(I1,M1)=AR;
			   AY0=DM(flag_cod);
			   AR=PASS AY0,MY0=AR;
			   IF EQ RTS;
			   CNTR=NUM_OF_FRAME;
			   DO update_exc UNTIL CE;
			   AY0=L_SUBFR+1;
			   CALL update_exc_err;
update_exc:	   MY0=0;
			   RTS;
  	    {------Loop on subframes--------------------------}
calc_exc_loop: DM(cur_exc)=I1;
			   DM(subfr_ind)=AR;
        {------generate codebook parameters---------------}
 	           I2=^position;
		       I3=^sign;
               CALL gen_codebook;
        {------Generate gaussian excitation---------------}
   		       I1=^excg;
		       CALL gen_guassgain;
        {------generate random  adaptive excitation-------}
		       SR1=DM(Inter);
		       SR0=DM(frac);
		       CNTR=L_SUBFR;
		       I1=DM(cur_exc);
		       CALL Pred_lt_3;
        {------Compute adaptive+gaussian exc->cur_exc-----}
		       I1=^excg;
		       I2=DM(cur_exc);
               CALL gen_adapgain;
        {------Compute fixed code gain--------------------}
		       I1=^excs;
		       I3=^sign;
		       I2=^position;
		       CALL gen_fixgain;
        {------Update cur_exc with ACELP excitation-------}
		       I3=^sign;
               I2=^position;
		       CALL update_excit;
        {------specially for codec processing,update excitation-------}
		       AR=DM(flag_cod);
		       AR=PASS AR;
		       IF EQ JUMP calc_exc_con;
               MY0=DM(Gp);
		       AY0=DM(Inter);  
		       CALL update_exc_err;
calc_exc_con:  M3=L_SUBFR;
			   MX0=DM(seed);
               I1=DM(cur_exc);
			   MODIFY(I1,M3);
			   AY0=L_SUBFR;
			   AR=DM(subfr_ind);
			   AR=AR+AY0;
			   AY0=L_FRAME;
			   NONE=AR-AY0;
			   IF LT JUMP calc_exc_loop;
			   RTS;
/************************************************************************
* generate random adaptive codebook & fixed codebook parameters			*
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters													*	
* 	      I2   : positon of codebook									*
*		  I3   : sign of codebook										* 
*         MX0  : nose gererate seed										*
* Return Values															*
* Altered Registers: AX0,AY0,AY1,AR,MR,SR								*	
* Computation Time : 18 cycles											*	
*************************************************************************/
gen_codebook:  MY1=2;
			   CALL Random; 
			   AY0=H#0003; 
               AF=AR AND AY0,SR0=AR;
			   AR=AF-1;    
			   AF=AR-2;
			   IF EQ AR=PASS 0;
			   DM(frac)=AR;	
			   SR=LSHIFT SR0 BY -2(LO);
			   AY0=H#003F;
			   AR=SR0 AND AY0;
			   AY0=40;
			   AR=AR+AY0; 
			   DM(Inter)=AR;	
			   AY1=H#0007;
			   SR=LSHIFT SR0 BY -6(LO);
			   AR=SR0 AND AY1;
			   MR=AR * MY1(SS),AY0=AR;
			   AR=MR0+AY0;
			   AF=PASS H#0001;			   
			   SR=LSHIFT SR0 BY -3(LO);
			   AR=SR0 AND AF,DM(I2,M1)=AR;
			   SR=LSHIFT SR0 BY -1(LO);			   
               AR=SR0 AND AY1,DM(I3,M1)=AR;
			   MR=AR * MY1(SS),AY0=AR;
			   AR=MR0+AY0;
			   AR=AR+1;			   
			   SR=LSHIFT SR0 BY -3(LO);
			   AR=SR0 AND AF,DM(I2,M1)=AR;
			   DM(I3,M1)=AR;
			   CALL Random;  			   
			   AR=AR AND AY1,SR0=AR;
			   MR=AR * MY1(SS),AY0=AR;
			   AR=MR0+AY0;
			   AR=AR+2;			   
			   SR=LSHIFT SR0 BY -3(LO);
			   AR=SR0 AND AF,DM(I2,M1)=AR;			   
			   SR=LSHIFT SR0 BY -1(LO);
			   AR=SR0 AND AF,DM(I3,M1)=AR;
			   AR=AR+3;			   
			   AY0=H#000F;
			   AR=SR0 AND AY0,DM(I2,M0)=AR;
			   AX1=SR0;
			   SR=LSHIFT AR BY -1(LO);
			   AR=SR0 AND AY1;
               MR=AR * MY1(SS),AY0=AR;
			   AR=MR0+AY0,AY0=DM(I2,M0);
			   AR=AR+AY0,SR0=AX1;			   
			   SR=LSHIFT SR0 BY -4(LO);
			   AR=SR0 AND AF,DM(I2,M1)=AR;
			   DM(I3,M1)=AR;
			   CALL Random;  
			   AY0=H#1FFF;
			   AR=AR AND AY0;
			   DM(Gp)=AR;
               SR=LSHIFT AR BY 1(LO);
			   DM(Gp2)=SR0;
			   RTS; 
/************************************************************************
* Compute fixed code gain												*
* Solve EQ(X) = 4 X**2 + 2 b X + c										*
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters													*	
*		  I1   : gain excitation										*
*         I3   : gain excitation sign									* 
*         I2   : gain excitation position								*
*         AY1  : calculated gain 										*
* Return Values															*
*         MR0  : LSW of data											*
*         MR1  : MSW of data											*
* Altered Registers: SR0,AR,AX0,AX1,AY0,AY1,I2,I3,M0,M1					*		
* Computation Time : 18 cycles											*	
*************************************************************************/
gen_fixgain:   MR=0;
			   AY0=I1;
			   CNTR=L_SUBFR;
			   DO mac_exc_lp UNTIL CE;
			   AR=DM(I1,M1);
mac_exc_lp:    IF NOT MV MR=MR+AR*AR(SS);
               IF MV SAT MR;
  {------------inter_exc = b >> sh--------------}
               AX1=0;
			   CNTR=4;
			   DO bique_loop UNTIL CE;
               AX0=DM(I2,M1);
               AR=AX0+AY0,SR0=DM(I3,M1);
			   I1=AR;				  
			   AY1=DM(I1,M1);
			   AR=AX1+AY1;
			   NONE=PASS SR0;
			   IF EQ AR=AX1-AY1;
bique_loop:	   AX1=AR;
			   SR=ASHIFT AR BY -1(LO);
			   DM(inter_exc)=SR0;
    /*---------Compute k = cur_gainR x cur_gainR x L_SUBFR---------*/
			   AY0=DM(sh);
			   MX0=L_SUBFR;
			   MY0=DM(cur_gain);
			   AR=AY0+1,AY1=MR1;
			   DM(sh)=AR;
			   AR=AR+AY0,AY0=MR0;
			   AR=-AR;
			   MR=MX0 * MY0(SS),SE=AR;
			   SR=LSHIFT MR0 BY -6(LO);
			   SR=SR OR ASHIFT MR1 BY -6(HI);
			   MR=SR0*MY0(SS); 
			   SR=LSHIFT MR0 BY -1(LO);
			   SR=LSHIFT MR0 (LO),MX0=SR0;
			   SR=SR OR ASHIFT MR1 (HI); 
			   DIS AR_SAT;
			   AR=SR0-AY0,MX1=MR1;
			   ENA AR_SAT;
			   MR0=AR,AR=SR1-AY1+C-1;
			   MR1=AR;
			   IF NOT AV JUMP calc_noav0;
			   AR=PASS MR1;
			   AR=H#0000;
			   IF GE AR=AR-1;
			   MR0=AR;
    {----------Compute delta = b^2 - 4 c----------------}
calc_noav0:	   AR=DM(inter_exc);
			   MR=MR+AR*AR(SS);
    {----------inter_exc = b x 2^(-sh)------------------}
    {----------L_acc = delta x 2^(-2sh+1)---------------}
			   AR=PASS MR1;
			   IF GE RTS;
    {----------adaptive excitation = 0------------------}
			   I1=^excg;
//			   CNTR=L_SUBFR;
			   I2=DM(cur_exc);
			   CNTR=L_SUBFR;
			   DO double_exc UNTIL CE;
			   AR=DM(I1,M1);
double_exc:	   DM(I2,M1)=AR;
			   AY1=^excg;
			   ENA AR_SAT;
			   I3=^position;
			   AX1=DM(I3,M1);
			   AR=AX1+AY1,AX1=DM(I3,M1);
			   I2=AR;
			   AR=AX1+AY1,AX0=DM(I2,M1);
			   I2=AR;
			   AR=ABS AX0,AX1=DM(I2,M1);
			   AR=ABS AX1,AY0=AR;
			   AF=AR OR AY0,AX1=DM(I3,M1);
			   AR=AX1+AY1,AX1=DM(I3,M1);
			   I2=AR;
			   AR=AX1+AY1,AX0=DM(I2,M1);
			   I2=AR;
			   AR=ABS AX0,AX1=DM(I2,M1);
			   AR=ABS AX1,AX0=AR;
			   AF=AX0 OR AF;
			   AR=AR OR AF;
			   AF=AR AND H#4000;
			   AR=1;
			   IF NE AR=AR+1;
			   DM(sh)=AR;
			   AR=-AR;
//			   CNTR=4;
			   I3=^sign;
			   I2=^position;
			   AY1=^excg;
			   AF=PASS 0,SE=AR;
			   CNTR=4;
			   DO inter_exc_lp UNTIL CE;
			   AX1=DM(I2,M1);
			   AR=AX1+AY1;
			   I0=AR;
			   SR0=DM(I0,M0);
			   SR=ASHIFT SR0 (LO),AX1=DM(I3,M1);
			   AR=AF-SR0;
			   NONE=PASS AX1;
			   IF NE AR=SR0+AF;
inter_exc_lp:  AF=PASS AR;
			   MY0=K0;
			   SR0=DM(sh);
               DM(inter_exc)=AR;
			   SR=ASHIFT SR0 BY 1(LO);
			   AR=1-SR0;
			   AR=PASS 1,SE=AR;
			   MF=MX0 * MY0(SS);
			   MR=AR * MF(SS);
			   MR=MR+MX1*MY0(SS);
			   SR=LSHIFT MR0 (LO);
			   SR=SR OR ASHIFT MR1 (HI);
			   AR=PASS 0,MR0=SR0;
			   DM(Gp)=AR;
			   AR=PASS AF,MR1=SR1;
			   MR=MR+AR*AR(SS);
			   RTS;
/************************************************************************
* compute adaptive + gaussian exc -> cur_exc							*
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters													*	
*         I1   : gain excitation										*
*		  I2   : current excitation										*
* Return Values															*
* Altered Registers: SR0,AR,AX0,AX1,AY0,AY1,I2,I3,M0,M1					*	
* Computation Time : 18 cycles											*	
*************************************************************************/
gen_adapgain:  AF=PASS 0;
			   MY0=DM(Gp2);
//			   CNTR=L_SUBFR;
			   MX0=DM(I2,M0);
			   CNTR=L_SUBFR;
			   DO find_max UNTIL CE;
			   MR=MX0*MY0(RND),AY0=DM(I1,M1);
			   AR=MR1+AY0; 
			   AR=ABS AR,DM(I2,M1)=AR;
			   NONE=AR-AF;
			   IF GT AF=PASS AR;
find_max:      AR=PASS AF,MX0=DM(I2,M0);
        {------rescale cur_exc -> excs-----------}
			   NONE=PASS AR;
			   IF EQ JUMP comm_max;
			   SE=EXP AR (HI);
			   AX0=SE;
			   AR=AX0+3;
			   IF LE AR=PASS 0;
comm_max:	   DM(sh)=AR;
               AR=-AR;
			   SE=AR;
			   I1=^excs;
			   I2=DM(cur_exc);
//			   CNTR=L_SUBFR;
               MR0=DM(I2,M1);
			   CNTR=L_SUBFR;
			   DO shr_exc_lp UNTIL CE;
			   SR=ASHIFT MR0 (LO),MR0=DM(I2,M1);
shr_exc_lp:	   DM(I1,M1)=SR0; 
               RTS;
/************************************************************************
* Generate gaussian excitation											*
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters													*	
*         I1   : gain excitation										*
* Return Values															*
* Altered Registers: SR0,AR,AX0,AX1,AY0,AY1,I2,I3,M0,M1					*	
* Computation Time : 18 cycles											*	
*************************************************************************/
gen_guassgain: MR=0;	
			   CNTR=L_SUBFR;
			   DO mac_calc_exc UNTIL CE;
			   AX0=MR0;
			   AX1=MR1;
			   CALL Gauss;
			   MR0=AX0;
			   MR1=AX1;
               MR=MR+SR0*SR0(SS);
mac_calc_exc:  DM(I1,M1)=SR0;
			   DM(seed)=MX0;
	/***********************************************************
	*  Compute fact = alpha x cur_gain * sqrt(L_SUBFR / Eg)    *
	*    with Eg = SUM(i=0->39) excg[i]^2                      *    
	*    and alpha = 0.5                                       *
	*    alpha x sqrt(L_SUBFR)/2 = 1 + FRAC1                   *
	************************************************************/
			   SR=LSHIFT MR0 BY -1(LO);
			   SR=SR OR ASHIFT MR1 BY -1 (HI);
			   MR0=SR0;
			   MR1=SR1;
			   CALL Inv_sqrt;
         {-----cur_gain = cur_gainR << 3-------------} 
			   AX0=14;
			   MY0=FRAC1;
			   MX0=DM(cur_gain);
			   MR=MX0*MY0(RND),AY0=MX0;
			   AR=MR1+AY0,MX0=SR1;
		 {----<=> alpha x cur_gainR x 2^2 x sqrt(L_SUBFR)--}
			   SR=LSHIFT SR0 BY -1(LO);
			   AR=PASS 1,MY0=AR; 
			   MF=SR0 * MY0(SS);
			   MR=AR * MF(SS);
			   MR=MR+MX0*MY0(SS);
			   SE=EXP MR1 (HI);
			   SE=EXP MR0 (LO);
			   SR=NORM MR0 (LO),AY0=SE;
			   SR=SR OR NORM MR1 (HI);
			   AR=AX0+AY0,MY0=SR1;
			   SE=AR;
			   I1=^excg;
			   I2=^excg;
//			   CNTR=L_SUBFR;
			   MX0=DM(I1,M1);
			   CNTR=L_SUBFR;
			   DO shr_calc_exc UNTIL CE;
			   MR=MX0 * MY0(RND);
			   SR=ASHIFT MR1 (HI);
			   AR=SR0+H#8000;
			   AR=SR1+C,MX0=DM(I1,M1);
shr_calc_exc:  DM(I2,M1)=AR;
               RTS;
/************************************************************************
* Update cur_exc with ACELP excitation									*
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters													*	
*         I2   : gain excitation position								*
*         I3   : gain excitation sign									* 
*         AY1  : calculated gain 										*
* Return Values															*
* Altered Registers: SR0,AR,AX0,AX1,AY0,AY1,I2,I3,M0,M1					*	
* Computation Time : 18 cycles											*	
************************************************************************/
update_excit:  AY0=MR0;
			   AY1=MR1;
               CALL  Sqrt;
			   AX1=2;
               AY0=DM(sh);
		 	   AR=AY0-AX1;
               AY0=DM(inter_exc);
               AR=AX0-AY0,SE=AR;
			   AR=AX0+AY0,AX0=AR;
			   AR=-AR;
			   AR=ABS AR,AY0=AR;
			   AF=ABS AX0,AX1=AR;
			   AF=AX1-AF,AR=AX0;
			   IF LT AR=PASS AY0;
			   SR=ASHIFT AR (HI);
			   AR=SR0+H#8000;
			   AR=SR1+C;
			   AY0=G_MAX;
			   IF LT JUMP check_max2;
			   NONE=AR-AY0;
			   IF GT AR=PASS AY0;
			   JUMP check_comm;
check_max2:    NONE=AR+AY0;
               IF LT AR=-AY0;
    /*---------Update cur_exc with ACELP excitation----------*/
//check_comm:    CNTR=4;
check_comm:    AY1=AR;
			   AY0=DM(cur_exc);
               CNTR=4;
			   DO twin_loop UNTIL CE;
               AX0=DM(I2,M1);
			   AR=AX0+AY0;
			   I1=AR; 
			   AX0=DM(I1,M0);
			   AR=AX0+AY1,AX1=DM(I3,M1);
			   NONE=PASS AX1;
			   IF EQ AR=AX0-AY1;
twin_loop:	   DM(I1,M1)=AR;
			   RTS;
/***************************************************************/
.ENDMOD;

⌨️ 快捷键说明

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