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

📄 vadcheck.dsp

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

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

/************************************************************************/
/* $$01/10/2000 static varaibles used in decoder frame speech process   */
/************************************************************************/
.VAR/DM/RAM/SEG=App_DMmem    MeanLSF[M],Min_buffer[16];
.VAR/DM/RAM/SEG=App_DMmem    Prev_Min,Next_Min,Min;
.VAR/DM/RAM/SEG=App_DMmem    MeanE,MeanSE,MeanSLE,MeanSZC;
.VAR/DM/RAM/SEG=App_DMmem    count_sil,count_update,count_ext;
.VAR/DM/RAM/SEG=App_DMmem    ad_flag,v_flag,less_count,prev_energy;

/************************************************************************/
.EXTERNAL      Enc_Frame,Enc_pastVad;
.EXTERNAL      Enc_lsfnew,Enc_ppastVad;
.EXTERNAL      VadEncode,Enc_expR0,Enc_pwindow;
.EXTERNAL      Log2;

/************************************************************************
* Function  vad_init ( )                                                *
* -> Initialization of variables for voice activity detection           *
* $$01/10/2000 used only in encoder                                     *
* Calling Parameters												    *
* Return Values														    *
* Altered Registers: AR,I1,M1                                           *
* Computation Time : 18 cycles										    *
*************************************************************************/
.ENTRY         vad_init;

vad_init:      AY0=0;
 			   I1=^MeanLSF;
        /*-----Static vectors to zero--------------*/
	           CNTR=%MeanLSF;
			   DO zero_mean UNTIL CE;
zero_mean:     AR=AY0+1,DM(I1,M1)=AY0;   
			   I1=^Min_buffer;
			   CNTR=%Min_buffer;
			   DO zero_minbuf UNTIL CE;
zero_minbuf:   DM(I1,M1)=0;
       /*------Initialize VAD parameters-----------*/
			   DM(MeanSE)=AY0;
               DM(MeanSLE)=AY0;
               DM(MeanE)=AY0;
               DM(MeanSZC)=AY0;
               DM(count_sil)=AY0;
               DM(count_update)=AY0;
               DM(count_ext)=AY0;
               DM(less_count)=AY0;
               DM(ad_flag)=AR;
			   AR=H#7FFF;
			   DM(Min)=AR;
               RTS;
/************************************************************************
* Functions vad to detect voice activity                                *
* $$01/10/2000 used only in encoder                                     *
* $$01/11/2000  move dm table to pm table area                          *
* $$01/11/2000 modify pointer and varaibles to adapt table change       *
* Calling Parameters												    *	
*           SI         : reflection coefficient							*
*           Enc_lsfnew : unquantized lsf vector							*
*           I0         : upper 16-bits of the autocorrelation vector	*
*           I1         : lower 16-bits of the autocorrelation vector	*
*           Enc_expR0  : exponent of the autocorrelation vector			*
*           Enc_pwindow: preprocessed input signal						*
*           Enc_Frame  : frame counter									*
*           Enc_pastVad: VAD decision of the last frame					*
*           Enc_ppastVad: VAD decision of the frame before last frame	*
* Return Values															*
*           VadEncode: VAD decision of the current frame		    	*	 
* Altered Registers: MR,SR,AR,I0,I1,I2,I3,AX0,MY0						*	
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Vadcheck;

Vadcheck:      CALL calc_parm;
               CALL update_mins;
			   CALL calc_mean;
               AR=DM(ENERGY);
			   DM(prev_energy)=AR;
			   RTS;
/************************************************************************
* calculte basic voice active detect guidlines                          *
* $$01/10/2000 used only in encoder                                     *
* $$01/11/2000  move dm table to pm table area                          *
* Calling Parameters													*	
*           Enc_lsfnew : unquantized lsf vector							*
*           I0         : upper 16-bits of the autocorrelation vector	*
*           I1         : lower 16-bits of the autocorrelation vector	*
*           Enc_expR0  : exponent of the autocorrelation vector			*
*           Enc_pwindow: preprocessed input signal						*
* Return Values															*
* Altered Registers: MR,SR,AR,AF,AX0,AX1,AY0,AY1,MX0,MX1,MY0,MY1        *	
* Computation Time : 18 cycles										    *	
*************************************************************************/
.VAR/DM/RAM/SEG=App_DMtmp    ENERGY,ENERGY_low,SD,ZC;

