📄 lpcfunc.dsp
字号:
/************************************************************************/
/* $$01/10/2000 checked Lpcfunc module data variables 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 Lpcfunc;
/************************************************************************/
#include "ld8a.inc"
#include "tab_ld8a.inc"
/************************************************************************
* Compute the LPC coefficients from lsp (order=10) *
* $$01/10/2000 used both in encoder and decoder *
* Calling Parameters *
* I1 : Q15 line spectral frequencies *
* Return Values *
* I0 : Q12 predictor coefficients (order = 10) *
* Altered Registers: MR,MF,SR,AR,AF,AX0,AX1,AY0,AY1,MX0,MY0 *
* I1,I2,I3,I4,I5 *
* Computation Time : 18 cycles *
*************************************************************************/
.ENTRY Lsp_Az;
.VAR/DM/RAM/SEG=App_DMtmp f1hi[6],f1lo[6];
.VAR/DM/RAM/SEG=App_DMtmp f2hi[6],f2lo[6];
Lsp_Az: SI=I1;
I2=^f1lo;
I3=^f1hi;
CALL Get_lsp_pol;
I1=SI;
I2=^f2lo;
I3=^f2hi;
MODIFY(I1,M1);
CALL Get_lsp_pol;
// CNTR=5;
I1=^f1lo+5;
I2=^f1hi+5;
I4=^f2lo+5;
I5=^f2hi+5;
CNTR=5;
DO Lsp_Az_lp1 UNTIL CE;
AX0=DM(I1,M2);
AX1=DM(I2,M2);
AY0=DM(I1,M1);
DIS AR_SAT;
AR=AX0+AY0,AY1=DM(I2,M1);
ENA AR_SAT;
SR0=AR,AR=AX1+AY1+C;
DM(I2,M2)=AR;
IF NOT AV JUMP lspaz_noav;
AR=PASS AR;
AR=H#0000;
IF NEG AR=AR-1;
SR0=AR;
lspaz_noav: DM(I1,M2)=SR0;
AX0=DM(I4,M7);
AX1=DM(I5,M7);
AY0=DM(I4,M4);
DIS AR_SAT;
AR=AX0-AY0,AY1=DM(I5,M4);
ENA AR_SAT;
SR0=AR,AR=AX1-AY1+C-1;
DM(I5,M7)=AR;
IF NOT AV JUMP Lsp_Az_lp1;
AR=PASS AR;
AR=H#0000;
IF GE AR=AR-1;
SR0=AR;
Lsp_Az_lp1: DM(I4,M7)=SR0;
M3=10;
I3=I0;
// CNTR=5;
DM(I0,M1)=4096;
MODIFY(I3,M3);
I1=^f1lo+1;
I2=^f1hi+1;
I4=^f2lo+1;
I5=^f2hi+1;
CNTR=5;
DO Lsp_Az_lp2 UNTIL CE;
AX0=DM(I1,M1);
AY0=DM(I4,M4);
AX1=DM(I2,M1);
DIS AR_SAT;
AR=AX0+AY0,AY1=DM(I5,M4);
ENA AR_SAT;
SR0=AR,AR=AX1+AY1+C;
IF NOT AV JUMP lspaz_noav2;
AR=PASS AR,SR1=AR;
AR=H#0000;
IF GE AR=AR-1;
AR=PASS SR1,SR0=AR;
lspaz_noav2: SR=LSHIFT SR0 BY -13(HI);
SR=SR OR ASHIFT AR BY 3(HI);
AR=SR0+H#8000;
AR=SR1+C;
DIS AR_SAT;
AR=AX0-AY0,DM(I0,M1)=AR;
ENA AR_SAT;
SR0=AR,AR=AX1-AY1+C-1;
IF NOT AV JUMP lspaz_noav3;
AR=PASS AR,SR1=AR;
AR=H#0000;
IF GE AR=AR-1;
AR=PASS SR1,SR0=AR;
lspaz_noav3: SR=LSHIFT SR0 BY -13(HI);
SR=SR OR ASHIFT AR BY 3(HI);
AR=SR0+H#8000;
AR=SR1+C;
Lsp_Az_lp2: DM(I3,M2)=AR;
RTS;
/************************************************************************
* procedure Get_lsp_pol: *
* Find the polynomial F1(z) or F2(z) from the LSPs *
* $$01/10/2000 used both in encoder and decoder *
* Calling Parameters *
* I1 : line spectral freq. (cosine domain) in Q15 *
* Return Values *
* I2,I3: the coefficients of F1 or F2 in Q24 *
* Altered Registers: MR,MF,SR,AR,AF,AX0,AX1,AY0,AY1,MX0,MY0 *
* I1,I2,I3,I4,I5 *
* Computation Time : 18 cycles *
*************************************************************************/
Get_lsp_pol: I4=I2;
I5=I3;
M6=0;
/*---------All computation in Q24-------*/
// CNTR=4;
MX0=512;
AF=PASS 2;
DM(I2,M1)=0X0000;
DM(I3,M1)=0X0100;
MR=0,MY0=DM(I1,M1);
MR=MR-MX0*MY0(SS),AR=DM(I1,M1);
DM(I2,M1)=MR0;
DM(I3,M1)=MR1;
CNTR=4;
DO lsp_pol_lp UNTIL CE;
MY0=DM(I1,M1);
AY0=DM(I4,M6);
AY1=DM(I5,M6);
AR=PASS AF,DM(I2,M0)=AY0;
M3=AR;
M5=AR;
AR=AF-1,DM(I3,M0)=AY1;
CNTR=AR;
DO lsp_pol_in UNTIL CE;
AX0=DM(I2,M2);
AR=PASS 1,SR0=DM(I2,M1);
SR=LSHIFT SR0 BY -1(LO);
MF=SR0 * MY0(SS),AX1=DM(I3,M2);
MR=AR * MF(SS),MX1=DM(I3,M1);
MR=MR+MX1*MY0(SS),AY0=DM(I4,M7);
SR=LSHIFT MR0 BY 1(LO);
SR=SR OR ASHIFT MR1 BY 1(HI);
DIS AR_SAT;
AR=AX0+AY0,AY1=DM(I5,M7);
ENA AR_SAT;
AY0=AR,AR=AX1+AY1+C;
AY1=AR;
IF NOT AV JUMP lsppol_noav1;
AR=H#0000;
NONE=PASS AY1;
IF GE AR=AR-1;
AY0=AR;
lsppol_noav1: DIS AR_SAT;
AR=AY0-SR0;
ENA AR_SAT;
SR0=AR,AR=AY1-SR1+C-1;
DM(I3,M2)=AR;
IF NOT AV JUMP lsp_pol_in;
AR=PASS AR;
AR=H#0000;
IF GE AR=AR-1;
SR0=AR;
lsp_pol_in: DM(I2,M2)=SR0;
MR0=DM(I2,M0);
MR1=DM(I3,M0);
MR=MR-MX0*MY0(SS),AR=DM(I1,M1);
AF=AF+1,DM(I2,M3)=MR0;
DM(I3,M3)=MR1;
MODIFY(I4,M5);
lsp_pol_lp: MODIFY(I5,M5);
RTS;
/************************************************************************
* Lsf_lsp Transformation lsf to lsp *
* Algorithm: *
* The transformation from lsp[i] to lsf[i] and lsf[i] to lsp[i] are *
* approximated by a look-up table and interpolation. *
* $$01/10/2000 used both in encoder and decoder *
* $$01/11/2000 move dm data table to pm data table *
* $$01/11/2000 modify pointer and varaibles to adapt table change *
* Calling Parameters *
* I1 : Q15 lsf[m] (range: 0.0<=val<=0.5) *
* CNTR : LPC order *
* Return Values *
* I0 : Q15 lsp[m] (range: -1<=val<1) *
* Altered Registers: MR,SR,AR,AX0,AY0,AY1,MY0,I0,I1,I5 *
* Computation Time : 18 cycles *
*************************************************************************/
.ENTRY Lsf_lsp;
Lsf_lsp: AY1=H#00FF;
DO Lsf_lsp_lp UNTIL CE;
AR=DM(I1,M1);
SR=LSHIFT AR BY -8(LO);
{---------lsp[i] = table[ind]+ ((table[ind+1]-table[ind])*offset)----}
M5=SR0;
I5=^table;
MODIFY(I5,M5);
AR=AR AND AY1,AY0=PM(I5,M4);
AX0=PM(I5,M4);
AR=AX0-AY0,MY0=AR;
MR=AR * MY0(SS);
SR=LSHIFT MR0 BY -9(LO);
SR=SR OR ASHIFT MR1 BY -9(HI);
AR=SR0+AY0;
Lsf_lsp_lp: DM(I0,M1)=AR;
RTS;
/************************************************************************
* Lsp_lsf Transformation lsp to lsf *
* $$01/10/2000 used both in encoder and decoder *
* $$01/11/2000 move dm data table to pm data table *
* $$01/11/2000 modify pointer and varaibles to adapt table change *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -