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

📄 lspgetq.dsp

📁 基于ADSP的G.729语音编解码程序
💻 DSP
字号:
/************************************************************************/
/* $$01/10/2000 checked Lspgetq module data variable 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        Lspgetq;

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

/************************************************************************
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters									 				*	
*         I4  : Q13 first stage LSP codebook							*
*         I5  : Q13 Second stage LSP codebook							*
*         I6  : Q13 third stage LSP codebook							*
*         MX0 : Q15 MA prediction coef.									*
*         MX1 : Q13 previous LSP vector									*
*         AX1 : Q15 present MA prediction coef.							*
* Return Values															*
*         MY1 : Q13 quantized LSP parameters							*
* Altered Registers: MR,SR,SI,AR,AF,AX0,AX1,AY0,AY1,MX0,MX1,MY0			*
*                    MY1,I0,I1,I2,I3,I4,I5								*	
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Lsp_get_quant;
.VAR/DM/RAM/SEG=App_DMbuf    bufdata[M];           /* Q13 */

Lsp_get_quant: //CNTR=NC;
			   I0=^bufdata;
			   CNTR=NC;
			   DO init_buf1 UNTIL CE;
			   AX0=PM(I4,M4);
			   AY0=PM(I5,M4);
			   AR=AX0+AY0,AX0=PM(I6,M4);
init_buf1:     DM(I0,M1)=AR;
				nop;
			   AX0=PM(I4,M4);
			   CNTR=M-NC;
			   DO init_buf2 UNTIL CE;
			   AY0=PM(I6,M4);
			   AR=AX0+AY0,AX0=PM(I4,M4); 
init_buf2:     DM(I0,M1)=AR;
               AY0=GAP1;
			   I1=^bufdata;
			   CALL Lsp_expand_1_2;
               AY0=GAP2;
			   I1=^bufdata;
			   CALL Lsp_expand_1_2;
               I1=^bufdata;
			   I0=MY1;
			   I5=MX0;
			   AR=MX1;
			   I4=AX1;
			   CALL Lsp_prev_compose;
			   I0=MX1;
               I1=^bufdata;
			   CALL Lsp_prev_update;
               I0=MY1;
			   CALL Lsp_stability;
			   RTS;
/************************************************************************
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters													*	
*         AY0  : Q13 gap												*
* Return Values															*
*         I1: Q13 LSP vectors											*
* Altered Registers: SR,AR,AX0,AY0,AY1,I1								*
* Computation Time : 18 cycles											*	
************************************************************************/
.ENTRY         Lsp_expand_1;

Lsp_expand_1:  CNTR=NC-1;
lsp_expand:    DO expand_loop UNTIL CE;
               AY1=DM(I1,M1);  
			   AX0=DM(I1,M2);  
			   AR=AY1-AX0;
			   AR=AR+AY0;
			   SR=ASHIFT AR BY -1(LO);   	
			   AR=PASS SR0;
			   IF LE JUMP expand_loop;
			   AR=AY1-SR0,AY1=SR0;
			   AR=AX0+AY1,DM(I1,M1)=AR; 
			   DM(I1,M2)=AR;  
expand_loop:   MODIFY(I1,M1); 
			   RTS;
/************************************************************************
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters													*	
*         AY0  : Q13 gap												*
* Return Values															*
*         I1: Q13 LSP vectors (+NC-1)   	  							*
* Altered Registers: SR,AR,AX0,AY0,AY1,I1								*	
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Lsp_expand_2;

Lsp_expand_2:  CNTR=M-NC;
			   JUMP lsp_expand;
/************************************************************************
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters													*	
*         AY0  : Q13 gap												*
* Return Values															*
*         I1: Q13 LSP vectors											*
* Altered Registers: SR,AR,AX0,AY0,AY1,I1								*	
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Lsp_expand_1_2;

Lsp_expand_1_2:
			   CNTR=M-1;
			   JUMP lsp_expand;
/************************************************************************
* Functions which use previous LSP parameter (freq_prev).				* 
* compose LSP parameter from elementary LSP with previous LSP.			*
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters													*	
*         I1   : Q13 LSP vectors										*
*         I5   : Q15 MA prediction coef.								*
*         AR   : Q13 previous LSP vector								*
*         I4   : Q15 present MA prediction coef.						*
* Return Values															*
*         I0   : Q13 quantized LSP parameters							*
* Altered Registers: MR,AR,MY0,AY0,AY1,I0,I1,I3,I4,I5,I6,M5				*	
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Lsp_prev_compose;

Lsp_prev_compose:
			   M3=M;
			   M5=M;
               CNTR=M;
			   DO lsp_prev_loop UNTIL CE;
			   I3=AR;
			   I6=I5;
//			   CNTR=MA_NP;
               MX0=DM(I1,M1),MY0=PM(I4,M4);
			   MR=MX0*MY0(SS),AY0=AR;
			   CNTR=MA_NP;
			   DO mac_lsp_prev UNTIL CE;
			   MX0=DM(I3,M3),MY0=PM(I6,M5);
mac_lsp_prev:  IF NOT MV MR=MR+MX0*MY0(SS);
               IF MV SAT MR;
			   AR=AY0+1,DM(I0,M1)=MR1;
lsp_prev_loop: MODIFY(I5,M4);
 			   RTS;
/************************************************************************
* extract elementary LSP from composed LSP with previous LSP			*
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters													*		
*         I1   : Q13 unquantized LSP parameters							*
*         I6   : Q15 MA prediction coef.								*
*         AR   : Q13 previous LSP vector								*
*         I5   : Q12 inverse previous LSP vector						*
* Return Values															*
*         I0   : Q13 target vector										*
* Altered Registers: MR,SR,AR,AF,MX0,MY0,I0,I1,I2,I4,I5,I6				*
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Lsp_prev_extract;

Lsp_prev_extract:
               M3=M;
			   M5=M;
			   CNTR=M;
			   DO extract_loop UNTIL CE;
			   MR=0;
			   I4=I6;
			   I2=AR;
//			   CNTR=MA_NP;
			   AF=PASS AR,MR1=DM(I1,M1);  
			   CNTR=MA_NP;
			   DO msu_lsp_loop UNTIL CE;
			   MX0=DM(I2,M3),MY0=PM(I4,M5);			   
msu_lsp_loop:  IF NOT MV MR=MR-MX0*MY0(SS);
               IF MV SAT MR;
			   MY0=PM(I5,M4);
			   MR=MR1 * MY0(SS);
			   SR=LSHIFT MR0 BY 3(LO);
			   SR=SR OR ASHIFT MR1 BY 3(HI);
			   AR=AF+1,DM(I0,M1)=SR1;
extract_loop:  MODIFY(I6,M4);
		       RTS;
/************************************************************************
* update previous LSP parameter											*
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters													*		
*        I1 : Q13 LSP vectors											*
* Return Values															*
*        I0 : Q13 previous LSP vectors									*
* Altered Registers: AR,AX0,AY0,I0,I1,I2,I3								*	
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Lsp_prev_update;

Lsp_prev_update:
			   I2=I0;
			   I3=I0;
               M3=(MA_NP-1)*M-1; 
			   MODIFY(I2,M3);
			   M3=MA_NP*M-1;
			   MODIFY(I3,M3);	
			   CNTR=(MA_NP-1)*M;
			   DO update_prev UNTIL CE;
			   AR=DM(I2,M2);
update_prev:   DM(I3,M2)=AR;
				nop;
			   CNTR=M;
               DO update_lsp_lp UNTIL CE;
			   AR=DM(I1,M1);
update_lsp_lp: DM(I0,M1)=AR;
			   RTS;
/************************************************************************
* $$01/10/2000 used both in encoder and decoder							*
* Calling Parameters													*	
*         I0   : Q13 quantized LSP parameters							*
* Return Values															*
*         I0   : Q13 quantized LSP parameters							*
* Altered Registers: MR,SR,AR,AF,AX0,AY0,AY1,I0,I1						*	
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Lsp_stability;

Lsp_stability: I1=I0;
			   CNTR=M-1;
			   DO stable_loop1 UNTIL CE;
			   MR0=DM(I1,M1);
			   AF=PASS MR0,MR1=DM(I1,M2);
			   SR=ASHIFT MR1 BY 0(LO);
			   AF=SR0-AF,AY1=SR1;
			   SR=ASHIFT MR0 BY 0(LO);
			   AF=SR1-AY1+C-1;
			   NONE=PASS AF;
			   IF GE JUMP stable_loop1;
      /*-------exchange buf[j]<->buf[j+1]--------*/
			   DM(I1,M1)=MR1;
			   DM(I1,M2)=MR0;
stable_loop1:  MODIFY(I1,M1);
               AY0=L_LIMIT;
			   AR=DM(I0,M1);
			   NONE=AR-AY0;
			   IF LT AR=PASS AY0;
			   SE=0;
			   AX0=GAP3;
			   CNTR=M-1;
			   DO stable_loop2 UNTIL CE;
			   MR1=DM(I0,M2);
			   SR=ASHIFT MR1 (LO),MR0=DM(I0,M1);
			   AY0=SR0;
			   SR=ASHIFT MR0 (LO),AY1=SR1;
			   DIS AR_SAT;
               AF=AY0-SR0,AY0=MR0;
			   ENA AR_SAT;
			   AR=AY1-SR1+C-1;
			   IF NOT AV JUMP stable_noav;
			   AF=PASS H#0000;
			   AR=PASS AR;
			   IF GE AF=AF-1;
stable_noav:   AF=AF-AX0;
			   AF=AR+C-1;
			   NONE=PASS AF;
			   IF GE JUMP stable_loop2;
			   AR=AX0+AY0;
			   DM(I0,M0)=AR;
stable_loop2:  MODIFY(I0,M1);
               MODIFY(I0,M2);
			   AR=DM(I0,M0);
			   AY0=M_LIMIT;
               NONE=AR-AY0;
			   IF GT AR=PASS AY0;
			   DM(I0,M1)=AR; 
               RTS;
/************************************************************************/
.ENDMOD;

⌨️ 快捷键说明

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