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

📄 dtxcng.dsp

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

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

/************************************************************************/
/* $$01/10/2000 static memory and pointer                               */
/************************************************************************/
.VAR/DM/RAM/SEG=App_DMmem    lspSid_q[M] ;
.VAR/DM/RAM/SEG=App_DMmem    pastCoeff[MP1];
.VAR/DM/RAM/SEG=App_DMmem    RCoeff[MP1];
.VAR/DM/RAM/SEG=App_DMmem    Acf[SIZ_ACF];
.VAR/DM/RAM/SEG=App_DMmem    sh_Acf[NB_CURACF];
.VAR/DM/RAM/SEG=App_DMmem    sumAcf[SIZ_SUMACF];
.VAR/DM/RAM/SEG=App_DMmem    sh_sumAcf[NB_SUMACF];
.VAR/DM/RAM/SEG=App_DMmem    ener[NB_GAIN];
.VAR/DM/RAM/SEG=App_DMmem    sh_ener[NB_GAIN];
.VAR/DM/RAM/SEG=App_DMmem    sh_RCoeff,sid_gain,Enc_curgain;
.VAR/DM/RAM/SEG=App_DMmem    fr_cur,nb_ener,count_fr0;
.VAR/DM/RAM/SEG=App_DMmem    flag_chang,prev_energy;
.GLOBAL        lspSid_q;

/*************************************************************************/
.EXTERNAL      Enc_excit;
.EXTERNAL      Enc_seed;
.EXTERNAL      Enc_lspold_q;
.EXTERNAL      Enc_pastVad;
.EXTERNAL      analy,Enc_Aqt;
.EXTERNAL      Az_lsp;
.EXTERNAL      Int_qlpc;
.EXTERNAL      Levinson;
.EXTERNAL      lsfq_noise;
.EXTERNAL      Qua_Sidgain;
.EXTERNAL      Calc_exc_rand;

/**************************************************************************
* procedure Init_Cod_cng:                                                 *
*   Initialize variables used for dtx at the encoder                      *
* $$01/10/2000 checked Dtxmod module data variables and function          *
* Calling Parameters												      *	
* Return Values														      *
* Altered Registers: MR,SR,AR,I0,I1,I2,I3,AX0,MY0                         *	
* Computation Time : 18 cycles										      *	
***************************************************************************/
.ENTRY         Init_Cod_cng;

Init_Cod_cng:  I1=^sumAcf;
			   CNTR=SIZ_SUMACF;
               DO zero_sumAcf UNTIL CE;
zero_sumAcf:   DM(I1,M1)=0;
			   I1=^sh_sumAcf;
			   CNTR=NB_SUMACF;
			   DO zero_shsumAcf UNTIL CE;
zero_shsumAcf: DM(I1,M1)=40;
			   I1=^Acf;
               CNTR=SIZ_ACF;
			   DO zero_Acf UNTIL CE;
zero_Acf:	   DM(I1,M1)=0;
			   I1=^sh_Acf;
			   CNTR=NB_CURACF;
			   DO zero_shAcf UNTIL CE;
zero_shAcf:	   DM(I1,M1)=40;
			   I2=^ener;
			   I1=^sh_ener;
			   CNTR=NB_GAIN;
			   DO zero_ener UNTIL CE;
			   DM(I1,M1)=40;
zero_ener:     DM(I2,M1)=0;
               AR=PASS 0;
			   DM(Enc_curgain)=AR;
			   DM(fr_cur)=AR;
			   DM(flag_chang)=AR;
               RTS;
/**************************************************************************
* procedure Cod_cng:                                                      *
* $$01/10/2000 checked Dtxmod module data variables and function          *
*   computes DTX decision                                                 *
*   encodes SID frames                                                    *
*   computes CNG excitation for encoder update                            *
* Calling Parameters												      *	
*   *exc,          : excitation array									  *	
*   Enc_pastVad    : previous VAD decision								  *
*   Enc_lspold_q   : previous quantized lsp								  *
*     Enc_Aqt      : set of interpolated LPC coefficients				  *
*    analy         : coded SID parameters								  *
*   lsfq_mem       : previous LPS for quantization						  *
*   seed           : random generator seed								  *
* Return Values														      *
* Altered Registers: MR,SR,AR,I0,I1,I2,I3,AX0,MY0                         *	
* Computation Time : 18 cycles										      *	
***************************************************************************/
.ENTRY         Cod_cng;
.VAR/DM/RAM/SEG=App_DMtmp    lpcCoeff,cur_igain,energyq;
.VAR/DM/RAM/SEG=App_DMbuf    curAcf[MP1],curCoeff[MP1],lsp_new[M];             

Cod_cng:       AR=DM(ener);
     /*--------Update Ener and sh_ener-------------*/
			   DM(ener+1)=AR;
			   AR=DM(sh_ener);
			   DM(sh_ener+1)=AR;
     /*--------Compute current Acfs---------------*/
			   I2=^Acf;
			   I1=^sh_Acf;
			   I3=^curAcf;
			   AY0=NB_CURACF;
			   CALL Calc_sum_acf; 
			   DM(sh_ener)=AR;
			   SR0=DM(curAcf);
			   AR=PASS SR0;
			   IF EQ JUMP zero_curAcf;
			   I0=^zero;
			   CNTR=MP1;
			   DO zero_zero UNTIL CE;
zero_zero:     DM(I0,M1)=0;
               I3=^curAcf;
			   I2=^zero;
			   I0=^curCoeff;
			   I1=^bid;
               CALL Levinson; 
    /*---------if first frame of silence => SID frame-----*/
zero_curAcf:   DM(ener)=SR0;
		       AR=DM(Enc_pastVad);
			   AR=PASS AR;
			   IF EQ JUMP gain_next;
			   I6=DM(analy);
			   AY0=1;
			   AR=PASS 0;
			   DM(I6,M4)=2;
			   DM(nb_ener)=AY0;
			   DM(count_fr0)=AR;
               I1=^ener;
			   I2=^sh_ener;
			   CALL Qua_Sidgain;
			   DM(energyq)=AR;
			   DM(cur_igain)=AX0;
			   JUMP gain_comm;
gain_next:     AY0=DM(nb_ener);
               AR=AY0+1;
			   AY0=NB_GAIN;
			   NONE=AR-AY0;
			   IF GT AR=PASS AY0;
			   DM(nb_ener)=AR;
			   I1=^ener;
               I2=^sh_ener;
			   AY0=DM(nb_ener);
			   CALL Qua_Sidgain;
			   DM(energyq)=AR;
			   DM(cur_igain)=AX0;
	/*---------Compute stationarity of current filter---------*/
	/*---------versus reference filter-------------------------*/
			   MX1=DM(ener);
			   MY1=FRAC_THRESH1;
			   CALL Cmp_filt; 
			   AR=DM(flag_chang);
			   AF=PASS AF;			   
			   IF NE AR=PASS 1;
	/*---------compare energy difference between current frame and last frame */
			   AX0=DM(prev_energy);
			   AY0=DM(energyq);
			   AR=AX0-AY0,AX1=AR;
			   AF=ABS AR;
			   AX0=2;
			   AF=AF-AX0,AR=AX1;
			   IF GT AR=PASS 1;
               DM(flag_chang)=AR;
			   AY0=DM(count_fr0);
			   AF=AY0+1,AX1=AR;
			   AR=PASS 0;
			   AX0=FR_SID_MIN;
			   NONE=AF-AX0;
			   IF LT JUMP gain_con;
               NONE=PASS AX1;
			   IF NE AR=PASS 2;
			   AF=PASS AX0;
gain_con:	   I6=DM(analy);
	           AR=PASS AF,DM(I6,M4)=AR;
               DM(count_fr0)=AR;
gain_comm:     I6=DM(analy);
			   AR=DM(I6,M4);
			   DM(analy)=I6;
			   AR=AR-2;
			   IF NE JUMP gain_abc_con;
	 /*--------Reset frame count and change flag */
			   DM(count_fr0)=AR;
			   DM(flag_chang)=AR;
 	 /*--------Compute past average filter */
			   CALL Calc_pastfilt; 
               I0=^RCoeff;
			   AX0=^pastCoeff;
			   CALL Calc_RCoeff; 
			   DM(sh_RCoeff)=AR;  
	 /*--------Compute stationarity of current filter  ---- */
	 /*--------versus past average filter               ----*/
	 /*--------if stationary--------------------------------*/
	 /*--------transmit average filter => new ref. filter---*/
			   MX1=DM(ener);
			   MY1=FRAC_THRESH2;
			   CALL Cmp_filt;     
			   AF=PASS AF;
			   I1=^pastCoeff;
			   IF EQ JUMP tran_con;
	 /*--------transmit current filter => new ref. filter */
			   I0=^RCoeff;
			   AX0=^curCoeff;
			   CALL Calc_RCoeff; 
			   DM(sh_RCoeff)=AR;
               I1=^curCoeff;
tran_con:      M3=M;
			   I2=I1;
			   MODIFY(I1,M1);
			   MODIFY(I2,M3);
	 /*--------Compute SID frame codes-----*/
			   I0=^lsp_new;
			   I3=^Enc_lspold_q;
			   CALL Az_lsp; 
	 /*--------LSP quantization------------*/
			   I1=^lsp_new+M-1;
			   CALL lsfq_noise; 
			   AR=DM(energyq);
			   DM(prev_energy)=AR;
   			   I6=DM(analy);
			   AR=DM(cur_igain);
			   DM(I6,M6)=AR;
			   DM(analy)=I6;
			   I4=^tab_Sidgain;
			   M5=AR;
			   MODIFY(I4,M5);
			   AR=PM(I4,M4);
			   DM(sid_gain)=AR;
      /*-------Compute new excitation-----------*/
gain_abc_con:  AR=DM(sid_gain);
			   AX0=DM(Enc_pastVad);
			   NONE=PASS AX0;
			   IF NE JUMP gain_cde;			  
			   MY0=A_GAIN1;
			   MR=AR * MY0(RND);
			   MY0=A_GAIN0;
			   AR=DM(Enc_curgain);
			   MR=AR * MY0(RND),AY0=MR1;
			   AR=MR1+AY0;
gain_cde:      DM(Enc_curgain)=AR;
			   I1=DM(Enc_excit);
			   MX0=DM(Enc_seed);
			   AX0=DM(Enc_curgain);		      
			   CALL Calc_exc_rand;
			   DM(Enc_seed)=MX0;
			   I1=^Enc_lspold_q;
			   I2=^lspSid_q;
			   I0=^Enc_Aqt;
			   CALL Int_qlpc;
//			   CNTR=M;
			   I1=^lspSid_q;
			   I0=^Enc_lspold_q;
			   CNTR=M;
			   DO old_sid UNTIL CE;
			   AR=DM(I1,M1);
old_sid:       DM(I0,M1)=AR;
    /*---------Update sumAcf if fr_cur = 0-------*/
			   AR=DM(fr_cur);
			   AR=PASS AR;
			   IF EQ CALL Update_sumAcf;
			   RTS;
/***************************************************************************
* procedure Update_cng:                                                    *
* Updates autocorrelation arrays                                           *
* used for DTX/CNG                                                         *
* If Vad=1 : updating of array sumAcf                                      *
* $$01/10/2000 checked Dtxmod module data variables and function           *
* Calling Parameters													   *	
*         I2   : MSB of frame autocorrelation					           *
*         AX0  : scaling factor associated								   * 
*         AY0  : current Vad decision								       *
* Return Values															   *
* Altered Registers: AR,AX0,AY0,AY1,SI,I1,I2,I3                            *	
* Computation Time : 18 cycles											   *	
****************************************************************************/
.ENTRY         Update_cng;

Update_cng:    //CNTR=SIZ_ACF-MP1;
			   I1=^Acf+SIZ_ACF-1;
			   I3=^Acf+SIZ_ACF-MP1-1;

⌨️ 快捷键说明

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