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

📄 taming.dsp

📁 基于ADSP的G.729语音编解码程序
💻 DSP
字号:
/************************************************************************/
/* Taming functions.                                                    */ 
/* $$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*/
/* $$01/10/2001 checked taming module data variables and function       */
/************************************************************************/
.MODULE/SEG=App_PM        Taming;

#include       "ld8a.inc"
#include       "tab_ld8a.inc"

/************************************************************************/
/* $$01/10/2000 local static memory buffer used in module Taming        */
/* $$01/10/2000 static varaibles used in decoder frame speech process   */
/************************************************************************/
.VAR/DM/RAM/SEG=App_DMmem    exc_err_hi[4];
.VAR/DM/RAM/SEG=App_DMmem    exc_err_lo[4];

/*************************************************************************
* initialize excation errorance										     *
* $$01/10/2000 only used in encoder                                      *
* Calling Parameters	 											     *	
* Return Values															 *
* Altered Registers: I1,I2                                               *	
* Computation Time : 18 cycles											 *	
**************************************************************************/
.ENTRY         Init_exc_err;

Init_exc_err:  //CNTR=4;
			   I1=^exc_err_lo;  
			   I2=^exc_err_hi;  
			   CNTR=4;
			   DO Init_exc UNTIL CE;
			   DM(I1,M1)=0x4000;
Init_exc:	   DM(I2,M1)=0x0000;
			   RTS;
/*************************************************************************
* routine test_err - computes the accumulated potential error in the     *
* adaptive codebook contribution										 *
* $$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													 *	
*         MR1 : integer part of pitch delay                              *
*         MR0 : fractional part of pitch delay                           *
* Return Values															 *
*         AR :  flag set to 1 if taming is necessary                     *
* Altered Registers: MR,SR,SE,AR,AF,I1,I2,I5,AX0,AY0,MY0,M3,M5           *	
* Computation Time : 18 cycles											 *	
 *************************************************************************/
.ENTRY         test_err;

test_err:	   AF=PASS MR0,AR=MR1;
               IF GT AR=AR+1;  
			   AY0=L_SUBFR+L_INTER10;
			   AR=AR-AY0,AX0=AR;
			   IF LT  AR=PASS 0;
			   M5=AR;
			   I5=^tab_zone;
			   MODIFY(I5,M5);
			   AY0=L_INTER10 - 2;
               AR=AX0+AY0,SR0=PM(I5,M4);  
			   M5=AR;
			   I5=^tab_zone;
			   MODIFY(I5,M5);
			   AF=PASS SR0,SR1=PM(I5,M4);   
			   M3=SR1;
			   I1=^exc_err_hi;
			   I2=^exc_err_lo;
			   MODIFY(I1,M3);
			   MODIFY(I2,M3);
               AY0=H#FFFF;      
               AY1=H#FFFF;      
find_maxloc:   AX0=DM(I2,M2);
			   AX1=DM(I1,M2);
               DIS AR_SAT;
			   AR=AX0-AY0,MX0=AY0;
			   ENA AR_SAT;
			   AY0=AR,AR=AX1-AY1+C-1;
			   NONE=PASS AR;
			   IF LT JUMP find_con;
			   NONE=AR OR AY0;
			   IF EQ JUMP find_con;
			   MX0=AX0;
			   AY1=AX1;
find_con:	   AF=AF-1,AY0=MX0;
			   NONE=AF-SR1;
			   IF GE JUMP find_maxloc;
			   AX0=THRESH_ERRLO; 
			   AX1=THRESH_ERRHI;
			   DIS AR_SAT;
			   AR=AY0-AX0;
			   ENA AR_SAT;
			   AF=AY1-AX1+C-1,AX0=AR;
               AR=1; 
			   IF LT AR=PASS 0;
		       NONE=AX0 OR AF;
			   IF EQ AR=PASS 0;
			   RTS;
