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

📄 quantlsp.dsp

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

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

/************************************************************************/
/* $$01/10/2000 static varaibles used in decoder frame speech process   */
/************************************************************************/
.VAR/DM/RAM/SEG=App_DMmem Enc_freq_prev[MA_NP*M]; /* Q13:previous LSP vector*/

/************************************************************************/
.EXTERNAL      Enc_lspnew_q;
.EXTERNAL      Lsf_lsp2;
.EXTERNAL      Lsp_lsf2;
.EXTERNAL      Lsp_expand_1;
.EXTERNAL      Lsp_expand_2;
.EXTERNAL      Lsp_get_quant;
.EXTERNAL      Lsp_expand_1_2;
.EXTERNAL      Lsp_prev_extract;

/************************************************************************
* Function  Qua_lsp:													*
* $$01/10/2000 used only in encoder										*
* Calling Parameters   													*	
*         I1   : Q15 Unquantized LSP ([m])								*
* Return Values															*
*         I2   : Q15 Quantized LSP										*
*         SR   : indexes												*
* Altered Registers: MR,SR,SE,AR,AF,AX0,AX1,AY0,AY1,MX0,MY0,MY1			*	
* Computation Time : 18 cycles											*	
************************************************************************/
.ENTRY         Qua_lsp;
.VAR/DM/RAM/SEG=App_DMbuf    Quant_lsf[M],Quant_lsfq[M];  /* domain 0.0<= lsf <PI in Q13 */

Qua_lsp:	   //CNTR=M;
     /*--------Convert LSPs to LSFs-----------*/
			   I0=^Quant_lsf+M-1;
			   CNTR=M;
			   CALL Lsp_lsf2;               
			   I1=^Quant_lsf;
			   CALL Lsp_qua_cs;
     /*--------Convert LSFs to LSPs-----------*/
//			   CNTR=M;
			   I0=^Enc_lspnew_q;
			   I1=^Quant_lsfq;
			   CNTR=M;
			   CALL Lsf_lsp2;
			   SR0=DM(ana0);
			   SR1=DM(ana1);
               RTS;
/************************************************************************
* $$01/10/2000 used only in encoder										*
* Calling Parameters   													*	
*         I1   : Q13 Original LSP parameters							*
* Return Values															*
*         SR   : codes of the selected LSP								*
* Altered Registers: MR,SR,SE,AR,AF,AX0,AX1,AY0,AY1,MX0,MY0				*	
* Computation Time : 18 cycles											*	
************************************************************************/
.VAR/DM/RAM/SEG=App_DMbuf    wegt[M]; /*Q11:normalized weighting coefficients*/

Lsp_qua_cs:	   I2=I1;
               I4=^wegt; 
               CALL Get_wegt;
			   SI=I1;
			   CALL Relspwed;
		       RTS;
/************************************************************************
* $$01/10/2000 used only in encoder										*
* $$01/11/2000 move table from dm area to pm area						*
* Calling Parameters   													*	
*         SI   : unquantized LSP parameters								*
* Return Values															*
*         SR   : codes of the selected LSP								*
* Altered Registers: MR,SR,SE,AR,AF,AX0,AX1,AY0,AY1,MX0,MY0				*	
*                    I0,I1,I2,I3,I4,I5,I6								*
* Computation Time : 18 cycles											*	
*************************************************************************/
.VAR/DM/RAM/SEG=App_DMbuf    tindex1[MODE],tindex2[MODE];
.VAR/DM/RAM/SEG=App_DMbuf    tdist[2*MODE],buf[M];           /* Q26 */
.VAR/DM/RAM/SEG=App_DMbuf    cand[MODE],rbuf[M];             /* Q13 */
.VAR/DM/RAM/SEG=App_DMtmp    ana0,ana1,mode,save_I6;

Relspwed:      I3=^cand;
               I6=^tdist;
               AR=PASS 0;
//			   CNTR=MODE;
			   MX1=^tindex1;
			   MY1=^tindex2;
			   CNTR=MODE;
               DO Relsp_loop UNTIL CE;
			   DM(save_I6)=I6;
			   DM(mode)=AR;
			   I6=^fg;
			   MY0=MA_NP*M_2;
			   MR=AR * MY0(SS);
			   M5=MR0;
			   MODIFY(I6,M5);
			   MY0=M_2;
			   MR=AR * MY0(SS);
			   M5=MR0;
			   I5=^fg_sum_inv;
			   MODIFY(I5,M5);
			   I0=^rbuf;
			   I1=SI;
			   AR=^Enc_freq_prev;
			   CALL Lsp_prev_extract;
			   I1=^rbuf;
			   I4=^lspcb1;
			   CALL Lsp_pre_select; 
			   MY0=M_2;
			   MR=MX0 * MY0(SS),DM(I3,M1)=MX0;
			   M5=MR0;
               I1=^rbuf;
			   I4=^lspcb1;
			   I5=^lspcb2;
			   MODIFY(I4,M5);
			   CALL Lsp_select_1;
			   I0=MX1;               
			   MY0=M_2;
			   MR=SR0 * MY0(SS),DM(I0,M1)=SR0;
			   MX1=I0;
			   M5=MR0;
			   I5=^lspcb2;
			   MODIFY(I5,M5);
			   MR=MX0 * MY0(SS);
			   M5=MR0;
			   I0=^buf;