calc_parm:	   
  /*-----------compute the frame energy-----------------*/
			   SR0=DM(I1,M1);
			   MR1=DM(I0,M0);
               SR=LSHIFT SR0 BY 1(LO);
               MR0=SR0;
			   CALL Log2;
			   MY0=9864;
			   I4=^lbf_corr;
			   AR=PASS 1,MX1=DM(I0,M1);
			   MF=SR0 * MY0(SS),MY1=PM(I4,M4);
			   MR=AR * MF(SS),AX0=MY0;
			   MR=MR+SR1*MY0(SS);
			   AR=DM(Enc_expR0);
			   AR=AR-2;
			   MR=MR+AR*MY0(SS),AX1=AR;
			   SR=LSHIFT MR0 BY 11(LO);
			   SR=SR OR ASHIFT MR1 BY 11(HI);
			   AY1=4875;
			   AR=SR1-AY1;
			   DM(ENERGY)=AR;
  /*-----------compute the low band energy----------*/
			   MR=0;
			   CNTR=NP;
			   DO mac_lbf UNTIL CE;
			   MX0=DM(I0,M1),MY0=PM(I4,M4);
mac_lbf:	   IF NOT MV MR=MR+MX0*MY0(SS);
               IF MV SAT MR;
			   SR=LSHIFT MR0 BY 1(LO);
			   SR=SR OR ASHIFT MR1 BY 1(HI);
			   MR0=SR0;
			   MR1=SR1;
			   MR=MR+MX1*MY1(SS),MY1=AX0;
			   CALL Log2;
			   AR=PASS 1;
			   MF=SR0 * MY1(SS);
			   MR=AR * MF(SS);
			   MR=MR+SR1*MY1(SS),MX0=AX1;
			   MR=MR+MX0*MY1(SS);
			   SR=LSHIFT MR0 BY 11(LO);
			   SR=SR OR ASHIFT MR1 BY 11(HI);
			   AR=SR1-AY1;
			   DM(ENERGY_low)=AR;
     /*--------compute SD-------------*/
//			   CNTR=M;
			   I3=^MeanLSF;
			   I2=^Enc_lsfnew;
			   MR=0,AX0=DM(I2,M1);
			   CNTR=M;
			   DO mac_meanlsf UNTIL CE;
			   AY0=DM(I3,M1);
			   AR=AX0-AY0,AX0=DM(I2,M1);
mac_meanlsf:   IF NOT MV MR=MR+AR*AR(SS);
               IF MV SAT MR;
			   DM(SD)=MR1;     /* Q15 */
  /*-----------compute # zero crossing------------*/
			   AY0=410;
			   M3=ZC_START;
			   I3=DM(Enc_pwindow); 
			   MODIFY(I3,M3);
			   MX0=DM(I3,M1);
			   AR=PASS 0,MY0=DM(I3,M0);
			   CNTR=ZC_END-ZC_START;
			   DO cal_zerocross UNTIL CE;
			   MR=MX0 * MY0(SS),MX0=DM(I3,M1);
			   AF=PASS MR1,MY0=DM(I3,M0);
			   IF LT AR=AR+AY0;
cal_zerocross: DM(ZC)=AR;     /* Q15 */
		       RTS;
/************************************************************************
* initialize and update the mins and prevmins                           *
* $$01/10/2000 used only in encoder                                     *
* $$01/11/2000  move dm table to pm table area                          *
* Calling Parameters													*	
* Return Values															*
* Altered Registers: MR,SR,AR,AF,AX0,AX1,AY0,AY1,MX0,MX1,MY0,MY1        *	
* Computation Time : 18 cycles										    *	
*************************************************************************/
update_mins:
  /*-----------Initialize and update Mins-------------*/
			   AY1=129;
			   AY0=H#0007;
			   AX0=DM(Enc_Frame);
			   AR=AX0-AY1;
			   IF GE JUMP find_prevmin;
			   AX1=DM(ENERGY);
			   AY1=DM(Min);
			   AR=AX1-AY1;
			   NONE=PASS AR;
			   IF GE JUMP Prevno_update;
			   DM(Min)=AX1;
			   DM(Prev_Min)=AX1;
Prevno_update: AR=AX0 AND AY0,SR0=AX0;
			   IF NE JUMP find_prevmin;
			   I3=^Min_buffer;
			   SR=ASHIFT SR0 BY -3(LO);
			   AR=SR0-1;
			   M3=AR;
			   MODIFY(I3,M3);
			   AX1=DM(Min);
			   DM(I3,M1)=AX1;
			   AX1=H#7FFF;
			   DM(Min)=AX1;
find_prevmin:  AR=AX0 AND AY0;
			   IF NE JUMP find_nextmin;
			   I3=^Min_buffer;
//			   CNTR=15;
			   AR=DM(I3,M1);
			   CNTR=15;
			   DO comp_prevmin UNTIL CE;
			   AY1=DM(I3,M1);
			   AF=AY1-AR;
			   AF=PASS AF;
			   IF LT AR=PASS AY1;
comp_prevmin:  DM(Prev_Min)=AR;
find_nextmin:  AY1=129;
			   AR=AX0-AY1;
			   IF LT RTS;
			   AR=AX0 AND AY0;
			   AR=AR XOR H#0001;
			   AR=DM(Min);
			   AX1=DM(Next_Min);
			   IF NE JUMP comp_energy;
               AR=DM(Prev_Min);
			   AX1=H#7FFF;
comp_energy:   AY1=DM(ENERGY);
			   AF=AY1-AR;
			   AF=PASS AF;
               IF LT AR=PASS AY1;
			   DM(Min)=AR;
			   AF=AY1-AX1,AR=AX1;
			   AF=PASS AF;
			   IF LT AR=PASS AY1;
			   DM(Next_Min)=AR;
			   NONE=AX0 AND AY0;
			   IF NE RTS;
//			   CNTR=15;
			   I2=^Min_buffer;
			   I3=^Min_buffer+1;
			   CNTR=15;
			   DO shift_minbuff UNTIL CE;
			   SR0=DM(I3,M1);
shift_minbuff: DM(I2,M1)=SR0;
				nop;
			   AR=DM(Next_Min);
//			   CNTR=15;
			   DM(I2,M1)=AR;
			   I2=^Min_buffer;
			   AR=DM(I2,M1);
			   CNTR=15;
			   DO iteriate_min UNTIL CE;
			   AY1=DM(I2,M1);
			   AF=AY1-AR;
			   AF=PASS AF;
			   IF LT AR=PASS AY1;
iteriate_min:  DM(Prev_Min)=AR;	    
			   RTS;           
/************************************************************************
* initialize and update the mins and prevmins                           *
* $$01/10/2000 used only in encoder                                     *
* $$01/11/2000  move dm table to pm table area                          *
* Calling Parameters													*	
*           Enc_lsfnew : unquantized lsf vector							*
* Return Values															*
* Altered Registers: MR,SR,AR,AF,AX0,AX1,AY0,AY1,MX0,MX1,MY0,MY1        *	
* Computation Time : 18 cycles										    *	
*************************************************************************/
.VAR/DM/RAM/SEG=App_DMtmp    coeffbuf[6];

start_calmean: I4=^coeffbuf;
			   AR=DM(count_update);
			   AR=AR+1;
			   DM(count_update)=AR;
			   AY0=INIT_COUNT;
			   AF=AR-AY0,AX0=AR;
			   IF GE JUMP adjust_6;
			   DM(I4,M4)=24576;
			   DM(I4,M4)=8192;
			   DM(I4,M4)=26214;
			   DM(I4,M4)=6554;
			   DM(I4,M4)=19661;
			   DM(I4,M4)=13017;
			   JUMP comp_meanse;
adjust_6:      AY0=INIT_COUNT+10;
			   AR=AX0-AY0;
			   IF GE JUMP adjust_7;
			   DM(I4,M4)=31130;
			   DM(I4,M4)=1638;
			   DM(I4,M4)=30147;
			   DM(I4,M4)=2621;
			   DM(I4,M4)=21299;
			   DM(I4,M4)=11469;
			   JUMP comp_meanse;
adjust_7:      AY0=INIT_COUNT+20;
			   AR=AX0-AY0;
			   IF GE JUMP adjust_8;
			   DM(I4,M4)=31785;
			   DM(I4,M4)=983;
			   DM(I4,M4)=30802;
			   DM(I4,M4)=1966;
			   DM(I4,M4)=22938;
			   DM(I4,M4)=9830;
			   JUMP comp_meanse;
adjust_8:      AY0=INIT_COUNT+30;
			   AR=AX0-AY0;
			   IF GE JUMP adjust_9;
			   DM(I4,M4)=32440;
			   DM(I4,M4)=328;
			   DM(I4,M4)=31457;
			   DM(I4,M4)=1311;
			   JUMP adjust_11;
adjust_9:	   DM(I4,M4)=32604;
			   DM(I4,M4)=164;
               AY0=INIT_COUNT+40;
			   AR=AX0-AY0;
			   IF GE JUMP adjust_10;
			   DM(I4,M4)=32440;
			   DM(I4,M4)=328;
			   JUMP adjust_11;
adjust_10:     DM(I4,M4)=32702;
			   DM(I4,M4)=66;
adjust_11:     DM(I4,M4)=24576;
			   DM(I4,M4)=8192;
   /*----------compute MeanSE----------------*/
comp_meanse:   I4=^coeffbuf;
			   MX0=DM(I4,M4);
			   MY0=DM(MeanSE);
			   MR=MX0 * MY0(SS),MX1=DM(I4,M4);
			   MY0=DM(ENERGY);
			   MR=MR+MX1*MY0(SS);
			   IF MV SAT MR;
			   DM(MeanSE)=MR1;
  /*-----------compute MeanSLE---------------*/
			   MY0=DM(MeanSLE);
			   MR=MX0 * MY0(SS);
			   MY0=DM(ENERGY_low);
			   MR=MR+MX1*MY0(SS),MX0=DM(I4,M4);
			   IF MV SAT MR;
			   DM(MeanSLE)=MR1;
  /*-----------compute MeanSZC----------------*/
			   MY0=DM(MeanSZC);
			   MR=MX0 * MY0(SS),MX1=DM(I4,M4);
			   MY0=DM(ZC);
			   MR=MR+MX1*MY0(SS),MX0=DM(I4,M4);
			   IF MV SAT MR;
			   DM(MeanSZC)=MR1;
   /*----------compute MeanLSF-----------------*/
//			   CNTR=M;
			   I1=^MeanLSF;
			   I2=^Enc_lsfnew;
			   MX1=DM(I4,M4);
			   MY0=DM(I2,M1);
			   CNTR=M;
			   DO mult_lsf UNTIL CE;
			   MR=MX1 * MY0(SS),MY0=DM(I1,M0);
			   MR=MR+MX0*MY0(SS),MY0=DM(I2,M1);
			   IF MV SAT MR;
mult_lsf:      DM(I1,M1)=MR1;
			   RTS;
/************************************************************************
* initialize and update the mins and prevmins                           *
* $$01/10/2000 used only in encoder                                     *
* $$01/11/2000  move dm table to pm table area                          *
* Calling Parameters													*	
*           SI         : reflection coefficient						  	*
*           Enc_Frame  : frame counter									*
*           Enc_pastVad: VAD decision of the last frame					*
*           Enc_ppastVad: VAD decision of the frame before last frame	*
* Return Values															*
* Altered Registers: MR,SR,AR,AF,AX0,AX1,AY0,AY1,MX0,MX1,MY0,MY1        *	
* Computation Time : 18 cycles										    *	
*************************************************************************/
.VAR/DM/RAM/SEG=App_DMtmp    dSE,dSLE,dSZC;

calc_mean:     AY0=INIT_FRAME;
			   AR=AX0-AY0;
			   IF GT JUMP set_parameter;
			   AX1=DM(ENERGY);
			   AY1=3072;
			   AR=AX1-AY1;
			   AR=PASS AR;
			   IF GE JUMP gt_energy;
			   AR=PASS NOISE;
			   DM(VadEncode)=AR;
			   AY1=DM(less_count);
			   AR=AY1+1;
			   DM(less_count)=AR;
			   JUMP set_parameter;
gt_energy:     AR=PASS VOICE;
               DM(VadEncode)=AR;
			   MR0=0;

⌨️ 快捷键说明

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