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

📄 acelpcode.dsp

📁 基于ADSP的G.729语音编解码程序
💻 DSP
📖 第 1 页 / 共 2 页
字号:
			   DO Cor_hline3 UNTIL CE;
			   CALL Conv_mac;
			   AR=SR0-1;
			   SR0=AR;
Cor_hline3:	   AR=PASS AF,DM(I3,M1)=MR1;
 /*----------------------------------------------------------------------*
  * Compute elements of: rri0i4[], rri2i3[], rri1i2[], rri0i1[]          *
  *----------------------------------------------------------------------*/
			   AX0=0;
			   M5=STEP;
			   I6=^h+4;
//			   CNTR=NB_POS;
			   AR=NB_POS-1;
			   AY1=^ACELP_rr+5*NB_POS+MSIZE-2;
			   AX1=^ACELP_rr+5*NB_POS+5*MSIZE-2;
			   SR0=^ACELP_rr+5*NB_POS+8*MSIZE-2;
			   SR1=^ACELP_rr+5*NB_POS+4*MSIZE-1;
			   CNTR=NB_POS;
			   DO Cor_hline4 UNTIL CE;
               CALL twid_mult;
			   AR=SR0-1;			      
			   AR=AY1-1,SR0=AR;				  	
			   AY1=AX1;
			   AR=AY1-1,AY1=AR;   
			   AX1=AR;				  
Cor_hline4:	   AR=PASS AF,DM(I3,M1)=MR1;
               RTS;  
/*************************************************************************
* do convolution multipy operation (standalone function)                 *
* $$01/10/2000 used only in encoder                                      *
* Calling Parameters													 *	
*		      AY1 : data pointer 0										 *
*		      MX1 : data pointer 1										 *
*		      SR0 : data pointer 2										 *
*		      SR1 : data pointer 3										 *
*			  AX1 : data pointer 4										 *
*		      AX0 : data pointer 5										 *
*			  AR  : loop count of convolution                            *
* Return Values															 *
* Altered Registers: MR,SR,AR,AF,AX0,AX1,AY0,AY1,MX0,MX1,MY0             *
*                    I0,I1,I2,I3,I4,I5,I6                                *	
* Computation Time : 18 cycles											 *	
**************************************************************************/
Conv_mac:	   MR=0;
		       I0=AY1;
		       I1=MX1;
		       I2=SR0;
		       I3=SR1;
			   I4=AX1;
			   I5=^h;
		       I6=AX0;
			   AF=PASS AR;
			   IF EQ JUMP Conv_loop+1;
			   CNTR=AR;
		       DO Conv_loop UNTIL CE;
               MX0=DM(I5,M4);
			   MY0=DM(I6,M4);
			   MR=MR+MX0*MY0(SS),AR=DM(I5,M4);
  			   IF MV SAT MR;
			   DM(I4,M5)=MR1;
			   MY0=DM(I6,M4);
			   MR=MR+AR*MY0(SS),MX0=DM(I5,M4);
  			   IF MV SAT MR;
			   DM(I3,M3)=MR1;
			   MY0=DM(I6,M4);
			   MR=MR+MX0*MY0(SS),AR=DM(I5,M4);
  			   IF MV SAT MR;
			   DM(I2,M3)=MR1;
			   MY0=DM(I6,M4);
			   MR=MR+AR*MY0(SS),MX0=DM(I5,M4);
  			   IF MV SAT MR;
			   AR=PASS MR1,MY0=DM(I6,M4);
			   MR=MR+MX0*MY0(SS),DM(I1,M3)=AR;
  			   IF MV SAT MR;
Conv_loop:     DM(I0,M3)=MR1;
               MX0=DM(I5,M4);
       		   AR=AX1-AY0,MY0=DM(I6,M4);
			   MR=MR+MX0*MY0(SS),AX1=AR;
  			   IF MV SAT MR;
			   DM(I4,M4)=MR1;
  			   AR=SR1-AY0,MX0=DM(I5,M4);
			   AF=AF-1,MY0=DM(I6,M4);
			   MR=MR+MX0*MY0(SS),SR1=AR;
  			   IF MV SAT MR;
 			   AR=AX0+STEP;				  	      
			   AR=AY1-1,AX0=AR;
			   AY1=MX1;
			   AR=AY1-1,AY1=AR;
			   MX1=AR;
               RTS;
/*************************************************************************
* do convolution multipy operation (standalone function)                 *
* $$01/10/2000 used only in encoder                                      *
* Calling Parameters													 *	
*             AX0 : control falg                                         *
*		      AY1 : data pointer 0										 *
*		      AX1 : data pointer 1										 *
*		      SR0 : data pointer 2										 *
*		      SR1 : data pointer 3										 *
*		      AX0 : data pointer 4										 *
*		      I6  : data pointer 5										 *
*			  AR  : loop count of convolution                            *
* Return Values															 *
* Altered Registers: MR,SR,AR,AF,AX0,AX1,AY0,AY1,MX0,MX1,MY0             *
*                    I0,I1,I2,I3,I4,I5,I6                                *	
* Computation Time : 18 cycles											 *	
**************************************************************************/
twid_mult:	   MR=0;
		       I0=AY1;
		       I1=AX1;
		       I2=SR0;
		       I3=SR1;
               I4=^h;
		       I5=I6;
			   AF=PASS AR;
			   IF EQ JUMP twid_loop+1;
			   CNTR=AR;
			   DO twid_loop UNTIL CE;
               MX0=DM(I4,M4);
			   MY0=DM(I5,M4);
			   MR=MR+MX0*MY0(SS),MX1=DM(I4,M4);
  			   IF MV SAT MR;
               AR=PASS MR1,MY0=DM(I5,M4);
			   MR=MR+MX1*MY0(SS),MX0=DM(I4,M4);
  			   IF MV SAT MR;
			   NONE=PASS AX0;
			   IF NE AR=PASS MR1;
			   DM(I3,M3)=AR;
			   MY0=DM(I5,M4);
			   MR=MR+MX0*MY0(SS),MX1=DM(I4,M4);
  			   IF MV SAT MR;
			   DM(I2,M3)=MR1;
			   MY0=DM(I5,M4);
			   MR=MR+MX1*MY0(SS),MX0=DM(I4,M4);
  			   IF MV SAT MR;
			   AR=PASS MR1,MY0=DM(I5,M4);
			   MR=MR+MX0*MY0(SS),DM(I1,M3)=AR;
  			   IF MV SAT MR;
twid_loop:     DM(I0,M3)=MR1;
               AF=AF-1,MX0=DM(I4,M4);
			   AR=SR1-AY0,MY0=DM(I5,M4);
			   MR=MR+MX0*MY0(SS),SR1=AR;
  			   IF MV SAT MR;
               MODIFY(I6,M5);
               RTS;
/**************************************************************************
* Function  D4i40_17_fast()                                               *
* Algebraic codebook for ITU 8kb/s.                                       *
*  -> 17 bits; 4 pulses in a frame of 40 samples                          *
* The code length is 40, containing 4 nonzero pulses i0, i1, i2, i3.      *
* Each pulses can have 8 possible positions (positive or negative)        *
* except i3 that have 16 possible positions.                              *
* i0 (+-1) : 0, 5, 10, 15, 20, 25, 30, 35                                 *
* i1 (+-1) : 1, 6, 11, 16, 21, 26, 31, 36                                 *
* i2 (+-1) : 2, 7, 12, 17, 22, 27, 32, 37                                 *
* i3 (+-1) : 3, 8, 13, 18, 23, 28, 33, 38                                 *
*            4, 9, 14, 19, 24, 29, 34, 39                                 *
* $$01/10/2000 used only in encoder                                       *
* Calling Parameters													  *	
*         ACELP_Dn: Correlations between h[] and Xn[].       			  *
*         AX1   : Correlations of impulse response h[].					  *
*         h     : Q12 Impulse response of filters.						  *
* Return Values															  *
*         Enc_code: Q13 Selected algebraic codeword.					  *
*         Enc_y2: Q12 Filtered algebraic codeword.						  *
*         SR0   : Index of pulses positions.							  *
*         SR1   : Signs of 4 pulses.									  *
* Altered Registers: MR,SR,SE,AR,I0,,AY0,MY0                              *	
* Computation Time : 18 cycles											  *	
***************************************************************************/
.VAR/DM/RAM/SEG=App_DMbuf    sign_dn[L_SUBFR];
.VAR/DM/RAM/SEG=App_DMbuf    sign_dn_inv[L_SUBFR];
.VAR/DM/RAM/SEG=App_DMbuf    tmp_vect[NB_POS];
.VAR/DM/RAM/SEG=App_DMtmp    IP0, IP1, IP2, IP3, track,ii1_offset;
.VAR/DM/RAM/SEG=App_DMtmp    ps,psk,alp,ps1,prev_i0,alpk,max_start;
.VAR/DM/RAM/SEG=App_DMtmp    II0,II1,II2,II3,IX,IY,sq,index_start;

D4i40_17_fast: 
 /*-----------------------------------------------------------------------*
  * Chose the sign of the impulse.                                        *
  *-----------------------------------------------------------------------*/
			   AX0=H#8000;
			   DO choose_sign UNTIl CE;
			   AR=DM(I1,M0);
			   NONE=PASS AR;
			   IF LT JUMP le_sign;
			   AR=-AX0,DM(I3,M1)=AX0;
			   DM(I2,M1)=AR;
 			   JUMP choose_sign;
le_sign:       AR=-AR,DM(I2,M1)=AX0;
			   AR=-AX0,DM(I1,M0)=AR;
			   DM(I3,M1)=AR;
choose_sign:   MODIFY(I1,M1);
 /*-------------------------------------------------------------------*
  * Modification of rrixiy[] to take signs into account.              *
  *-------------------------------------------------------------------*/
			   M5=STEP;
			   M3=MSIZE;
//			   CNTR=NB_POS;
               I4=^sign_dn;
			   AY0=STEP;
			   AX0=^sign_dn+1;
               I1=^ACELP_rr+5*NB_POS;
			   AX1=^sign_dn_inv+1;
			   CNTR=NB_POS;
			   DO modify_line1 UNTIL CE;
			   AR=PASS AX0,SR0=DM(I4,M5);
			   NONE=PASS SR0;
			   IF LT AR=PASS AX1;
			   CNTR=NB_POS;
			   DO modify_col1 UNTIL CE;
			   I5=AR;
			   I0=I1;
//			   CNTR=4;
			   MY0=DM(I5,M4);
			   CNTR=4;
			   DO inmodify_col1 UNTIL CE;
			   MX0=DM(I0,M0);
			   MR=MX0 * MY0(SS),MY0=DM(I5,M4);
inmodify_col1: DM(I0,M3)=MR1;
               AR=AR+AY0;               
modify_col1:   MODIFY(I1,M1);
modify_line1:  I2=^ACELP_rr+5*NB_POS+4*MSIZE;
               I4=^sign_dn+1;
//

⌨️ 快捷键说明

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