📄 quantlsp.dsp
字号:
/************************************************************************/
/* $$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 + -