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

📄 qsidgain.dsp

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

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

/************************************************************************/
.EXTERNAL      Log2;

/************************************************************************
* Function  Qua_Sidgain													*
* $$01/10/2000 used only in encoder and decoder							*
* Calling Parameters  	  												*	
*         I1  : array of energies										*
*         I2  : corresponding scaling factors							*
*         AY0 : number of energies or									*
* Return Values															*
*         AR  : decoded energies in dB									*
*         AX0 : SID gain quantization index								*
* Altered Registers: MR,MF,SR,SE,AR,AF,AX0,AY0,AY1,MX0,MY0,MX1,MY1		*	
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Qua_Sidgain;

Qua_Sidgain:   M5=AY0;
			   AR=PASS AY0;
			   IF NE JUMP Sidgain_con;
			   I5=^fact;
			   AR=DM(I1,M1);
			   SR=ASHIFT AR BY 0(LO);
			   AR=PASS SR1,SE=DM(I2,M1);
			   SR=LSHIFT SR0 (LO),MY0=PM(I5,M5);			 	 
			   SR=SR OR ASHIFT AR (HI);
			   AR=PASS 1,MX0=SR1;
			   SR=LSHIFT SR0 BY -1(LO);
			   MF=SR0 * MY0(SS);
			   MR=AR * MF(SS);
			   MR=MR+MX0*MY0(SS);
			   AY1=0;
			   JUMP Sidgain_com;
Sidgain_con:   I0=I2;
			   AR=AY0-1,AX1=DM(I0,M1);
               IF EQ JUMP find_ener+1;
			   CNTR=AR;
			   DO find_ener UNTIL CE;
			   AR=PASS AX1,AY0=DM(I0,M1);
			   NONE=AY0-AR;
			   IF LT AR=PASS AY0;
find_ener:	   AX1=AR;
			   I5=^marg;
			   MODIFY(I5,M5);
			   AR=AX1+16;
			   AY0=PM(I5,M5);
			   AF=AR-AY0;
//			   CNTR=M5;
			   AY0=H#0000;
			   AY1=H#0000;
			   CNTR=M5;
			   DO sum_ener UNTIL CE;
			   AX0=DM(I2,M1);
			   AR=AF-AX0,SR0=DM(I1,M1);
			   SE=AR;			   
			   SR=ASHIFT SR0(LO);
			   DIS AR_SAT;
			   AR=SR0+AY0;
			   ENA AR_SAT;
			   AY0=AR,AR=SR1+AY1+C;
			   AY1=AR;			   
			   IF NOT AV JUMP sum_ener;
			   AR=PASS AY1;
			   AR=H#0000;
			   IF GE AR=AR-1;
			   AY0=AR;
sum_ener:      AR=PASS AY0;
			   I5=^fact;
			   MODIFY(I5,M5);
               SR=LSHIFT AR BY -1(LO);
			   AR=PASS 1,MY0=PM(I5,M5);
			   MF=SR0 * MY0(SS);		  
			   MR=AR  * MF(SS);
			   AR=PASS AF,MX0=AY1;
			   MR=MR+MX0*MY0(SS),AY1=AR;
Sidgain_com:   CALL Quant_Energy;
			   RTS;
/************************************************************************
* $$01/10/2000 used only in encoder and decoder							*
* Calling Parameters  	  												*	
*         MR0 : LSW of L_x Q0	Energy									* 
*         MR1 : MSW of L_x Q0   Energy      							*		
*         AY1 : Exponent of the energy									*
* Return Values															*
*         AR  : quantized energy in dB									*
* Altered Registers: MR,SR,SE,AR,AF,AX0,AY0,AY1,MY0,I0,M0,M1			*	
* Computation Time : 18 cycles											*	
*************************************************************************/
Quant_Energy:  CALL Log2;
			   MY0=1024;
			   I4=^Gain_thresh;
			   MR=SR0 * MY0(RND);
			   AR=SR1-AY1,AY0=MR1;
			   SR=LSHIFT AR BY 10(LO);
			   AR=SR0+AY0,AY1=PM(I4,M4);
			   AF=AR-AY1,AY0=PM(I4,M4);
			   IF GT JUMP great_65db;
			   AX0=0;
			   AR=-12;
			   RTS;
great_65db:	   AF=AR-AY0,AY1=PM(I4,M4);
			   IF LE JUMP less_14db;
			   AX0=31;
			   AR=66;
			   RTS;
less_14db:	   AF=AR-AY1,AY0=PM(I4,M4);
			   IF GT JUMP little_db;	
			   MY0=24;
			   AY0=3401;
			   AR=AR+AY0;
			   MR=AR * MY0(SS);
			   AR=MR1;
			   AF=MR1-1;
			   IF LT AR=PASS 1;
			   AX0=AR;
			   SR=LSHIFT AR BY 2(LO);
			   AR=SR0-8;
			   RTS;
little_db:     MY0=193;
			   AR=AR-AY0;
			   MR=AR * MY0(SS);
			   SR=LSHIFT MR0 BY -2(LO);
			   SR=SR OR ASHIFT MR1 BY -2(HI);
			   AY0=6;
			   AR=SR1-1;
			   NONE=AR-AY0;
			   IF LT AR=PASS AY0;
			   AX0=AR;
			   SR=LSHIFT AR BY 1(LO);
			   AR=SR0+4;
			   RTS;
/************************************************************************/
.ENDMOD;

⌨️ 快捷键说明

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