📄 lpc.dsp
字号:
*-------------------------------------------------------------*/
Az_lsp: M6 =0;
I4=^f1;
I5=^f2;
AX1=I1;
AY1=I2;
// CNTR=NC;
AF=PASS 0;
MY0=16384;
DM(I4,M6)=2048;
DM(I5,M6)=2048;
I6=^Chebps_11;
CNTR=NC;
DO coef_loop1 UNTIL CE;
MX0=DM(I1,M1);
MR=MX0 * MY0(SS),MX1=DM(I2,M2);
MR=MR+MX1*MY0(SS),AY0=DM(I4,M4);
IF MV AF=PASS 1;
AR=MR1-AY0;
IF AV AF=PASS 1;
MR=MX0 * MY0(SS),DM(I4,M6)=AR;
MR=MR-MX1*MY0(SS),AY0=DM(I5,M4);
IF MV AF=PASS 1;
AR=MR1+AY0;
IF AV AF=PASS 1;
coef_loop1: DM(I5,M6)=AR;
NONE=PASS AF;
IF EQ JUMP skip_f1f2;
I1=AX1;
I2=AY1;
I4=^f1;
I5=^f2;
// CNTR=NC;
MY0=8192;
I6=^Chebps_10;
DM(I4,M4)=1024;
DM(I5,M4)=1024;
MX0=DM(I1,M1);
CNTR=NC;
DO coef_loop2 UNTIL CE;
MR=MX0 * MY0(SS),MX1=DM(I2,M0);
MR=MR+MX1*MY0(SS),AY0=DM(I4,M4);
AR=MR1-AY0;
MR=MX0 * MY0(SS),DM(I4,M6)=AR;
MR=MR-MX1*MY0(SS),AY0=DM(I5,M4);
AR=MR1-AY0,MX0=DM(I1,M1);
coef_loop2: DM(I5,M6)=AR;
/*-------------------------------------------------------------*
* find the LSPs using the Chebichev pol. evaluation *
*-------------------------------------------------------------*/
skip_f1f2: I2=I0;
I1=^f1+1;
I4=^grid;
AR=PASS 0;
DM(nf)=AR;
DM(ip)=AR;
AF=PASS 0,MX0=PM(I4,M4);
CNTR=NC-2;
CALL (I6);
DM(ylow)=SR1;
Chebps_loop: AY0=M;
AX0=DM(nf);
NONE=AX0-AY0;
IF GE JUMP skip_Chebps;
AX1=GRID_POINTS;
NONE=AF-AX1;
IF GE JUMP skip_Chebps;
CNTR=NC-2;
AR=DM(ylow);
DM(xhigh)=MX0;
DM(yhigh)=AR;
AF=AF+1,MX0=PM(I4,M4);
CALL (I6);
DM(ylow)=SR1;
MY0=DM(yhigh);
MR=SR1 * MY0(SS);
IF MV SAT MR;
AR=PASS MR1,AY0=MR0;
IF LT JUMP do_chebps;
NONE=MR1 OR AY0;
IF NE JUMP Chebps_loop;
{----------divide 2 times the interval---------------}
do_chebps: CNTR=2;
DO cal_lohi UNTIL CE;
SE=-1;
AR=DM(xhigh);
SR=ASHIFT AR (LO),AR=MX0;
SR=ASHIFT AR (LO),AY0=SR0;
AR=SR0+AY0,AX0=MX0;
MX0=AR;
CNTR=NC-2;
CALL (I6);
MY0=DM(ylow);
MR=SR1 * MY0(SS);
AR=PASS MR1,AY0=MR0;
IF LT JUMP hilo_exch;
NONE=MR1 OR AY0;
IF NE JUMP hilo_keep;
hilo_exch: DM(yhigh)=SR1;
DM(xhigh)=MX0;
JUMP cal_lohi;
hilo_keep: DM(ylow)=SR1;
AX0=MX0;
cal_lohi: MX0=AX0;
/*-------------------------------------------------------------*
* Linear interpolation *
* xint = xlow - ylow*(xhigh-xlow)/(yhigh-ylow); *
*-------------------------------------------------------------*/
AX1=DM(yhigh);
AY1=DM(ylow);
AR=AX1-AY1,AY0=MX0;
IF EQ JUMP line_inter;
AX0=DM(xhigh);
AR=AX0-AY0,AX0=AR;
AR=ABS AX0,MY0=AR;
SE=EXP AR(HI),MX1=AX0;
SR=NORM AR (LO),AX0=SE;
AR=PASS AF;
MR=0,AX1=AR;
MR0=H#3FFF;
CALL div_s;
AY0=-20;
AF=PASS AX1;
AR=AY0-AX0,SR0=AR;
MR=SR0 * MY0(SS),SE=AR;
SR=LSHIFT MR0 (LO);
SR=SR OR ASHIFT MR1 (HI);
AR=PASS SR0,AX0=MX1;
NONE=PASS AX0;
IF LT AR=-AR;
MY0=DM(ylow);
MR=AR * MY0(SS),AY0=MX0;
SR=LSHIFT MR0 BY -11(LO);
SR=SR OR ASHIFT MR1 BY -11(HI);
AR=AY0-SR0;
AY0=AR;
line_inter: AY1=DM(nf);
AR=AY1+1,MX0=AY0;
DM(nf)=AR;
AR=DM(ip);
AR=PASS AR,DM(I2,M1)=AY0;
IF NE JUMP first_coef;
AR=AR+1;
I1=^f2+1;
JUMP cal_chebps;
first_coef: AR=PASS 0;
I1=^f1+1;
cal_chebps: DM(ip)=AR;
CNTR=NC-2;
CALL (I6);
DM(ylow)=SR1;
JUMP Chebps_loop;
{-----------Check if M roots found----------}
skip_Chebps: NONE=AX0-AY0;
IF GE RTS;
CNTR=M;
DO copy_oldnew UNTIL CE;
AR=DM(I3,M1);
copy_oldnew: DM(I0,M1)=AR;
RTS;
/*********************************************************************
* Evaluates the Chebichev polynomial series *
* The polynomial order is *
* n = M/2 (M is the prediction order) *
* The polynomial is given by *
* C(x) = T_n(x) + f(1)T_n-1(x) + ... +f(n-1)T_1(x) + f(n)/2 *
* The value of C(x) is returned. (Saturated to +-1.99 in Q14) *
* $$01/10/2000 used only in encoder and decoder *
* Calling Parameters *
* AR : input value of evaluation; x = cos(frequency) in Q15*
* I1 : coefficients of the pol (f+1) *
* CNTR : order of the pol. (n-2) *
* Return Values *
* SR1 : output value *
* Altered Registers: MR,MF,SR,SE,AR,AX1,AY0,AY1,MX0,MX1,MY0,MY1,I1 *
* Computation Time : 18 cycles *
**********************************************************************/
Chebps_1x: SE=1;
SI=I1;
AY0=0;
MY1=4096;
MR=MX0 * MY0(SS),MX1=DM(I1,M1);
MR=MR+MX1*MY1(SS);
MX1=-32768;
SR=LSHIFT MR0 BY -1(LO);
DO chebps11_lp UNTIL CE;
AR=PASS 1,MY0=SR0;
MF=MX0 * MY0(SS),MY0=MR1;
MR=AR * MF(SS),AR=MR1;
MR=MR+MX0*MY0(SS),MY0=AY1;
SR=LSHIFT MR0 (LO),AX1=SR0;
SR=SR OR ASHIFT MR1(HI),AY1=AR;
MR0=SR0;
AR=PASS 1,MR1=SR1;
MR=MR+MX1*MY0(SS),MY0=AY0;
MR=MR-AR*MY0(SS),SR0=DM(I1,M1);
MR=MR+SR0*MY1(SS),AY0=AX1;
chebps11_lp: SR=LSHIFT MR0 BY -1(LO);
AR=PASS 1,MY0=SR0;
MF=MX0 * MY0(SS),MY0=MR1;
MR=AR * MF(SS);
MR=MR+MX0*MY0(SS),MY0=AY1;
MR=MR+MX1*MY0(SS),MY0=AY0;
MR=MR-AR*MY0(SS),SR0=DM(I1,M1);
I1=SI;
MY0=2048;
MR=MR+SR0*MY0(SS);
SE=EXP MR1(HI);
SE=EXP MR0(LO);
AR=SE;
RTS;
Chebps_11: AY1=256;
MY0=512;
CALL Chebps_1x;
AY0=6;
chebps_1c: AR=AR+AY0,SE=AY0;
IF LE JUMP shiftl_noav;
AR=H#8000;
NONE=PASS MR1;
IF GE AR=PASS H#7FFF;
SR1=AR;
RTS;
shiftl_noav: SR=LSHIFT MR0 (LO);
SR=SR OR ASHIFT MR1 (HI);
RTS;
/*********************************************************************
* Chebps_10 calculation equation *
* $$01/10/2000 used only in encoder and decoder *
* Calling Parameters *
* MX0 : input value of evaluation x = cos(frequency) in Q15 *
* I1 : coefficients of the pol (f+1) *
* CNTR : order of the pol. (n-2) *
* Return Values *
* SR1 : output value *
* Altered Registers: MR,MF,SR,SE,AR,AX1,AY0,AY1,MX0,MX1,MY0,MY1,I1 *
* Computation Time : 18 cycles *
**********************************************************************/
Chebps_10: AY1=128;
MY0=256;
CALL Chebps_1x;
AY0=7;
JUMP chebps_1c;
RTS;
/*****************************************************************
* Function Autocorr() *
* Compute autocorrelations of signal with windowing *
* $$01/10/2000 used only in encoder and decoder *
* $$01/11/2000 modify pointer and varaibles to adapt table change*
* Calling Parameters *
* I1 : Input signal *
* AY0 : LPC order *
* Return Values *
* I2 : Autocorrelations (lsb) *
* I3 : Autocorrelations (msb) *
* AR : Enc_expR0 *
* Altered Registers: MR,SR,SE,AR,AF,AY0,MX0,MY0,I0,I1,I2,I3,I4 *
* Computation Time : 18 cycles *
******************************************************************/
.ENTRY Autocorr;
.VAR/DM/RAM/SEG=App_DMbuf y[L_WINDOW];
Autocorr: I0=^y;
// CNTR=L_WINDOW;
I4=^hamwindow;
CNTR=L_WINDOW;
Do copy_corr UNTIL CE;
AR=PASS 1,MX0=DM(I1,M1),MY0=PM(I4,M4);
MR=MX0 * MY0(RND);
copy_corr: DM(I0,M1)=MR1;
/*-------Compute r[0] and test for overflow-------*/
exp_cal: MR1=0;
MR0=1;
I0=^y;
AF=PASS 0;
CNTR=L_WINDOW;
DO mac_sum UNTIL CE;
SR0=DM(I0,M1);
MR=MR+SR0*SR0(SS);
IF MV AF=AF+1;
mac_sum: IF MV SAT MR;
/*--------If overflow divide y[] by 4--------------*/
NONE=PASS AF;
IF EQ JUMP norm_sum;
I0=^y;
CNTR=L_WINDOW;
DO shr_sum UNTIL CE;
SR0=DM(I0,M0);
SR=ASHIFT SR0 BY -2(LO);
shr_sum: DM(I0,M1)=SR0;
AR=AR+4;
JUMP exp_cal;
/*--------Normalization of r[0]----------------------*/
norm_sum: I0=^y+1;
// CNTR=AY0;
SE=EXP MR1 (HI);
SE=EXP MR0 (LO);
CNTR=AY0;
SR=NORM MR0 (LO),AY0=SE;
SR=SR OR NORM MR1 (HI);
AF=AR+AY0,DM(I3,M1)=SR1;
SR=LSHIFT SR0 BY -1(LO);
AR=L_WINDOW-1;
DM(I2,M1)=SR0;
/*--------r[1] to r[m]-------------------------------*/
DO extract_hilo UNTIL CE;
MR=0;
I4=^y;
I1=I0;
CNTR=AR;
DO mac_hilo UNTIL CE;
MX0=DM(I4,M4);
MY0=DM(I1,M1);
mac_hilo: IF NOT MV MR=MR+MX0*MY0(SS);
IF MV SAT MR;
SR=NORM MR0 (LO),AY0=AR;
SR=SR OR NORM MR1 (HI);
AR=AY0-1,DM(I3,M1)=SR1;
SR=LSHIFT SR0 BY -1(LO);
DM(I2,M1)=SR0;
extract_hilo: MODIFY(I0,M1);
AR=PASS AF;
RTS;
/*********************************************************************
* Function Lag_window() *
* Lag_window on autocorrelations. *
* r[i] *= lag_wind[i] *
* r[i] and lag_wind[i] are in special double precision. *
* $$01/10/2000 used only in encoder and decoder *
* $$01/11/2000 modify pointer and varaibles to adapt table change *
* Calling Parameters *
* CNTR : LPC order (m-1) *
* I2 : Autocorrelations (msb+1) *
* I1 : Autocorrelations (lsb+1) *
* Return Values *
* Altered Registers: MR,MF,AR,MX0,MX1,MY0,MY1,I1,I2,I4,I5 *
* Computation Time : 18 cycles *
**********************************************************************/
.ENTRY Lag_window;
Lag_window: I4=^lag_l;
I5=^lag_h;
DO lag_loop UNTIL CE;
AR=PASS 1,MX1=DM(I2,M0),MY1=PM(I5,M4);
MR=MX1 * MY1(SS),MX0=DM(I1,M0),MY0=PM(I4,M4);
MF=MX0 * MY1(SS);
MR=MR+AR*MF(SS);
MF=MX1 * MY0(SS);
MR=MR+AR * MF(SS);
SR=LSHIFT MR0 BY -1(LO);
DM(I1,M1)=SR0;
lag_loop: DM(I2,M1)=MR1;
RTS;
/************************************************************************/
.ENDMOD;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -