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

📄 acelpcode.dsp

📁 基于ADSP的G.729语音编解码程序
💻 DSP
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************
* Function  ACELP_Code_A()                                                *
* Find Algebraic codebook for G.729A                                      *
* $$01/10/2000 checked Acelp_ca 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        AcelpCode;

/**************************************************************************/
#include       "ld8a.inc"

/**************************************************************************/
.EXTERNAL      Enc_h1,Enc_y2,Enc_xn2;
.EXTERNAL      Enc_code,Enc_T0;
.EXTERNAL      Cor_h_X;

/**************************************************************************/
.VAR/DM/RAM/SEG=App_DMtmp    ptr_rri0i3_i4,ptr_rri1i3_i4;
.VAR/DM/RAM/SEG=App_DMtmp    ptr_rri2i3_i4,ptr_rri3i3_i4;

/**************************************************************************
* Main ACELP function.													  *
* $$01/10/2000 used only in encoder                                       *
* Calling Parameters												      *	
*         Enc_xn2    : Target vector									  *
*         Enc_h1     : Q12 Inpulse response of filters					  *
*         AX0        : Pitch lag										  *
*         AR         : Last quantized pitch gain						  *
* Return Values														      *
*         Enc_code   : Q13 :Innovative codebook						      *
*         Enc_y2     : Q12 :Filtered innovative codebook				  *
*         SR1        : Signs of 4 pulses								  *
*         SR0        : index of pulses positions					   	  *
* Altered Registers: MR,SR,AR,I0,I1,I2,I3,AX0,MY0						  *	
* Computation Time : 18 cycles											  *	
***************************************************************************/
.ENTRY         ACELP_Code_A;
.VAR/DM/RAM/SEG=App_DMbuf    ACELP_Dn[L_SUBFR];
.VAR/DM/RAM/SEG=App_DMbuf    ACELP_rr[DIM_RR];
.VAR/DM/RAM/SEG=App_DMtmp    incsharp;

ACELP_Code_A:  SR=ASHIFT SR0 BY 1(LO);
			   DM(incsharp)=SR0;
			   AY0=L_SUBFR;
 /*-----------------------------------------------------------------*
  * Include fixed-gain pitch contribution into impulse resp. h[]    *
  * Find correlations of h[] needed for the codebook search.        *
  *-----------------------------------------------------------------*/
			   AR=AY0-AX0,MY0=SR0;
			   IF LE JUMP calc_corh;
			   I1=^Enc_h1;
			   I2=^Enc_h1;
			   M3=AX0;
			   CNTR=AR;
			   MODIFY(I2,M3);
			   DO add_hhhh UNTIL CE;
			   AR=DM(I1,M1);
			   MR=AR * MY0(SS),AY0=DM(I2,M0);
			   AR=MR1+AY0;
add_hhhh:	   DM(I2,M1)=AR;
calc_corh:     I1=^Enc_h1;
               AX1=^ACELP_rr;
			   CALL Cor_h;
 /*-----------------------------------------------------------------*
  * Compute correlation of target vector with impulse response.     *
  *-----------------------------------------------------------------*/
		       I1=^Enc_xn2;
			   I2=^Enc_h1;
			   I0=^ACELP_Dn;
               CALL Cor_h_X;
 /*-----------------------------------------------------------------*
  * Find innovative codebook.                                       *
  *-----------------------------------------------------------------*/
			   I1=^ACELP_Dn;
			   I2=^sign_dn;
			   I3=^sign_dn_inv;
   			   CNTR=L_SUBFR;
               CALL D4i40_17_fast;
 /*-----------------------------------------------------------------*
  * Compute innovation vector gain.                                 *
  * Include fixed-gain pitch contribution into code[].              *
  *-----------------------------------------------------------------*/
			   M2=-1;
			   AX0=DM(Enc_T0);
			   AY0=L_SUBFR;
			   AR=AY0-AX0;
			   IF LE RTS;
			   CNTR=AR;
			   M3=AX0;
			   I1=^Enc_code;
			   I2=^Enc_code;
			   MODIFY(I2,M3);
			   MX0=DM(I1,M1);
			   MY0=DM(incsharp);
			   DO copy_code UNTIL CE;
			   MR=MX0 * MY0(SS),AY0=DM(I2,M0);
			   AR=MR1+AY0,MX0=DM(I1,M1);
copy_code:	   DM(I2,M1)=AR; 
               RTS;
/**************************************************************************
* Function  Cor_h()                                                       *
* Compute  correlations of h[]  needed for the codebook search.           *
* $$01/10/2000 used only in encoder                                       *
* Calling Parameters													  *	
*         I1  : Q12 Impulse response of filters							  * 
* Return Values															  *
*         AX1 : Correlations of H[]										  *
* Altered Registers: MR,SR,SE,AR,I0,AY0,MY0                               *	
* Computation Time : 18 cycles											  *	
***************************************************************************/
.VAR/DM/RAM/SEG=App_DMbuf    h[L_SUBFR]; /* Scaling h[] for maximum precision */

Cor_h:         MR=0;
			   I2=I1;
		       CNTR=L_SUBFR;
			   DO Cor_hmac UNTIL CE;
			   AR=DM(I2,M1);
Cor_hmac:	   IF NOT MV MR=MR+AR*AR(SS);
	           IF MV SAT MR;
               AY0=32000;
			   NONE=MR1-AY0;
			   IF LE JUMP Cor_hbr1;
			   I2=I1;
			   I4=^h;
			   CNTR=L_SUBFR;
			   DO Cor_hshr UNTIL CE;
			   AR=DM(I2,M1);
			   SR=ASHIFT AR BY -1(LO);
Cor_hshr:      MR=0,DM(I4,M4)=SR0;
			   JUMP Cor_hcomm1;
Cor_hbr1:      SE=EXP MR1(HI);
			   SE=EXP MR0(LO);
			   AR=SE;
			   AR=-AR;
			   SR=ASHIFT AR BY -1(LO);
			   AR=PASS AX1,SE=SR0;
			   I2=I1;
			   I4=^h;
			   CNTR=L_SUBFR;
			   AR=DM(I2,M1);
			   DO Cor_hshl UNTIL CE;
			   SR=ASHIFT AR (LO),AR=DM(I2,M1);
Cor_hshl:	   MR=0,DM(I4,M4)=SR0;
 /*------------------------------------------------------------*
  * Compute rri0i0[], rri1i1[], rri2i2[], rri3i3 and rri4i4[]  *
  *------------------------------------------------------------*/
Cor_hcomm1:	   I4=^h;
			   M3=-NB_POS;
			   I1=^ACELP_rr+5*NB_POS-1;
			   CNTR=NB_POS;
			   DO excor_hcomp UNTIL CE;
			   I0=I1;
			   CNTR=5;
			   DO incor_hcomp UNTIL CE;
			   AR=DM(I4,M4);
			   MR=MR+AR*AR(SS);
			   IF MV SAT MR;
incor_hcomp:   DM(I0,M3)=MR1;   
excor_hcomp:   MODIFY(I1,M2);
 /*-----------------------------------------------------------------*
  * Compute elements of: rri2i3[], rri1i2[], rri0i1[] and rri0i4[]  *
  *-----------------------------------------------------------------*/
			   AX0=1;
			   M5=STEP;
			   I6=^h+1;
			   AY0=NB_POS;
//			   CNTR=NB_POS;
			   M3=-NB_POS-1;
			   AR=NB_POS-1;
			   AY1=^ACELP_rr+5*NB_POS+4*MSIZE-2;
			   AX1=^ACELP_rr+5*NB_POS+MSIZE-1;
			   SR0=^ACELP_rr+5*NB_POS+5*MSIZE-1;
			   SR1=^ACELP_rr+5*NB_POS+8*MSIZE-1;
			   CNTR=NB_POS;
			   DO Cor_hline1 UNTIL CE;
               CALL twid_mult;
               AR=SR0-AY0,MX0=DM(I4,M4);
			   MY0=DM(I5,M4);
			   MR=MR+MX0*MY0(SS),SR0=AR;
  			   IF MV SAT MR;
			   DM(I3,M1)=MR1;
			   AR=AX1-AY0,MX0=DM(I4,M4);
			   MY0=DM(I5,M4);				  
			   MR=MR+MX0*MY0(SS),AX1=AR;
  			   IF MV SAT MR;
			   DM(I2,M1)=MR1;
			   AR=AY1-1,MX0=DM(I4,M4);
			   MY0=DM(I5,M4);
			   MR=MR+MX0*MY0(SS),AY1=AR;
  			   IF MV SAT MR;				  
Cor_hline1:	   AR=PASS AF,DM(I1,M1)=MR1;
 /*---------------------------------------------------------------------*
  * Compute elements of: rri2i4[], rri1i3[], rri0i2[], rri1i4[], rri0i3 *
  *---------------------------------------------------------------------*/
//			   CNTR=NB_POS;
			   M5=-NB_POS-1;
			   AR=NB_POS-1;
			   AX0=^h+2;
			   AY1=^ACELP_rr+5*NB_POS+3*MSIZE-2;
			   AX1=^ACELP_rr+5*NB_POS+9*MSIZE-1;
			   SR0=^ACELP_rr+5*NB_POS+2*MSIZE-1;
			   SR1=^ACELP_rr+5*NB_POS+6*MSIZE-1;
			   MX1=^ACELP_rr+5*NB_POS+7*MSIZE-2;
			   CNTR=NB_POS;
			   DO Cor_hline2 UNTIL CE;
			   CALL Conv_mac;
			   DM(I3,M1)=MR1;
			   AR=SR0-AY0,MX0=DM(I5,M4);
			   MY0=DM(I6,M4);
			   MR=MR+MX0*MY0(SS),SR0=AR;
  			   IF MV SAT MR;
Cor_hline2:	   AR=PASS AF,DM(I2,M1)=MR1;
 /*----------------------------------------------------------------------*
  * Compute elements of: rri1i4[], rri0i3[], rri2i4[], rri1i3[], rri0i2  *
  *----------------------------------------------------------------------*/
			   AR=NB_POS-1;
//			   CNTR=NB_POS;
			   AX0=^h+3;
			   AY1=^ACELP_rr+5*NB_POS+2*MSIZE-2;
			   AX1=^ACELP_rr+5*NB_POS+7*MSIZE-1;
			   SR0=^ACELP_rr+5*NB_POS+9*MSIZE-2;
			   SR1=^ACELP_rr+5*NB_POS+3*MSIZE-1;
			   MX1=^ACELP_rr+5*NB_POS+6*MSIZE-2;
			   CNTR=NB_POS;

⌨️ 快捷键说明

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