/************************************************************************
* routine update_exc_err - maintains the memory used to compute the     * 
* error function due to an adaptive codebook mismatch between encoder   *
* and decoder                                                           *
* $$01/10/2000 only used in encoder                                     *
* Calling Parameters			 								        *	
*         MY0     :  pitch gain                                         *
*         AY0     :  integer part of pitch delay                        *
* Return Values															*
* Altered Registers: MR,MF,SR,AR,AF,AX0,AY0,AY1,MX0,MX1,MY0,I1,I2       *	
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         update_exc_err;

update_exc_err:
			   AX0=L_SUBFR;
               AR=AY0-AX0;
			   IF GE JUMP update_exc_2;
update_exc_1:  I1=^exc_err_hi;
			   I2=^exc_err_lo;
			   AY1=H#FFFF;    
			   AR=PASS 1,MR0=DM(I2,M1);
			   SR=ASHIFT MR0 BY -1(LO);
			   MF=SR0 * MY0(SS),SR0=DM(I1,M1);
			   MR=AR * MF(SS),AY0=AY1;
			   MR=MR+SR0*MY0(SS);
			   SR=LSHIFT MR0 BY 1(LO);
			   SR=SR OR ASHIFT MR1 BY 1(HI);
			   DIS AR_SAT;
			   AR=SR0+H#4000;
			   ENA AR_SAT;
			   SR0=AR,AR=SR1+C;
			   SR1=AR;
			   IF NOT AV JUMP longadd_0;
			   AR=H#0000;
			   AR=PASS SR1;
			   IF GE AR=AR-1;
			   SR0=AR;
longadd_0:	   AF=SR0-AY0;
			   AF=SR1-AY1+C-1;
			   NONE=PASS AF;
			   IF LT JUMP update_con1;
			   AY0=SR0;
			   AY1=SR1;
update_con1:   AR=PASS 1,MR0=AY0;
               SR=ASHIFT MR0 BY -1(LO);
			   MF=SR0 * MY0(SS),SR0=AY1;
			   MR=AR * MF(SS);
			   MR=MR+SR0*MY0(SS);
               SR=LSHIFT MR0 BY 1(LO);
			   SR=SR OR ASHIFT MR1 BY 1(HI);
			   DIS AR_SAT;
			   AR=SR0+H#4000;
			   ENA AR_SAT;
			   SR0=AR,AR=SR1+C;
			   SR1=AR;
			   IF NOT AV JUMP longadd_1;
			   AR=H#0000;
			   AR=PASS SR1;
			   IF GE AR=AR-1;
			   SR0=AR;
longadd_1:	   AF=SR0-AY0;
			   AF=SR1-AY1+C-1;
			   NONE=PASS AF;
			   IF LT JUMP update_exc_3;
			   MX1=SR0;
			   AY1=SR1;
			   JUMP update_exc_3;
update_exc_2:  AY1=^tab_zone;
			   AR=AR+AY1;
			   I5=AR;
			   AR=AY0-1,SR0=PM(I5,M5);
			   MX1=H#FFFF;    
			   AR=AR+AY1,AY1=MX1;
			   I5=AR;
			   AF=PASS SR0,AX1=PM(I5,M5);
			   M3=SR0;
			   I1=^exc_err_hi;
			   I2=^exc_err_lo;
			   MODIFY(I1,M3);
			   MODIFY(I2,M3);
update_loop:   AF=AF+1,AR=DM(I2,M1);
               SR=LSHIFT AR BY -1(LO);
			   AR=PASS 1,MX0=DM(I1,M1);
			   MF=SR0 * MY0(SS),AY0=MX1;
			   MR=AR *  MF(SS);
			   MR=MR+MX0*MY0(SS);	
			   SR=LSHIFT MR0 BY 1(LO);
			   SR=SR OR ASHIFT MR1 BY 1(HI);
			   DIS AR_SAT;
			   AR=SR0+H#4000;
			   ENA AR_SAT;
			   SR0=AR,AR=SR1+C;
			   IF NOT AV JUMP longadd_2;
			   NONE=PASS AR;
			   AR=H#0000;
			   IF GE AR=AR-1;
			   AR=PASS AF,SR0=AR;
longadd_2:	   DIS AR_SAT;
			   AR=SR0-AY0,AX0=AR;
			   ENA AR_SAT;
			   AY0=AR,AR=AX0-AY1+C-1;
			   NONE=PASS AR;
			   IF LT JUMP update_con2;
			   NONE=AR OR AY0;
			   IF EQ JUMP update_con2;
			   MX1=SR0;
			   AY1=AX0;
update_con2:   NONE=AX1-AF;
			   IF GE JUMP update_loop;
update_exc_3:  M3=-2;
//			   CNTR=3;
               I1=^exc_err_hi+2;
			   I2=^exc_err_lo+2;
			   CNTR=3;
			   DO copy_exc UNTIL CE;
			   AR=DM(I1,M1);
			   DM(I1,M3)=AR;
			   AR=DM(I2,M1);
copy_exc:	   DM(I2,M3)=AR;
			   DM(exc_err_lo)=MX1;
			   DM(exc_err_hi)=AY1;
			   RTS;
/************************************************************/
.ENDMOD;

⌨️ 快捷键说明

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