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

📄 lspdec.dsp

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

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

/************************************************************************/
/* static memory for frame erase operation                              */
/* $$01/10/2000 lsp decoder used data and buffer                        */
/************************************************************************/
.VAR/DM/RAM/SEG=App_DMmem    prev_ma;    /* previous MA prediction coef.*/
.VAR/DM/RAM/SEG=App_DMmem    prev_lsp[M];/* previous LSP vector         */
.VAR/DM/RAM/SEG=App_DMmem    Dec_freq_prev[MA_NP*M]; /* Q13             */

/************************************************************************/
.EXTERNAL      Lsf_lsp2;
.EXTERNAL      Lsp_get_quant;
.EXTERNAL      Lsp_prev_update;
.EXTERNAL      Lsp_prev_extract;

/************************************************************************
* Lsp_decw_reset -   set the previous LSP vectors						*
* $$01/10/2000 used only in decoder										*
* $$01/11/2000 move dm data table to pm data table						*
* Calling Parameters													*	
* Return Values															*
* Altered Registers: SI,AR,I1,I5,M1,M4									*	
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Lsp_decw_reset;

Lsp_decw_reset:
//               CNTR=MA_NP;
               I1=^Dec_freq_prev;
               CNTR=MA_NP;
			   DO copy_prev_ou UNTIL CE;
//			   CNTR=M;
			   I5=^freq_prev_reset;
			   CNTR=M;
			   DO copy_prev_in UNTIL CE;
			   SI=PM(I5,M4);
copy_prev_in:  DM(I1,M1)=SI;
copy_prev_ou:  AR=PASS 0;
			   DM(prev_ma)=AR;
// 			   CNTR=M;
               I1=^prev_lsp;
			   I5=^freq_prev_reset;
 			   CNTR=M;
			   DO copy_lsp UNTIL CE;
			   SI=PM(I5,M4);
copy_lsp:      DM(I1,M1)=SI;
			   RTS;
/************************************************************************
* Get_decfreq_prev---get previous decoded frequency						*
* $$01/10/2000 used only in decoder										*
* Calling Parameters													*	
*         I1   :  x[MA_NP][M]											* 
* Return Values															*
* Altered Registers: AR,I1,I2,M1										*	
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Get_decfreq_prev;

Get_decfreq_prev:
//               CNTR=MA_NP*M;
			   I2=^Dec_freq_prev;
               CNTR=MA_NP*M;
			   DO back_decfreq UNTIL CE;
			   AR=DM(I2,M1);
back_decfreq:  DM(I1,M1)=AR;
               RTS;
/************************************************************************
* Update previous decoded frequency										* 
* $$01/10/2000 used only in decoder										*
* Calling Parameters													*	
*         I1   :  x[MA_NP][M]											* 
* Return Values															*
* Altered Registers: AR,I0,I1,M1										*	
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Update_decfreq_prev;

Update_decfreq_prev:
//               CNTR=MA_NP*M;
			   I0=^Dec_freq_prev;
               CNTR=MA_NP*M;
			   DO update_loop UNTIL CE;
			   AR=DM(I1,M1);
update_loop:   DM(I0,M1)=AR;
			   RTS;
/************************************************************************
* Function  D_lsp:														*
* $$01/10/2000 used only in decoder										*
* Calling Parameters   					  								*		
*         I1   : indexes of the selected LSP							*
*         AR   : frame erase information								*
* Return Values															*
*         SI  : Quantized LSP parameters								*
* Altered Registers: MR,MF,SR,SE,AR,AF,AY0,AY1,MX0,MX1,MY0,MY1			*	
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         D_lsp;
.VAR/DM/RAM/SEG=App_DMbuf    lsf_q[M];

D_lsp:		   I0=^lsf_q;
			   CALL Lsp_iqua_cs;
       {-------Convert LSFs to LSPs----------}
			   I0=SI;
	           CNTR=M;
			   I1=^lsf_q;
		       CALL Lsf_lsp2;
			   RTS;
/************************************************************************
* Lsp_iqua_cs -  LSP main quantization routine							*
* $$01/10/2000 used only in decoder										*
* $$01/11/2000 move table from dm area to pm area						*
* Calling Parameters   					  								*	
*         I1   : indexes of the selected LSP							*
*         AR   : frame erase information								*
* Return Values															*
*         I0   : Q13 Quantized LSP parameters							*
* Altered Registers: MR,SR,AR,AX0,AX1,AY0,AY1,MX0,MX1,MY0,MY1			*
* Computation Time : 18 cycles											*	
*************************************************************************/
.VAR/DM/RAM/SEG=App_DMbuf    buf[M];     /* Q13 */

Lsp_iqua_cs:   AR=PASS AR,MR0=DM(I1,M1);
			   IF NE JUMP frame_erase;
    {----------Not frame erasure--------------------}
			   MY1=I0;
			   SE=-NC0_B;			   
			   SR=ASHIFT MR0 (LO);
			   AR=SR0 AND H#0001;
  			   DM(prev_ma)=AR;
    /*---------setup other calling parameter-----------------*/
			   AY0=^fg;
			   MY0=MA_NP*M_2;
			   MR=AR * MY0(SS),SR0=MR0;
			   AR=MR0+AY0,MX1=AR;
			   AY0=^fg_sum;
			   MY0=M_2;
			   MR=MX1 * MY0(SS),MX0=AR;
			   AR=MR0+AY0;			   
			   MX1=^Dec_freq_prev;
    /*---------compose quantized LSP (lsp_q) from indexes-----*/
			   AY0=NC0-1;
			   AR=SR0 AND AY0,AX1=AR;
			   I4=^lspcb1;
			   MR=AR * MY0(SS),SR0=DM(I1,M0);
			   M5=MR0;  
			   MODIFY(I4,M5);
    /*---------caculate code1 book here---------------*/
			   AY0=NC1-1;
			   SE=-NC1_B;
			   SR=ASHIFT SR0 (LO);
			   AR=SR0 AND AY0;
			   MR=AR * MY0(SS),SR0=DM(I1,M1);
			   I5=^lspcb2;
			   M5=MR0;
			   MODIFY(I5,M5);
    /*---------caculate code2 book here--------------*/
			   AR=SR0 AND AY0;
			   I6=^lspcb2;
			   MR=AR * MY0(SS);
			   M5=MR0;
			   MODIFY(I6,M5);
			   CALL Lsp_get_quant;
   {-----------save parameters to use in case-----}
   {-----------of the frame erased situation------}
//			   CNTR=M;
			   I0=MY1;
			   I1=^prev_lsp;
			   CNTR=M;
			   DO copy_prev_lsp UNTIL CE;
			   AR=DM(I0,M1);
copy_prev_lsp: DM(I1,M1)=AR;
			   RTS;
      /*-------Frame erased------------*/
frame_erase:   //CNTR=M;
       {-------use revious LSP---------}
			   I1=^prev_lsp;
			   CNTR=M;
               Do copy_lsp_q UNTIL CE;
			   AR=DM(I1,M1);
copy_lsp_q:    DM(I0,M1)=AR;
       {-------update Dec_freq_prev----------}
			   SR0=DM(prev_ma);
			   SR=ASHIFT SR0 BY 1(LO);
			   M5=SR0;
			   I6=^fg;
			   I5=^fg_sum_inv;
			   MODIFY(I6,M5);
			   MODIFY(I5,M5);
			   I0=^buf;
			   I1=^prev_lsp;
			   AR=^Dec_freq_prev;
               CALL Lsp_prev_extract; 
			   I1=^buf;
			   I0=^Dec_freq_prev;
			   CALL Lsp_prev_update;  
               RTS;
/************************************************************************/
.ENDMOD;

⌨️ 快捷键说明

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