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

📄 lpcfunc.dsp

📁 基于ADSP的G.729语音编解码程序
💻 DSP
📖 第 1 页 / 共 2 页
字号:
* Calling Parameters													*		
*         I1   : Q15 lsp[m] (range: -1<=val<1)							*
*         CNTR : LPC order												*
* Return Values															*
*         I0   : Q15 lsf[m]  normalized (range: 0.0<=val<=0.5)			*
* Altered Registers: MR,SR,SE,AR,AF,AX0,AY0,MY0,I0,I1,I5				*
* Computation Time : 18 cycles											*		
*************************************************************************/
.ENTRY         Lsp_lsf;

Lsp_lsf:       SE=3;
			   AR=63;
			   DO Lsp_lsf_lp UNTIL CE;
ind_loop:	   I5=^table;
			   M5=AR;
			   MODIFY(I5,M5);
			   AF=PASS AR,AX0=PM(I5,M5);
			   AR=AF-1,AY0=DM(I1,M0);
			   NONE=AX0-AY0;
			   IF LT JUMP ind_loop;   
next_lsp_lsf:  AR=AR+1;
			   I5=^slope;
  			   MODIFY(I5,M5);
               SR=ASHIFT AR BY 8(LO);
			   AR=AY0-AX0,MY0=PM(I5,M5);
			   MR=AR * MY0(SS),AR=DM(I1,M2);
			   SR=LSHIFT MR0 (LO),AY0=SR0;
			   SR=SR OR ASHIFT MR1 (HI);
			   AR=SR0+H#8000;
			   AR=SR1+C;
			   AR=AR+AY0;
Lsp_lsf_lp:    AR=PASS AF,DM(I0,M2)=AR;
               RTS;
/************************************************************************
* Lsf_lsp2  Transformation lsf to lsp									*
* $$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   : Q13 lsf[m] (range: 0.0<=val<PI)						*
*         CNTR : LPC order												*
* Return Values															*
*         I0   : Q15 lsp[m] (range: -1<=val<1)							*
* Altered Registers: MR,SR,AR,AY0,AY1,MX0,MY0,MY1,I0,I1,I5				*
* Computation Time : 18 cycles											*		
*************************************************************************/
.ENTRY         Lsf_lsp2;

Lsf_lsp2:      AY0=63;
			   MY0=20861;
			   AF=PASS H#00FF;
			   DO Lsf_lsp2_lp UNTIL CE;
       {-------freq = abs_s(freq)------------}
			   MX0=DM(I1,M1);
			   MR=MX0 * MY0(SS);
			   SR=ASHIFT MR1 BY -8(LO);
			   AR=MR1 AND AF;
			   AR=PASS SR0,MY1=AR;
			   NONE=SR0-AY0;
			   IF GT  AR=PASS AY0;
       {-------lsp[i] = table2[ind]+ (slope_cos[ind]*offset >> 12)----}
			   M5=AR;
			   I5=^slope_cos;
			   MODIFY(I5,M5);
			   MX0=PM(I5,M5);
			   I5=^table2;
			   MODIFY(I5,M5);
			   MR=MX0 * MY1(SS),AY1=PM(I5,M4);
			   SR=LSHIFT MR0 BY -13(LO);
			   SR=SR OR ASHIFT MR1 BY -13(HI);
			   AR=SR0 + AY1;
Lsf_lsp2_lp:   DM(I0,M1)=AR;
               RTS;
/************************************************************************
* Lsp_lsf2  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		*
* Calling Parameters													*		
*         I1   : Q15 lsp[m] (range: -1<=val<1)							*
*         CNTR : LPC order												*
* Return Values															*
*         I0   : Q13 lsf[m] (range: 0.0<=val<PI)						*
* Altered Registers: MR,SR,AR,AF,AX0,AY0,MY0,MY1,I0,I1,I5				*
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Lsp_lsf2;

Lsp_lsf2:      AR=63;
			   MY1=25736;
			   DO Lsp_lsf2_lp UNTIL CE;
			   AY0=DM(I1,M2);
ind_loop2:	   I5=^table2;
			   M5=AR;
			   MODIFY(I5,M5);
			   AX0=PM(I5,M5);
			   NONE=AX0-AY0;
			   IF GE JUMP next_lsp_lsf2;
			   AR=AR-1;
			   IF GT JUMP ind_loop2;
next_lsp_lsf2: M5=AR;
		       I5=^table2;
			   MODIFY(I5,M5);
			   AF=PASS AR,AX0=PM(I5,M5);
			   SR=ASHIFT AR BY 9(LO);
			   I5=^slope_acos;
			   MODIFY(I5,M5);
    {----------acos(lsp[i])= ind*512 + (slope_acos[ind]*offset >> 11)----}
			   AR=AY0-AX0,MY0=PM(I5,M5);
			   MR=AR * MY0(SS),AY0=SR0; 
			   SR=LSHIFT MR0 BY -12(LO);
			   SR=SR OR ASHIFT MR1 BY -12(HI);
			   AR=SR0+AY0;
			   MR=AR * MY1(SS);
Lsp_lsf2_lp:   AR=PASS AF,DM(I0,M2)=MR1;
               RTS;
/************************************************************************
* procedure Weight_Az Weighting of LPC coefficients.					*
*   ap[i]  =  a[i] * (gamma ** i)										*
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters													*	
*         I1   : Q12 : a[m+1]  LPC coefficients							*
*         MY1  : Q15 : Spectral expansion factor.						*
*         CNTR : LPC order.												*
* Return Values															*
*         I0   : Q12 Spectral expanded LPC coefficients					*
* Altered Registers: MR,MX0,MY0,I0,I1,M1								*		
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Weight_Az;

Weight_Az:     MX0=DM(I1,M1);
			   DM(I0,M1)=MX0;
			   MR1=MY1;
			   DO round_Az UNTIL CE;
			   AR=PASS MR1,MY0=DM(I1,M1);
			   MR=AR * MY0(RND);
round_Az:	   MR=AR * MY1(RND),DM(I0,M1)=MR1;
		       MY0=DM(I1,M1);
			   MR=MR1 * MY0(RND);
			   DM(I0,M1)=MR1;
			   RTS;
/************************************************************************
* Interpolation of the quantized LSP's									*
* Interpolation of the LPC parameters.									*
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters													*	
*         I1   : LSP vector of past frame								*
*         I2   : LSP vector of present frame							*
* Return Values															*
*         I0   : Q12 Spectral expanded LPC coefficients					*
* Altered Registers: MR,SR,AR,I0,I1,I2,I3,AX0,MY0						*		
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Int_qlpc;
.VAR/DM/RAM/SEG=App_DMbuf    lsp[M];
.VAR/DM/RAM/SEG=App_DMtmp    I0_save,I2_save;

Int_qlpc:      
     {---------lsp[i] = lsp_new[i] * 0.5 + lsp_old[i] * 0.5-------}
			   SE=-1;
			   I3=I2;
//			   CNTR=M;
			   I4=^lsp;
               MR0=DM(I1,M1);
			   CNTR=M;
			   DO add_qlpc UNTIL CE;
			   SR=ASHIFT MR0 (LO),AR=DM(I3,M1);
			   SR=ASHIFT AR (LO),AY0=SR0;
			   AR=SR0+AY0,MR0=DM(I1,M1);
add_qlpc:      DM(I4,M4)=AR;
     {---------subframe 1-------}
               DM(I0_save)=I0;
               DM(I2_save)=I2;
			   I1=^lsp;
			   CALL Lsp_Az;
     {---------subframe 2-------}
			   M3=MP1;
			   I0=DM(I0_save);
			   I1=DM(I2_save);
			   MODIFY(I0,M3);
			   CALL Lsp_Az;
			   RTS;
{
/************************************************************************
* Interpolation of the unquantized LPC parameters.						*
* Same as the previous function but we do not recompute Az() for		*
* subframe 2  because it is already available.							*
* We also compute the interpolate LSF (frequency domain).				*
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters													*	
*         I1   : LSP vector of past frame								*
*         I2   : LSP vector of present frame							*
* Return Values															*
*         I3   : interpolated lsf coefficients							*
*         I4   : Enc_lsfnew												*
*         I0   : interpolated Az() for the 2 subframes					*
* Altered Registers: MR,SR,AR,I0,I1,I2,I3,I4,AX0,MY0					*	
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Int_lpc;

Int_lpc:  	   SE=-1;
       /*------lsp[i] = lsp_new[i] * 0.5 + lsp_old[i] * 0.5---*/
		       CNTR=M;
			   I5=^lsp;
			   MR0=DM(I1,M1);
               DO add_lpc UNTIL CE;
			   SR=ASHIFT MR0 (LO),AR=DM(I2,M1);
			   SR=ASHIFT AR (LO),AY0=SR0;
			   AR=SR0+AY0,MR0=DM(I1,M1);
add_lpc:	   DM(I5,M4)=AR;
               I1=^lsp;
			   CALL Lsp_Az;
      /*-------transformation from LSP to LSF (freq.domain)----*/
			   I0=^lsp;
			   CNTR=M;
			   CALL Lsp_lsf;
      /*-------lsp[i] = lsp_new[i] * 0.5 + lsp_old[i] * 0.5----*/
			   CNTR=M;
			   CALL Lsp_lsf; 
               RTS;
}
/************************************************************************/
.ENDMOD;

⌨️ 快捷键说明

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