📄 quantlsp.dsp
字号:
I5=I4;
// CNTR=M;
I3=^buf;
MY0=CONST10;
CNTR=M;
DO wegt_lp2 UNTIL CE;
AR=PASS 0,SR0=DM(I3,M1);
AF=PASS SR0,SR1=AR;
IF GT JUMP wegt_lp2-1;
MR=SR0 * SR0(SS);
SR=LSHIFT MR0 BY 2(LO);
SR=SR OR ASHIFT MR1 BY 2(HI);
MR=SR1 * MY0(SS);
SR=LSHIFT MR0 BY 2(LO);
SR=SR OR ASHIFT MR1 BY 2(HI);
AR=SR1+2048;
wegt_lp2: DM(I5,M4)=AR;
I3=I4;
M3=4;
MY0=CONST12;
MODIFY(I3,M3);
AR=DM(I3,M1);
MR=AR * MY0(SS),AR=DM(I3,M2);
SR=LSHIFT MR0 BY 1(LO);
SR=SR OR ASHIFT MR1 BY 1(HI);
MR=AR * MY0(SS),DM(I3,M1)=SR1;
SR=LSHIFT MR0 BY 1(LO);
SR=SR OR ASHIFT MR1 BY 1(HI);
AR=PASS 0,DM(I3,M1)=SR1;
I5=I4;
CNTR=M;
DO find_max_wegt UNTIL CE;
AY0=DM(I5,M4);
NONE=AY0-AR;
IF GT AR=PASS AY0;
find_max_wegt: AR=PASS AR;
SE=EXP AR (HI);
I5=I4;
// CNTR=M;
AR=DM(I4,M4);
CNTR=M;
DO normal_wegt UNTIL CE;
SR=NORM AR (LO),AR=DM(I4,M4);
normal_wegt: DM(I5,M4)=SR0;
RTS;
/************************************************************************
* $$01/10/2000 used only in encoder *
* Calling Parameters *
* I1 : Q13 : target vector *
* I4 : Q13 : first stage lsp codebook *
* I5 : Q13 : second stage lsp codebook *
* Return Values *
* SR0 : selected codebook index *
* Altered Registers:MR,SR,AR,AF,AX0,AX1,AY0,AY1,MY0,I0,I1,I4,I5 *
* Computation Time : 18 cycles *
*************************************************************************/
lsp_select: SR0=0;
M5=M-NC;
DO lsp_selec2 UNTIL CE;
AX0=DM(I1,M1),AY0=PM(I4,M4);
AR=AX0-AY0;
lsp_selec2: AF=PASS 0,DM(I0,M1)=AR;
// CNTR=NC1;
AX1=H#FFFF;
AY1=H#7FFF;
CNTR=NC1;
DO find_dmin_lp2 UNTIL CE;
MR=0;
I0=M3;
I1=M6;
CNTR=M-NC;
DO sub_dist_lp2 UNTIL CE;
AX0=DM(I0,M1),AY0=PM(I5,M4);
AR=AX0-AY0,MY0=DM(I1,M1);
MF=AR * MY0(SS);
sub_dist_lp2: IF NOT MV MR=MR+AR*MF(SS);
IF MV SAT MR;
AY0=AX1;
MODIFY(I5,M5);
AR=MR0-AY0;
AR=MR1-AY1+C-1;
NONE=PASS AR;
IF GE JUMP find_dmin_lp2;
AR=PASS AF,AX1=MR0;
AY1=MR1;
SR0=AR;
find_dmin_lp2: AF=AF+1;
RTS;
Lsp_select_1: //CNTR=NC;
I0=^buf;
M3=^buf;
M6=^wegt;
CNTR=NC;
CALL lsp_select;
RTS;
/************************************************************************
* $$01/10/2000 used only in encoder *
* Calling Parameters *
* I1 : Q13 : target vector (+NC) *
* I4 : Q13 : first stage lsp codebook (+NC) *
* I5 : Q13 : second stage lsp codebook(+NC) *
* Return Values *
* SR0 : selected codebook index *
* Altered Registers: MR,SR,AR,AF,AX0,AY0,AY1,I1,I2,I4,I5 *
* Computation Time : 18 cycles *
************************************************************************/
Lsp_select_2: CNTR=M-NC;
I0=^buf+NC;
M3=^buf+NC;
M6=^wegt+NC;
CALL lsp_select;
RTS;
/************************************************************************
* reset encode weight filter coefficents *
* $$01/10/2000 used only in encoder *
* $$01/11/2000 move dm data table to pm data table *
* Calling Parameters *
* Return Values *
* Altered Registers: AR,I0,I5,M1,M4 *
* Computation Time : 18 cycles *
*************************************************************************/
.ENTRY Lsp_encw_reset;
Lsp_encw_reset:
// CNTR=MA_NP;
I0=^Enc_freq_prev;
I5=^freq_prev_reset;
CNTR=MA_NP;
DO ex_encreset UNTIL CE;
CNTR=M;
DO inx_encreset UNTIL CE;
AR=PM(I5,M4);
inx_encreset: DM(I0,M1)=AR;
ex_encreset: I5=^freq_prev_reset;
RTS;
/************************************************************************
* $$01/10/2000 used only in encoder *
* Calling Parameters *
* I1 : x[MA_NP][M]) *
* Return Values *
* Altered Registers: AR,I0,I1,M1 *
* Computation Time : 18 cycles *
*************************************************************************/
.ENTRY Get_freq_prev;
Get_freq_prev: I0=^Enc_freq_prev;
CNTR=MA_NP*M;
DO copy_freqprev UNTIL CE;
AR=DM(I0,M1);
copy_freqprev: DM(I1,M1)=AR;
RTS;
/************************************************************************
* $$01/10/2000 used only in encoder *
* Calling Parameters *
* I0 : x[MA_NP][M]) *
* Return Values *
* Altered Registers: AR,I0,I1,M1 *
* Computation Time : 18 cycles *
*************************************************************************/
.ENTRY Update_freq_prev;
Update_freq_prev:
I1=^Enc_freq_prev;
CNTR=MA_NP*M;
DO copy_prevfreq UNTIL CE;
AR=DM(I0,M1);
copy_prevfreq: DM(I1,M1)=AR;
RTS;
/************************************************************************
* $$01/10/2000 used only in encoder *
* Calling Parameters *
* I1 : Q27 distortion (lo) *
* Return Values *
* AR : the selected mode *
* Altered Registers: AR,AF,AX0,AY0,AX1,AY1,I1,M1 *
* Computation Time : 18 cycles *
*************************************************************************/
Lsp_last_select:
AX0=DM(I1,M1);
AX1=DM(I1,M1);
AR=PASS 0,AY0=DM(I1,M1);
AF=AY0-AX0,AY1=DM(I1,M1);
AF=AY1-AX1+C-1;
NONE=PASS AF;
IF LT AR=PASS 1;
RTS;
/************************************************************************
* $$01/10/2000 used only in encoder *
* Calling Parameters *
* I0 : norm: weight coef. *
* I1 : Q13 candidate LSP vector *
* I2 : Q13 target vector *
* I4 : Q15 present MA prediction coef. *
* MR : initial value set to zero *
* Return Values *
* MR1,MR0: Q27 distortion *
* Altered Registers: MR,SR,SE,AR,AY0,MY0,I1,I2,I4,I5 *
* Computation Time : 18 cycles *
*************************************************************************/
Lsp_get_tdist: SE=4;
CNTR=M;
DO get_tdist_lp UNTIL CE;
AX0=DM(I1,M1),MY0=PM(I4,M4);
AY0=DM(I2,M1);
AR=AX0-AY0,AX0=MR1;
MF=AR * MY0(SS),SR0=DM(I0,M1);
MR=SR0 * MF(SS),AY0=MR0;
SR=LSHIFT MR0 (LO),MR0=AY0;
SR=SR OR ASHIFT MR1(HI),MR1=AX0;
MR=MR+SR1*MF(SS);
get_tdist_lp: IF MV SAT MR;
RTS;
/************************************************************************
* $$01/10/2000 used only in encoder *
* Calling Parameters *
* I1 : Q13 : target vector *
* I4 : Q13 : first stage lsp codebook *
* Return Values *
* MX0 : selected codebook index *
* Altered Registers: MR,AR,AF,AY0,AY1,AX0,MX0,I0,I1,I4 *
* Computation Time : 18 cycles *
*************************************************************************/
Lsp_pre_select:
MX0=0;
// CNTR=NC0;
AF=PASS 0;
AX1=H#7FFF;
AY1=H#FFFF;
CNTR=NC0;
DO pre_select UNTIL CE;
MR=0;
I0=I1;
CNTR=M;
DO selec_inner UNTIL CE;
AX0=DM(I0,M1),AY0=PM(I4,M4);
AR=AX0-AY0;
selec_inner: IF NOT MV MR=MR+AR*AR(SS);
IF MV SAT MR;
AR=MR0-AY1,AY0=AX1;
AR=MR1-AY0+C-1;
NONE=PASS AR;
IF GE JUMP pre_select;
AR=PASS AF,AY1=MR0;
AX1=MR1;
MX0=AR;
pre_select: AF=AF+1;
RTS;
/************************************************************************/
.ENDMOD;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -