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

📄 dtxcng.dsp

📁 基于ADSP的G.729语音编解码程序
💻 DSP
📖 第 1 页 / 共 2 页
字号:
			   CNTR=SIZ_ACF-MP1;
			   DO shift_cng UNTIL CE;
               AR=DM(I3,M2);
shift_cng:	   DM(I1,M2)=AR;
			   AR=DM(sh_Acf);
			   DM(sh_Acf+1)=AR;
			   I3=^Acf;
//			   CNTR=MP1;
               AR=AX0+16;
			   AR=-AR;
			   DM(sh_Acf)=AR;
			   CNTR=MP1;
			   DO save_Acf UNTIL CE;
               AX0=DM(I2,M1);
save_Acf:      DM(I3,M1)=AX0;
			   AY1=DM(fr_cur);
               AR=AY1+1;
			   DM(fr_cur)=AR;
			   AY1=NB_CURACF;               
			   AR=AR-AY1;			   
			   IF NE RTS;
			   DM(fr_cur)=AR;
			   AR=PASS AY0;
			   IF NE CALL Update_sumAcf;
			   RTS;
/***************************************************************************
* Compute scaled autocorr of LPC coefficients used for Itakura distance    * 
* $$01/10/2000 checked Dtxmod module data variables and function           *
* Calling Parameters: none												   *	
*			     I0 : RCoeff data array pointer                            *
*			     AX0: Coeff data array pointer                             *
* Return Values     : none												   *
*                AR : sh_RCoeff value                                      *
* Altered Registers: MR,SR,SE,AR,AF,MX0,MY0,I0,I1                          *	
* Computation Time : 18 cycles											   *	
****************************************************************************/
.VAR/DM/RAM/SEG=App_DMtmp    Coeff;

Calc_RCoeff:   MR=0;
			   I2=AX0;
     /*--------RCoeff[0] = SUM(j=0->M) Coeff[j]^2-----*/
               CNTR=M+1;
			   DO mac_rcoeff UNTIL CE;
			   MX0=DM(I2,M1);
mac_rcoeff:    IF NOT MV MR=MR+MX0*MX0(SS);
               IF MV SAT MR;
    /*---------Compute exponent RCoeff---------------*/
			   SE=EXP MR1 (HI),AY0=MR0;
               SE=EXP MR0 (LO);			   
			   AR=MR1 OR AY0;
			   IF NE JUMP calc_zero;
			   SE=AR;
calc_zero:	   SR=NORM MR0 (LO),AY0=SE;
			   SR=SR OR NORM MR1 (HI);
			   AR=SR0+H#8000;
			   AR=SR1+C;
			   DM(I0,M1)=AR;
    /*---------RCoeff[i] = SUM(j=0->M-i) Coeff[j] * Coeff[j+i]-----*/
			   AR=M;
			   I1=AX0;
//			   CNTR=M;
			   MODIFY(I1,M1);
			   CNTR=M;
			   DO round_coeff UNTIL CE;
               MR=0;
			   I2=AX0;
			   I3=I1;
			   CNTR=AR;
			   DO round_in UNTIL CE;
               AF=PASS AR,MX0=DM(I2,M1);
			   MY0=DM(I3,M1);
round_in:	   IF NOT MV MR=MR+MX0*MY0(SS);
               IF MV SAT MR;
			   SR=NORM MR0 (LO);
			   SR=SR OR NORM MR1 (HI);
			   AR=SR0+H#8000;
			   AR=SR1+C,SR0=DM(I1,M1);
round_coeff:   AR=AF-1,DM(I0,M1)=AR;
               AR=-AY0;
			   RTS;
/****************************************************************************
* Compute Itakura distance and compare to threshold                         * 
* $$01/10/2000 checked Dtxmod module data variables and function            *
* Calling Parameters: none												    *	
*			    MX1 : alpha of fraction                                     *	
*			    MY1 : Fraction of Threshold                                 *
* Return Values															    *
*               AF : return value                                  		    *
* Altered Registers: SR,SE,AR,AF,MY0,AX0,AY0,AY1,I1,I2,I3,M3                *	
* Computation Time : 18 cycles												*	
*****************************************************************************/
.VAR/DM/RAm/SEG=App_DMtmp    sh[2];

Cmp_filt:      M3=1;
               AR=PASS 0;
			   DM(sh)=AR;
			   DM(sh+1)=AR;
			   AX0=1;
cmp_loop: 	   I1=^curAcf;
			   I2=^RCoeff;
			   SE=DM(sh);
			   AF=PASS 0,AR=DM(I2,M1);
               SR=LSHIFT AR (LO),AR=DM(I1,M1);
			   SE=DM(sh+1);
			   SR=LSHIFT AR (LO),MY0=SR0; 
			   MR=SR0 * MY0(SS);
			   SR=LSHIFT MR0 BY -1(LO);
			   SR=SR OR ASHIFT MR1 BY -1(HI); 
//			   CNTR=M;
			   MR1=SR1;
			   MR0=SR0;
			   CNTR=M;
			   DO cmp_loop1 UNTIL CE;
			   SE=DM(sh);
			   AR=DM(I2,M1);
			   SR=LSHIFT AR (LO),AR=DM(I1,M1); 
			   SE=DM(sh+1);
			   SR=LSHIFT AR (HI),MY0=SR0;
			   MR=MR+AR*MY0(SS);
			   IF MV AF=AF+1;
cmp_loop1:     IF MV SAT MR;
               AF=PASS AF,SR0=MX1;
			   IF EQ JUMP exit_cmp; 
			   I3=^sh;
			   MODIFY(I3,M3);
			   AY0=DM(I3,M0);
			   AR=AX0+AY0;
			   AY0=M3;
			   AR=AX0-AY0,DM(I3,M0)=AR;
			   M3=AR;
			   JUMP cmp_loop;
exit_cmp:	   AX0=DM(sh_RCoeff);
			   AY0=DM(sh);
			   AR=AX0-AY0,AY1=MX1;			  
			   AY0=DM(sh+1);
			   AR=AR-AY0,AX1=MR1;
			   AR=AR+9;
			   AF=PASS 0,SE=AR;
			   MR=MX1 * MY1(RND),AY0=MR0;
			   SR=ASHIFT SR0 BY 0(LO);
			   DIS AR_SAT;
			   AR=MR1+AY1,AY1=SR1;
			   ENA AR_SAT;
			   SR0=AR,AR=MR2+AY1+C;
			   SR=LSHIFT SR0 (LO);
			   SR=SR OR ASHIFT AR(HI);
			   DIS AR_SAT;
			   AR=AY0-SR0,AY1=AX1;
			   ENA AR_SAT;
			   AY0=AR,AR=AY1-SR1+C-1;
               AR=PASS AR;
			   IF LT RTS;
			   AR=AR OR AY0;
			   IF EQ RTS;
			   AF=AF+1;
			   RTS;
/****************************************************************************
* Compute past average filter                                               *
* $$01/10/2000 checked Dtxmod module data variables and function            *
* Calling Parameters: none												    *	
* Return Values	    : none													*
* Altered Registers: MR,MF,SR,SE,AR,AF,MX0,MY0,AX0,AX1,AY0,AY1              *
*                    I0,I1,I2,I3,I4,I5                                      *	
* Computation Time : 18 cycles												*	
*****************************************************************************/
.VAR/DM/RAM/SEG=App_DMbuf    s_sumAcf[MP1];
.VAR/DM/RAM/SEG=App_DMbuf    bid[M], zero[MP1];

Calc_pastfilt: I2=^sumAcf;
			   I3=^s_sumAcf;
			   I1=^sh_sumAcf;
			   AY0=NB_SUMACF;
			   CALL Calc_sum_acf; 
			   I0=^pastCoeff;
			   AX0=DM(s_sumAcf);
			   AF=PASS AX0;
			   IF NE JUMP calc_next;
//			   CNTR=M;
			   DM(I0,M1)=4096;
			   CNTR=M;
			   DO zero_coeff UNTIL CE;
zero_coeff:    DM(I0,M1)=0;
               RTS;
calc_next:     CNTR=MP1;
               I0=^zero;
			   DO zero_one UNTIL CE;
zero_one:      DM(I1,M1)=0;  
		       I3=^s_sumAcf;
			   I2=^zero;
			   I0=^pastCoeff;
			   I1=^bid;
			   CALL Levinson; 
               RTS;
/****************************************************************************
* Update sumAcf array value                                                 *
* $$01/10/2000 checked Dtxmod module data variables and function            *
* Calling Parameters: none												    *	
* Return Values	    : none													*
* Altered Registers: SR,SE,AR,AF,MX0,AX0,AY0,I0,I1,I2,I3,I4                 *	
* Computation Time : 18 cycles												*	
*****************************************************************************/
Update_sumAcf: //CNTR=SIZ_SUMACF-MP1;
               I1=^sumAcf+SIZ_SUMACF-1;
			   I2=^sumAcf+SIZ_SUMACF-MP1-1;
			   CNTR=SIZ_SUMACF-MP1;
			   DO shift_sumAcf UNTIL CE;
			   AR=DM(I2,M2);
shift_sumAcf:  DM(I1,M2)=AR;
			   AR=DM(sh_sumAcf+1);
			   DM(sh_sumAcf+2)=AR;
			   AR=DM(sh_sumAcf);
			   DM(sh_sumAcf+1)=AR;
			   I2=^Acf;
			   I1=^sh_Acf;
			   I3=^sumAcf;
			   AY0=NB_CURACF;
			   CALL Calc_sum_acf; 
			   DM(sh_sumAcf)=AR;
               RTS;
/****************************************************************************
* Compute sum of acfs (curAcf, sumAcf or s_sumAcf)                          *
* $$01/10/2000 checked Dtxmod module data variables and function            *
* Calling Parameters													    *	
*          I1  : sh_acf data array pointer                                  *
*          I2  : Acf data array pointer                                     *
*          I5  : sum of Acf data array pointer                              *
*          AY0 : number of bits to loop count                               *
* Return Values																*
*          AR  : sh_sum return sum of sh_Acf energy array                   *
* Altered Registers: SR,SE,AR,AF,MX0,AX0,AY0,I0,I1,I2,I3,I4                 *	
* Computation Time : 18 cycles												*	
*****************************************************************************/
.VAR/DM/RAM/SEG=App_DMbuf    L_tab[2*MP1];

Calc_sum_acf:  //CNTR=2*MP1;
			   I4=^L_tab;
               CNTR=2*MP1;
			   DO zero_tab UNTIL CE;
zero_tab:	   DM(I4,M4)=0;
  			   I0=I1;
			   AX0=DM(I0,M1);
			   AR=AY0-1,MX0=AY0;
			   CNTR=AR;
			   DO change_sh0 UNTIL CE;
			   AY0=DM(I0,M1);
			   AF=AY0-AX0,AR=AX0;
			   IF LT AR=PASS AY0;
change_sh0:	   AX0=AR;
               AY0=14;
//			   CNTR=MX0;
			   AR=AX0+AY0; 
			   CNTR=MX0;
			   DO calc_sum_lp UNTIL CE;
               AY0=DM(I1,M1);
			   AR=AR-AY0,AX0=AR;
			   SE=AR;
//			   CNTR=MP1;
			   I0=^L_tab;	
			   CNTR=MP1;
			   DO calc_sum_in UNTIL CE;
			   AR=DM(I2,M1);
			   SR=ASHIFT AR (LO),AY0=DM(I0,M1);			   
			   DIS AR_SAT;
			   AR=SR0+AY0,AY0=DM(I0,M2);
			   ENA AR_SAT;
			   AF=SR1+AY0+C;
			   IF NOT AV JUMP calc_sum_in-1;
			   AR=PASS H#0000;
			   AF=PASS AF;
			   IF NEG AR=AR-1;
		       AR=PASS AF,DM(I0,M1)=AR;
calc_sum_in:   DM(I0,M1)=AR;
calc_sum_lp:   AR=PASS AX0;
//			   CNTR=M+1;
               I1=^L_tab;
			   AR=DM(I1,M1);
			   AF=PASS AR,SR0=DM(I1,M2);
			   AF=SR0 OR AF,SE=SR0;
			   CNTR=M+1;
			   IF EQ JUMP zero_exp;
			   SE=EXP SR0 (HI);
			   SE=EXP AR (LO);
zero_exp:	   DO sum_loop UNTIL CE;	
			   AR=DM(I1,M1);
			   SR=NORM AR (LO),AR=DM(I1,M1);
			   SR=SR OR NORM AR (HI),AY0=SE;
sum_loop:	   AR=AX0-AY0,DM(I3,M1)=SR1;
			   AR=AR-16;
 			   RTS;
/*****************************************************************************/
.ENDMOD;

⌨️ 快捷键说明

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