📄 lspgetq.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 + -