?? dtxcng.dsp
字號:
CNTR=SIZ_ACF-MP1;
DO shift_cng UNTIL CE;
AR=DM(I3,M2);
shift_cng: DM(I1,M2)=AR;
AR=DM(sh_Acf);
DM(sh_Acf+1)=AR;
I3=^Acf;
// CNTR=MP1;
AR=AX0+16;
AR=-AR;
DM(sh_Acf)=AR;
CNTR=MP1;
DO save_Acf UNTIL CE;
AX0=DM(I2,M1);
save_Acf: DM(I3,M1)=AX0;
AY1=DM(fr_cur);
AR=AY1+1;
DM(fr_cur)=AR;
AY1=NB_CURACF;
AR=AR-AY1;
IF NE RTS;
DM(fr_cur)=AR;
AR=PASS AY0;
IF NE CALL Update_sumAcf;
RTS;
/***************************************************************************
* Compute scaled autocorr of LPC coefficients used for Itakura distance *
* $$01/10/2000 checked Dtxmod module data variables and function *
* Calling Parameters: none *
* I0 : RCoeff data array pointer *
* AX0: Coeff data array pointer *
* Return Values : none *
* AR : sh_RCoeff value *
* Altered Registers: MR,SR,SE,AR,AF,MX0,MY0,I0,I1 *
* Computation Time : 18 cycles *
****************************************************************************/
.VAR/DM/RAM/SEG=App_DMtmp Coeff;
Calc_RCoeff: MR=0;
I2=AX0;
/*--------RCoeff[0] = SUM(j=0->M) Coeff[j]^2-----*/
CNTR=M+1;
DO mac_rcoeff UNTIL CE;
MX0=DM(I2,M1);
mac_rcoeff: IF NOT MV MR=MR+MX0*MX0(SS);
IF MV SAT MR;
/*---------Compute exponent RCoeff---------------*/
SE=EXP MR1 (HI),AY0=MR0;
SE=EXP MR0 (LO);
AR=MR1 OR AY0;
IF NE JUMP calc_zero;
SE=AR;
calc_zero: SR=NORM MR0 (LO),AY0=SE;
SR=SR OR NORM MR1 (HI);
AR=SR0+H#8000;
AR=SR1+C;
DM(I0,M1)=AR;
/*---------RCoeff[i] = SUM(j=0->M-i) Coeff[j] * Coeff[j+i]-----*/
AR=M;
I1=AX0;
// CNTR=M;
MODIFY(I1,M1);
CNTR=M;
DO round_coeff UNTIL CE;
MR=0;
I2=AX0;
I3=I1;
CNTR=AR;
DO round_in UNTIL CE;
AF=PASS AR,MX0=DM(I2,M1);
MY0=DM(I3,M1);
round_in: IF NOT MV MR=MR+MX0*MY0(SS);
IF MV SAT MR;
SR=NORM MR0 (LO);
SR=SR OR NORM MR1 (HI);
AR=SR0+H#8000;
AR=SR1+C,SR0=DM(I1,M1);
round_coeff: AR=AF-1,DM(I0,M1)=AR;
AR=-AY0;
RTS;
/****************************************************************************
* Compute Itakura distance and compare to threshold *
* $$01/10/2000 checked Dtxmod module data variables and function *
* Calling Parameters: none *
* MX1 : alpha of fraction *
* MY1 : Fraction of Threshold *
* Return Values *
* AF : return value *
* Altered Registers: SR,SE,AR,AF,MY0,AX0,AY0,AY1,I1,I2,I3,M3 *
* Computation Time : 18 cycles *
*****************************************************************************/
.VAR/DM/RAm/SEG=App_DMtmp sh[2];
Cmp_filt: M3=1;
AR=PASS 0;
DM(sh)=AR;
DM(sh+1)=AR;
AX0=1;
cmp_loop: I1=^curAcf;
I2=^RCoeff;
SE=DM(sh);
AF=PASS 0,AR=DM(I2,M1);
SR=LSHIFT AR (LO),AR=DM(I1,M1);
SE=DM(sh+1);
SR=LSHIFT AR (LO),MY0=SR0;
MR=SR0 * MY0(SS);
SR=LSHIFT MR0 BY -1(LO);
SR=SR OR ASHIFT MR1 BY -1(HI);
// CNTR=M;
MR1=SR1;
MR0=SR0;
CNTR=M;
DO cmp_loop1 UNTIL CE;
SE=DM(sh);
AR=DM(I2,M1);
SR=LSHIFT AR (LO),AR=DM(I1,M1);
SE=DM(sh+1);
SR=LSHIFT AR (HI),MY0=SR0;
MR=MR+AR*MY0(SS);
IF MV AF=AF+1;
cmp_loop1: IF MV SAT MR;
AF=PASS AF,SR0=MX1;
IF EQ JUMP exit_cmp;
I3=^sh;
MODIFY(I3,M3);
AY0=DM(I3,M0);
AR=AX0+AY0;
AY0=M3;
AR=AX0-AY0,DM(I3,M0)=AR;
M3=AR;
JUMP cmp_loop;
exit_cmp: AX0=DM(sh_RCoeff);
AY0=DM(sh);
AR=AX0-AY0,AY1=MX1;
AY0=DM(sh+1);
AR=AR-AY0,AX1=MR1;
AR=AR+9;
AF=PASS 0,SE=AR;
MR=MX1 * MY1(RND),AY0=MR0;
SR=ASHIFT SR0 BY 0(LO);
DIS AR_SAT;
AR=MR1+AY1,AY1=SR1;
ENA AR_SAT;
SR0=AR,AR=MR2+AY1+C;
SR=LSHIFT SR0 (LO);
SR=SR OR ASHIFT AR(HI);
DIS AR_SAT;
AR=AY0-SR0,AY1=AX1;
ENA AR_SAT;
AY0=AR,AR=AY1-SR1+C-1;
AR=PASS AR;
IF LT RTS;
AR=AR OR AY0;
IF EQ RTS;
AF=AF+1;
RTS;
/****************************************************************************
* Compute past average filter *
* $$01/10/2000 checked Dtxmod module data variables and function *
* Calling Parameters: none *
* Return Values : none *
* Altered Registers: MR,MF,SR,SE,AR,AF,MX0,MY0,AX0,AX1,AY0,AY1 *
* I0,I1,I2,I3,I4,I5 *
* Computation Time : 18 cycles *
*****************************************************************************/
.VAR/DM/RAM/SEG=App_DMbuf s_sumAcf[MP1];
.VAR/DM/RAM/SEG=App_DMbuf bid[M], zero[MP1];
Calc_pastfilt: I2=^sumAcf;
I3=^s_sumAcf;
I1=^sh_sumAcf;
AY0=NB_SUMACF;
CALL Calc_sum_acf;
I0=^pastCoeff;
AX0=DM(s_sumAcf);
AF=PASS AX0;
IF NE JUMP calc_next;
// CNTR=M;
DM(I0,M1)=4096;
CNTR=M;
DO zero_coeff UNTIL CE;
zero_coeff: DM(I0,M1)=0;
RTS;
calc_next: CNTR=MP1;
I0=^zero;
DO zero_one UNTIL CE;
zero_one: DM(I1,M1)=0;
I3=^s_sumAcf;
I2=^zero;
I0=^pastCoeff;
I1=^bid;
CALL Levinson;
RTS;
/****************************************************************************
* Update sumAcf array value *
* $$01/10/2000 checked Dtxmod module data variables and function *
* Calling Parameters: none *
* Return Values : none *
* Altered Registers: SR,SE,AR,AF,MX0,AX0,AY0,I0,I1,I2,I3,I4 *
* Computation Time : 18 cycles *
*****************************************************************************/
Update_sumAcf: //CNTR=SIZ_SUMACF-MP1;
I1=^sumAcf+SIZ_SUMACF-1;
I2=^sumAcf+SIZ_SUMACF-MP1-1;
CNTR=SIZ_SUMACF-MP1;
DO shift_sumAcf UNTIL CE;
AR=DM(I2,M2);
shift_sumAcf: DM(I1,M2)=AR;
AR=DM(sh_sumAcf+1);
DM(sh_sumAcf+2)=AR;
AR=DM(sh_sumAcf);
DM(sh_sumAcf+1)=AR;
I2=^Acf;
I1=^sh_Acf;
I3=^sumAcf;
AY0=NB_CURACF;
CALL Calc_sum_acf;
DM(sh_sumAcf)=AR;
RTS;
/****************************************************************************
* Compute sum of acfs (curAcf, sumAcf or s_sumAcf) *
* $$01/10/2000 checked Dtxmod module data variables and function *
* Calling Parameters *
* I1 : sh_acf data array pointer *
* I2 : Acf data array pointer *
* I5 : sum of Acf data array pointer *
* AY0 : number of bits to loop count *
* Return Values *
* AR : sh_sum return sum of sh_Acf energy array *
* Altered Registers: SR,SE,AR,AF,MX0,AX0,AY0,I0,I1,I2,I3,I4 *
* Computation Time : 18 cycles *
*****************************************************************************/
.VAR/DM/RAM/SEG=App_DMbuf L_tab[2*MP1];
Calc_sum_acf: //CNTR=2*MP1;
I4=^L_tab;
CNTR=2*MP1;
DO zero_tab UNTIL CE;
zero_tab: DM(I4,M4)=0;
I0=I1;
AX0=DM(I0,M1);
AR=AY0-1,MX0=AY0;
CNTR=AR;
DO change_sh0 UNTIL CE;
AY0=DM(I0,M1);
AF=AY0-AX0,AR=AX0;
IF LT AR=PASS AY0;
change_sh0: AX0=AR;
AY0=14;
// CNTR=MX0;
AR=AX0+AY0;
CNTR=MX0;
DO calc_sum_lp UNTIL CE;
AY0=DM(I1,M1);
AR=AR-AY0,AX0=AR;
SE=AR;
// CNTR=MP1;
I0=^L_tab;
CNTR=MP1;
DO calc_sum_in UNTIL CE;
AR=DM(I2,M1);
SR=ASHIFT AR (LO),AY0=DM(I0,M1);
DIS AR_SAT;
AR=SR0+AY0,AY0=DM(I0,M2);
ENA AR_SAT;
AF=SR1+AY0+C;
IF NOT AV JUMP calc_sum_in-1;
AR=PASS H#0000;
AF=PASS AF;
IF NEG AR=AR-1;
AR=PASS AF,DM(I0,M1)=AR;
calc_sum_in: DM(I0,M1)=AR;
calc_sum_lp: AR=PASS AX0;
// CNTR=M+1;
I1=^L_tab;
AR=DM(I1,M1);
AF=PASS AR,SR0=DM(I1,M2);
AF=SR0 OR AF,SE=SR0;
CNTR=M+1;
IF EQ JUMP zero_exp;
SE=EXP SR0 (HI);
SE=EXP AR (LO);
zero_exp: DO sum_loop UNTIL CE;
AR=DM(I1,M1);
SR=NORM AR (LO),AR=DM(I1,M1);
SR=SR OR NORM AR (HI),AY0=SE;
sum_loop: AR=AX0-AY0,DM(I3,M1)=SR1;
AR=AR-16;
RTS;
/*****************************************************************************/
.ENDMOD;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -