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

📄 lpc.dsp

📁 基于ADSP的G.729语音编解码程序
💻 DSP
📖 第 1 页 / 共 2 页
字号:
 *-------------------------------------------------------------*/
Az_lsp:        M6 =0; 
               I4=^f1;
			   I5=^f2;
			   AX1=I1;
			   AY1=I2;
//			   CNTR=NC;
			   AF=PASS 0;
			   MY0=16384;			   
			   DM(I4,M6)=2048;
			   DM(I5,M6)=2048;
			   I6=^Chebps_11; 
			   CNTR=NC;
			   DO coef_loop1 UNTIL CE;
			   MX0=DM(I1,M1);
			   MR=MX0 * MY0(SS),MX1=DM(I2,M2);
			   MR=MR+MX1*MY0(SS),AY0=DM(I4,M4);
			   IF MV AF=PASS 1;
			   AR=MR1-AY0;
			   IF AV AF=PASS 1;
			   MR=MX0 * MY0(SS),DM(I4,M6)=AR;
               MR=MR-MX1*MY0(SS),AY0=DM(I5,M4);
			   IF MV AF=PASS 1;			      
			   AR=MR1+AY0;
			   IF AV AF=PASS 1;
coef_loop1:    DM(I5,M6)=AR;
			   NONE=PASS AF;
			   IF EQ JUMP skip_f1f2;	
               I1=AX1;
			   I2=AY1;
			   I4=^f1;
			   I5=^f2;
//			   CNTR=NC;
			   MY0=8192;
			   I6=^Chebps_10;
			   DM(I4,M4)=1024;
			   DM(I5,M4)=1024;
			   MX0=DM(I1,M1);
			   CNTR=NC;
			   DO coef_loop2 UNTIL CE;
			   MR=MX0 * MY0(SS),MX1=DM(I2,M0);
			   MR=MR+MX1*MY0(SS),AY0=DM(I4,M4);
               AR=MR1-AY0;
			   MR=MX0 * MY0(SS),DM(I4,M6)=AR;
			   MR=MR-MX1*MY0(SS),AY0=DM(I5,M4);
			   AR=MR1-AY0,MX0=DM(I1,M1);
coef_loop2:	   DM(I5,M6)=AR;
/*-------------------------------------------------------------*
 * find the LSPs using the Chebichev pol. evaluation           *
 *-------------------------------------------------------------*/
skip_f1f2:     I2=I0;
			   I1=^f1+1;
			   I4=^grid;
               AR=PASS 0;  
               DM(nf)=AR;
			   DM(ip)=AR; 
			   AF=PASS 0,MX0=PM(I4,M4);
			   CNTR=NC-2;
			   CALL (I6);
			   DM(ylow)=SR1;
Chebps_loop:   AY0=M;
			   AX0=DM(nf);
			   NONE=AX0-AY0;
			   IF GE JUMP skip_Chebps;
			   AX1=GRID_POINTS;
			   NONE=AF-AX1;
			   IF GE JUMP skip_Chebps;
			   CNTR=NC-2;
			   AR=DM(ylow);
			   DM(xhigh)=MX0;
			   DM(yhigh)=AR;
			   AF=AF+1,MX0=PM(I4,M4);
			   CALL (I6);
			   DM(ylow)=SR1;
			   MY0=DM(yhigh);
			   MR=SR1 * MY0(SS);
			   IF MV SAT MR;
			   AR=PASS MR1,AY0=MR0;
			   IF LT JUMP do_chebps;
			   NONE=MR1 OR AY0;
			   IF NE JUMP Chebps_loop;
    {----------divide 2 times the interval---------------}
do_chebps:     CNTR=2;
               DO cal_lohi UNTIL CE;
			   SE=-1;
			   AR=DM(xhigh);
			   SR=ASHIFT AR (LO),AR=MX0;
			   SR=ASHIFT AR (LO),AY0=SR0;
			   AR=SR0+AY0,AX0=MX0;
			   MX0=AR;
			   CNTR=NC-2;
			   CALL (I6);
			   MY0=DM(ylow);
			   MR=SR1 * MY0(SS);
               AR=PASS MR1,AY0=MR0;
			   IF LT JUMP hilo_exch;
			   NONE=MR1 OR AY0;
			   IF NE JUMP hilo_keep;
hilo_exch:     DM(yhigh)=SR1;
			   DM(xhigh)=MX0;
			   JUMP cal_lohi;
hilo_keep:	   DM(ylow)=SR1;
			   AX0=MX0;
cal_lohi:      MX0=AX0;
    /*-------------------------------------------------------------*
     * Linear interpolation                                        *
     *    xint = xlow - ylow*(xhigh-xlow)/(yhigh-ylow);            *
     *-------------------------------------------------------------*/
               AX1=DM(yhigh);
			   AY1=DM(ylow);
			   AR=AX1-AY1,AY0=MX0;  
			   IF EQ JUMP line_inter;
			   AX0=DM(xhigh);
			   AR=AX0-AY0,AX0=AR; 
			   AR=ABS AX0,MY0=AR;
			   SE=EXP AR(HI),MX1=AX0;
			   SR=NORM AR (LO),AX0=SE;
			   AR=PASS AF;
			   MR=0,AX1=AR;
			   MR0=H#3FFF;
			   CALL div_s;
			   AY0=-20;
			   AF=PASS AX1;
			   AR=AY0-AX0,SR0=AR;
			   MR=SR0 * MY0(SS),SE=AR;
			   SR=LSHIFT MR0 (LO);
			   SR=SR OR ASHIFT MR1 (HI);
			   AR=PASS SR0,AX0=MX1;
			   NONE=PASS AX0;
			   IF LT AR=-AR;
			   MY0=DM(ylow);
			   MR=AR * MY0(SS),AY0=MX0;
			   SR=LSHIFT MR0 BY -11(LO);
			   SR=SR OR ASHIFT MR1 BY -11(HI);
			   AR=AY0-SR0;
			   AY0=AR;
line_inter:	   AY1=DM(nf);
		       AR=AY1+1,MX0=AY0;
		       DM(nf)=AR;
		       AR=DM(ip);
		       AR=PASS AR,DM(I2,M1)=AY0;
		       IF NE JUMP first_coef;
			   AR=AR+1;
			   I1=^f2+1;
			   JUMP cal_chebps;
first_coef:	   AR=PASS 0;
			   I1=^f1+1;
cal_chebps:    DM(ip)=AR;
			   CNTR=NC-2;
		       CALL (I6);
			   DM(ylow)=SR1;
			   JUMP Chebps_loop;
   {-----------Check if M roots found----------}
skip_Chebps:   NONE=AX0-AY0;
			   IF GE RTS;
			   CNTR=M;
			   DO copy_oldnew UNTIL CE;
			   AR=DM(I3,M1);
copy_oldnew:   DM(I0,M1)=AR;
               RTS;
/*********************************************************************
* Evaluates the Chebichev polynomial series                          *
* The polynomial order is                                            *
*     n = M/2   (M is the prediction order)                          *
* The polynomial is given by                                         *
*    C(x) = T_n(x) + f(1)T_n-1(x) + ... +f(n-1)T_1(x) + f(n)/2       *
* The value of C(x) is returned. (Saturated to +-1.99 in Q14)        *
* $$01/10/2000 used only in encoder and decoder                      *
* Calling Parameters												 *	
*         AR   : input value of evaluation; x = cos(frequency) in Q15* 
*         I1   : coefficients of the pol (f+1)                       *
*         CNTR : order of the pol.       (n-2)                       *
* Return Values														 *
*         SR1  :  output value                                       *
* Altered Registers: MR,MF,SR,SE,AR,AX1,AY0,AY1,MX0,MX1,MY0,MY1,I1   *
* Computation Time : 18 cycles										 *	
**********************************************************************/
Chebps_1x:	   SE=1;
               SI=I1;
			   AY0=0;
			   MY1=4096;
			   MR=MX0 * MY0(SS),MX1=DM(I1,M1);
			   MR=MR+MX1*MY1(SS);	
			   MX1=-32768;
			   SR=LSHIFT MR0 BY -1(LO);
			   DO chebps11_lp UNTIL CE;
				  AR=PASS 1,MY0=SR0;
				  MF=MX0 * MY0(SS),MY0=MR1;
			      MR=AR * MF(SS),AR=MR1;
			      MR=MR+MX0*MY0(SS),MY0=AY1;
			      SR=LSHIFT MR0 (LO),AX1=SR0;
			      SR=SR OR ASHIFT MR1(HI),AY1=AR;
			      MR0=SR0;
			      AR=PASS 1,MR1=SR1;
			      MR=MR+MX1*MY0(SS),MY0=AY0;
				  MR=MR-AR*MY0(SS),SR0=DM(I1,M1);
			      MR=MR+SR0*MY1(SS),AY0=AX1;
chebps11_lp:   SR=LSHIFT MR0 BY -1(LO);
			   AR=PASS 1,MY0=SR0;
			   MF=MX0 * MY0(SS),MY0=MR1;
			   MR=AR * MF(SS);
			   MR=MR+MX0*MY0(SS),MY0=AY1;
			   MR=MR+MX1*MY0(SS),MY0=AY0;
               MR=MR-AR*MY0(SS),SR0=DM(I1,M1);
			   I1=SI;
			   MY0=2048;
			   MR=MR+SR0*MY0(SS);
			   SE=EXP MR1(HI);
			   SE=EXP MR0(LO);
			   AR=SE;
			   RTS;

Chebps_11:     AY1=256;
               MY0=512;
			   CALL Chebps_1x;
			   AY0=6;
chebps_1c:	   AR=AR+AY0,SE=AY0;
	           IF LE JUMP shiftl_noav;
			   AR=H#8000;
			   NONE=PASS MR1;
			   IF GE AR=PASS H#7FFF;
			   SR1=AR;
			   RTS;
shiftl_noav:   SR=LSHIFT MR0 (LO);
			   SR=SR OR ASHIFT MR1 (HI);
			   RTS;
/*********************************************************************
* Chebps_10 calculation equation                                     *
* $$01/10/2000 used only in encoder and decoder                      *
* Calling Parameters												 *	
*         MX0  : input value of evaluation x = cos(frequency) in Q15 * 
*         I1   : coefficients of the pol  (f+1)                      *
*         CNTR : order of the pol.  (n-2)                            *
* Return Values														 *
*         SR1  :  output value                                       *
* Altered Registers: MR,MF,SR,SE,AR,AX1,AY0,AY1,MX0,MX1,MY0,MY1,I1   *	
* Computation Time : 18 cycles										 *	
**********************************************************************/
Chebps_10:     AY1=128;
               MY0=256;
			   CALL Chebps_1x;
			   AY0=7;
			   JUMP chebps_1c;
			   RTS;
/*****************************************************************
* Function Autocorr()                                            *
* Compute autocorrelations of signal with windowing              *
* $$01/10/2000 used only in encoder and decoder                  *
* $$01/11/2000 modify pointer and varaibles to adapt table change*
* Calling Parameters											 *	
*         I1  : Input signal                                     *
*         AY0 : LPC order                                        *
* Return Values													 *
*         I2  : Autocorrelations  (lsb)                          *
*         I3  : Autocorrelations  (msb)                          *
*         AR  : Enc_expR0                                        *
* Altered Registers: MR,SR,SE,AR,AF,AY0,MX0,MY0,I0,I1,I2,I3,I4   *	
* Computation Time : 18 cycles									 *	
******************************************************************/
.ENTRY         Autocorr;
.VAR/DM/RAM/SEG=App_DMbuf    y[L_WINDOW];

Autocorr:      I0=^y;
//               CNTR=L_WINDOW;
               I4=^hamwindow;
               CNTR=L_WINDOW;
               Do copy_corr UNTIL CE;
			   AR=PASS 1,MX0=DM(I1,M1),MY0=PM(I4,M4);
			   MR=MX0 * MY0(RND);
copy_corr:	   DM(I0,M1)=MR1;
      /*-------Compute r[0] and test for overflow-------*/
exp_cal:       MR1=0;
			   MR0=1;
			   I0=^y;
			   AF=PASS 0;
               CNTR=L_WINDOW;
			   DO mac_sum UNTIL CE;
			   SR0=DM(I0,M1);
               MR=MR+SR0*SR0(SS); 
			   IF MV AF=AF+1;
mac_sum:       IF MV SAT MR;
     /*--------If overflow divide y[] by 4--------------*/
			   NONE=PASS AF;
			   IF EQ JUMP norm_sum;
			   I0=^y;
			   CNTR=L_WINDOW;
			   DO shr_sum UNTIL CE;
			   SR0=DM(I0,M0);
			   SR=ASHIFT SR0 BY -2(LO);
shr_sum:	   DM(I0,M1)=SR0;
               AR=AR+4;
 	           JUMP exp_cal;
     /*--------Normalization of r[0]----------------------*/
norm_sum:      I0=^y+1;
//               CNTR=AY0;
               SE=EXP MR1 (HI);
			   SE=EXP MR0 (LO);
               CNTR=AY0;
			   SR=NORM MR0 (LO),AY0=SE;
			   SR=SR OR NORM MR1 (HI);
			   AF=AR+AY0,DM(I3,M1)=SR1;
			   SR=LSHIFT SR0 BY -1(LO);	   
			   AR=L_WINDOW-1;		
			   DM(I2,M1)=SR0;
 	 /*--------r[1] to r[m]-------------------------------*/
               DO extract_hilo UNTIL CE;
			   MR=0;
			   I4=^y;
			   I1=I0;
			   CNTR=AR;
			   DO mac_hilo UNTIL CE;
			   MX0=DM(I4,M4);
			   MY0=DM(I1,M1);
mac_hilo:	   IF NOT MV MR=MR+MX0*MY0(SS);
	           IF MV SAT MR;
			   SR=NORM MR0 (LO),AY0=AR;
			   SR=SR OR NORM MR1 (HI);
			   AR=AY0-1,DM(I3,M1)=SR1;
			   SR=LSHIFT SR0 BY -1(LO);
			   DM(I2,M1)=SR0;
extract_hilo:  MODIFY(I0,M1);
               AR=PASS AF;
			   RTS;
/*********************************************************************
* Function Lag_window()                                              *
* Lag_window on autocorrelations.                                    *
* r[i] *= lag_wind[i]                                                *
* r[i] and lag_wind[i] are in special double precision.              *
* $$01/10/2000 used only in encoder and decoder                      *
* $$01/11/2000 modify pointer and varaibles to adapt table change    *
* Calling Parameters												 *	
*         CNTR :  LPC order  (m-1)                                   *
*         I2   :  Autocorrelations  (msb+1)                          *
*         I1   :  Autocorrelations  (lsb+1)                          *
* Return Values														 *
* Altered Registers: MR,MF,AR,MX0,MX1,MY0,MY1,I1,I2,I4,I5            *	
* Computation Time : 18 cycles										 *	
**********************************************************************/
.ENTRY         Lag_window;

Lag_window:    I4=^lag_l;
			   I5=^lag_h;
			   DO lag_loop UNTIL CE;
			   AR=PASS 1,MX1=DM(I2,M0),MY1=PM(I5,M4);
			   MR=MX1 * MY1(SS),MX0=DM(I1,M0),MY0=PM(I4,M4);
			   MF=MX0 * MY1(SS);               
               MR=MR+AR*MF(SS);
			   MF=MX1 * MY0(SS);
			   MR=MR+AR * MF(SS);
			   SR=LSHIFT MR0 BY -1(LO);
               DM(I1,M1)=SR0;
lag_loop:      DM(I2,M1)=MR1;    
               RTS;
/************************************************************************/
.ENDMOD;

⌨️ 快捷键说明

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