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

📄 lpcfunc.dsp

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

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

/************************************************************************
* Compute the LPC coefficients from lsp (order=10)						*
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters													*	
*         I1   : Q15 line spectral frequencies							*
* Return Values															*
*         I0   : Q12 predictor coefficients (order = 10)				*
* Altered Registers: MR,MF,SR,AR,AF,AX0,AX1,AY0,AY1,MX0,MY0				*
*                    I1,I2,I3,I4,I5										*        
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Lsp_Az;
.VAR/DM/RAM/SEG=App_DMtmp    f1hi[6],f1lo[6];
.VAR/DM/RAM/SEG=App_DMtmp    f2hi[6],f2lo[6];

Lsp_Az:        SI=I1;
			   I2=^f1lo;
			   I3=^f1hi;
               CALL Get_lsp_pol;
			   I1=SI;
			   I2=^f2lo;
			   I3=^f2hi;
			   MODIFY(I1,M1);
			   CALL Get_lsp_pol; 
//			   CNTR=5;
			   I1=^f1lo+5;
			   I2=^f1hi+5;
			   I4=^f2lo+5;
			   I5=^f2hi+5;
			   CNTR=5;
			   DO Lsp_Az_lp1 UNTIL CE;
			   AX0=DM(I1,M2); 
			   AX1=DM(I2,M2); 
			   AY0=DM(I1,M1); 
			   DIS AR_SAT;
			   AR=AX0+AY0,AY1=DM(I2,M1);
			   ENA AR_SAT;
			   SR0=AR,AR=AX1+AY1+C;
			   DM(I2,M2)=AR;
			   IF NOT AV JUMP lspaz_noav;
			   AR=PASS AR;
               AR=H#0000;
			   IF NEG AR=AR-1;
               SR0=AR;
lspaz_noav:	   DM(I1,M2)=SR0;
			   AX0=DM(I4,M7);
			   AX1=DM(I5,M7);
			   AY0=DM(I4,M4);
			   DIS AR_SAT;
			   AR=AX0-AY0,AY1=DM(I5,M4);
			   ENA AR_SAT;
			   SR0=AR,AR=AX1-AY1+C-1;
			   DM(I5,M7)=AR;
			   IF NOT AV JUMP Lsp_Az_lp1;
			   AR=PASS AR;
			   AR=H#0000;
			   IF GE AR=AR-1;
			   SR0=AR;
Lsp_Az_lp1:    DM(I4,M7)=SR0;
			   M3=10;
			   I3=I0;
//			   CNTR=5;
			   DM(I0,M1)=4096;
			   MODIFY(I3,M3);
			   I1=^f1lo+1;
			   I2=^f1hi+1;
			   I4=^f2lo+1;
			   I5=^f2hi+1;
			   CNTR=5;
			   DO Lsp_Az_lp2 UNTIL CE;
			   AX0=DM(I1,M1);
			   AY0=DM(I4,M4);
			   AX1=DM(I2,M1);
			   DIS AR_SAT;
			   AR=AX0+AY0,AY1=DM(I5,M4);
			   ENA AR_SAT;
			   SR0=AR,AR=AX1+AY1+C;  
			   IF NOT AV JUMP lspaz_noav2;
			   AR=PASS AR,SR1=AR;
			   AR=H#0000;
			   IF GE AR=AR-1;
			   AR=PASS SR1,SR0=AR;
lspaz_noav2:   SR=LSHIFT SR0 BY -13(HI);
			   SR=SR OR ASHIFT AR BY 3(HI);
			   AR=SR0+H#8000;
			   AR=SR1+C;		      
               DIS AR_SAT;  			 
			   AR=AX0-AY0,DM(I0,M1)=AR;
			   ENA AR_SAT;
			   SR0=AR,AR=AX1-AY1+C-1;
			   IF NOT AV JUMP lspaz_noav3;
			   AR=PASS AR,SR1=AR;
			   AR=H#0000;
			   IF GE AR=AR-1;
			   AR=PASS SR1,SR0=AR;
lspaz_noav3:   SR=LSHIFT SR0 BY -13(HI);
			   SR=SR OR ASHIFT AR BY 3(HI);	
			   AR=SR0+H#8000;
			   AR=SR1+C;		      
Lsp_Az_lp2:	   DM(I3,M2)=AR;
			   RTS;
/************************************************************************
* procedure Get_lsp_pol:												*
* Find the polynomial F1(z) or F2(z) from the LSPs						*
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters													*	
*         I1   : line spectral freq. (cosine domain)    in Q15			*
* Return Values															*
*         I2,I3: the coefficients of F1 or F2           in Q24			*
* Altered Registers: MR,MF,SR,AR,AF,AX0,AX1,AY0,AY1,MX0,MY0				*
*                    I1,I2,I3,I4,I5										*        
* Computation Time : 18 cycles											*	
*************************************************************************/
Get_lsp_pol:   I4=I2; 
			   I5=I3;
			   M6=0;
    /*---------All computation in Q24-------*/
