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