//			   CNTR=NC;
			   I4=^lspcb1;
			   MODIFY(I4,M5);
			   CNTR=NC;
			   DO add_Relsp1 UNTIL CE;
			   AX0=PM(I4,M4);
			   AY0=PM(I5,M4);
			   AR=AX0+AY0;
add_Relsp1:    DM(I0,M1)=AR;                  
			   I1=^buf;
			   AY0=GAP1;     
		       CALL Lsp_expand_1;
			   MR=MX0 * MY0(SS);
			   M5=MR0;
               I1=^rbuf+NC;
			   I4=^lspcb1+NC;
			   I5=^lspcb2+NC;
			   MODIFY(I4,M5);
			   CALL Lsp_select_2;
 			   I1=MY1;
			   MY0=M_2;
			   MR=MX0 * MY0(SS),DM(I1,M1)=SR0; 
			   MY1=I1;
			   M5=MR0;
			   I5=^lspcb1+NC;
			   MODIFY(I5,M5);
			   MR=SR0 * MY0(SS);
			   M5=MR0;
			   I4=^lspcb2+NC;
			   MODIFY(I4,M5);
			   I0=^buf+NC;
			   CNTR=M-NC;
			   DO add_Relsp2 UNTIL CE;
			   AX0=PM(I4,M4);
			   AY0=PM(I5,M4);
			   AR=AX0+AY0;
add_Relsp2:	   DM(I0,M1)=AR;
			   I1=^buf+NC-1;  
               AY0=GAP1;
			   CALL Lsp_expand_2;
 		       I1=^buf;
			   AY0=GAP2;
			   CALL Lsp_expand_1_2;
			   MX0=DM(mode);
 			   I4=^fg_sum;
			   MR=MX0 * MY0(SS);
			   M5=MR0;
			   MODIFY(I4,M5);
               MR=0;
			   I0=^wegt;
			   I1=^buf;
			   I2=^rbuf;
			   CALL Lsp_get_tdist;
			   I6=DM(save_I6);
               DM(I6,M4)=MR0;
Relsp_loop:	   AR=PASS 1,DM(I6,M4)=MR1;
			   I1=^tdist;
               CALL Lsp_last_select;
   		       M3=AR;
			   I0=^cand;
			   I1=^tindex1;
			   I2=^tindex2;
			   MODIFY(I0,M3);
			   MODIFY(I1,M3);
			   MODIFY(I2,M3);
			   SR=ASHIFT AR BY NC0_B(LO);
			   MY0=M_2;
			   AY0=^fg_sum;
			   MR=AR * MY0(SS),AY1=DM(I0,M0);
			   AR=MR0+AY0,MX0=AR;	
			   AY0=^fg;
			   MY0=MA_NP*M_2;
			   MR=MX0 * MY0(SS),AX1=AR;			   		   
			   AR=MR0+AY0,SR1=DM(I1,M1);
			   AR=SR0 OR AY1,MX0=AR;
			   DM(ana0)=AR;
   			   MY0=M_2;
			   MR=SR1 * MY0(SS),MX1=DM(I0,M1);
			   M5=MR0;
			   I5=^lspcb2;	
			   MODIFY(I5,M5);
			   MR=MX1 * MY0(SS),MX1=DM(I2,M0);
			   M5=MR0;
			   I4=^lspcb1;
			   MODIFY(I4,M5);
			   MR=MX1 * MY0(SS),AY1=DM(I2,M1);
			   M5=MR0;
			   I6=^lspcb2;
			   MODIFY(I6,M5);
			   SR=ASHIFT SR1 BY NC1_B (LO);
			   AR=SR0 OR AY1;
			   DM(ana1)=AR;
			   MX1=^Enc_freq_prev;
			   MY1=^Quant_lsfq;
		       CALL Lsp_get_quant;
			   RTS;
/************************************************************************
* $$01/10/2000 used only in encoder										*
* Calling Parameters   													*	
*         I2   : Q13 M LSP parameters									*
* Return Values															*
*         I4   : Q11->norm M weighting coefficients						*
* Altered Registers: MR,SR,SE,AR,AF,AY0,MY0,I2,I3,I4,I5					*	
* Computation Time : 18 cycles											*	
*************************************************************************/
.ENTRY         Get_wegt;

Get_wegt:      I3=I2;
			   I5=^buf;
//               CNTR=M-2;
			   AY0=PI04+8192;
			   MODIFY(I2,M1);
               AR=DM(I2,M1);
			   AR=AR-AY0;
			   DM(I5,M4)=AR;
               CNTR=M-2;
			   DO wegt_lp1 UNTIL CE;
			   AR=DM(I2,M1);  
			   AY0=DM(I3,M1);  
			   AR=AR-AY0; 
			   AR=AR-8192;
wegt_lp1:      DM(I5,M4)=AR;
               AR=PI92-8192;
			   AY0=DM(I3,M1);
			   AR=AR-AY0;
			   DM(I5,M4)=AR;

⌨️ 快捷键说明

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