//			   CNTR=4;
			   MX0=512;
			   AF=PASS 2;
			   DM(I2,M1)=0X0000;
			   DM(I3,M1)=0X0100;
			   MR=0,MY0=DM(I1,M1);
			   MR=MR-MX0*MY0(SS),AR=DM(I1,M1);
			   DM(I2,M1)=MR0;
			   DM(I3,M1)=MR1;
			   CNTR=4;
			   DO lsp_pol_lp UNTIL CE;
				  MY0=DM(I1,M1);
				  AY0=DM(I4,M6);
				  AY1=DM(I5,M6); 
			      AR=PASS AF,DM(I2,M0)=AY0; 
			      M3=AR; 
				  M5=AR;
			      AR=AF-1,DM(I3,M0)=AY1;
			      CNTR=AR;
			      DO lsp_pol_in UNTIL CE;
			      AX0=DM(I2,M2);
				  AR=PASS 1,SR0=DM(I2,M1);
				  SR=LSHIFT SR0 BY -1(LO);
				  MF=SR0 * MY0(SS),AX1=DM(I3,M2);
				  MR=AR * MF(SS),MX1=DM(I3,M1);
				  MR=MR+MX1*MY0(SS),AY0=DM(I4,M7);	
			      SR=LSHIFT MR0 BY 1(LO);
			      SR=SR OR ASHIFT MR1 BY 1(HI);
				  DIS AR_SAT;
				  AR=AX0+AY0,AY1=DM(I5,M7);
				  ENA AR_SAT;
				  AY0=AR,AR=AX1+AY1+C;	
				  AY1=AR;
				  IF NOT AV JUMP lsppol_noav1;
				  AR=H#0000;
				  NONE=PASS AY1;
				  IF GE AR=AR-1;
				  AY0=AR;
lsppol_noav1:     DIS AR_SAT;
			      AR=AY0-SR0;
				  ENA AR_SAT;
				  SR0=AR,AR=AY1-SR1+C-1;
				  DM(I3,M2)=AR;
				  IF NOT AV JUMP lsp_pol_in;
				  AR=PASS AR;
				  AR=H#0000;
				  IF GE AR=AR-1;
				  SR0=AR;
lsp_pol_in:       DM(I2,M2)=SR0;
				  MR0=DM(I2,M0);
			      MR1=DM(I3,M0);
			      MR=MR-MX0*MY0(SS),AR=DM(I1,M1);
			      AF=AF+1,DM(I2,M3)=MR0;
				  DM(I3,M3)=MR1;
				  MODIFY(I4,M5);
lsp_pol_lp:	   MODIFY(I5,M5);
               RTS;
/************************************************************************
* Lsf_lsp   Transformation lsf to lsp									* 
* Algorithm:															*
* The transformation from lsp[i] to lsf[i] and lsf[i] to lsp[i] are		*
* approximated by a look-up table and interpolation.					*
* $$01/10/2000 used both in encoder and decoder							*
* $$01/11/2000 move dm data table to pm data table						*
* $$01/11/2000 modify pointer and varaibles to adapt table change		*
* Calling Parameters													*	
*         I1   : Q15 lsf[m] (range: 0.0<=val<=0.5)						*
*         CNTR : LPC order												*
* Return Values															*
*         I0   : Q15 lsp[m] (range: -1<=val<1)							*
* Altered Registers: MR,SR,AR,AX0,AY0,AY1,MY0,I0,I1,I5					*
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Lsf_lsp;

Lsf_lsp:	   AY1=H#00FF;
               DO Lsf_lsp_lp UNTIL CE;
		       AR=DM(I1,M1);
			   SR=LSHIFT AR BY -8(LO);
     {---------lsp[i] = table[ind]+ ((table[ind+1]-table[ind])*offset)----}
			   M5=SR0;
			   I5=^table;
			   MODIFY(I5,M5);
			   AR=AR AND AY1,AY0=PM(I5,M4);
			   AX0=PM(I5,M4);
			   AR=AX0-AY0,MY0=AR;
			   MR=AR * MY0(SS);
			   SR=LSHIFT MR0 BY -9(LO);
			   SR=SR OR ASHIFT MR1 BY -9(HI);
			   AR=SR0+AY0;
Lsf_lsp_lp:	   DM(I0,M1)=AR;
               RTS;
/************************************************************************
* Lsp_lsf   Transformation lsp to lsf									*
* $$01/10/2000 used both in encoder and decoder							*
* $$01/11/2000 move dm data table to pm data table						*
* $$01/11/2000 modify pointer and varaibles to adapt table change		*

⌨️ 快捷键说明

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