📄 calcexc.dsp
字号:
/************************************************************************/
/* $$01/10/2000 checked Calcexc module data 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 Calcexc;
/************************************************************************/
#include "ld8a.inc"
#include "dtx.inc"
/************************************************************************/
.EXTERNAL flag_cod;
.EXTERNAL Sqrt;
.EXTERNAL Gauss;
.EXTERNAL Random;
.EXTERNAL Inv_sqrt;
.EXTERNAL Pred_lt_3;
.EXTERNAL update_exc_err;
/************************************************************************
* Comfort Noise excitation for SID and not-transmitted frames *
* $$01/10/2000 used both in encoder and decoder *
* Calling Parameters *
* AX0 : target sample gain *
* MX0 : current Vad decision *
* flag_cod : encoder/decoder flag *
* Return Values *
* I1 : excitation array *
* Altered Registers: MR,SR,AR,I0,I1,I2,I3,AX0,MY0 *
* Computation Time : 18 cycles *
*************************************************************************/
.ENTRY Calc_exc_rand;
.VAR/DM/RAM/SEG=App_DMbuf sign[4],position[4];
.VAR/DM/RAM/SEG=App_DMbuf excg[L_SUBFR],excs[L_SUBFR];
.VAR/DM/RAM/SEG=App_DMtmp inter_exc,cur_exc;
.VAR/DM/RAM/SEG=App_DMtmp Inter,sh,frac,Gp,Gp2;
.VAR/DM/RAM/SEG=App_DMtmp seed,cur_gain,subfr_ind;
Calc_exc_rand: DM(seed)=MX0;
DM(cur_gain)=AX0;
AR=PASS 0;
NONE=PASS AX0;
IF NE JUMP calc_exc_loop;
CNTR=L_FRAME;
DO zero_exc UNTIL CE;
zero_exc: DM(I1,M1)=AR;
AY0=DM(flag_cod);
AR=PASS AY0,MY0=AR;
IF EQ RTS;
CNTR=NUM_OF_FRAME;
DO update_exc UNTIL CE;
AY0=L_SUBFR+1;
CALL update_exc_err;
update_exc: MY0=0;
RTS;
{------Loop on subframes--------------------------}
calc_exc_loop: DM(cur_exc)=I1;
DM(subfr_ind)=AR;
{------generate codebook parameters---------------}
I2=^position;
I3=^sign;
CALL gen_codebook;
{------Generate gaussian excitation---------------}
I1=^excg;
CALL gen_guassgain;
{------generate random adaptive excitation-------}
SR1=DM(Inter);
SR0=DM(frac);
CNTR=L_SUBFR;
I1=DM(cur_exc);
CALL Pred_lt_3;
{------Compute adaptive+gaussian exc->cur_exc-----}
I1=^excg;
I2=DM(cur_exc);
CALL gen_adapgain;
{------Compute fixed code gain--------------------}
I1=^excs;
I3=^sign;
I2=^position;
CALL gen_fixgain;
{------Update cur_exc with ACELP excitation-------}
I3=^sign;
I2=^position;
CALL update_excit;
{------specially for codec processing,update excitation-------}
AR=DM(flag_cod);
AR=PASS AR;
IF EQ JUMP calc_exc_con;
MY0=DM(Gp);
AY0=DM(Inter);
CALL update_exc_err;
calc_exc_con: M3=L_SUBFR;
MX0=DM(seed);
I1=DM(cur_exc);
MODIFY(I1,M3);
AY0=L_SUBFR;
AR=DM(subfr_ind);
AR=AR+AY0;
AY0=L_FRAME;
NONE=AR-AY0;
IF LT JUMP calc_exc_loop;
RTS;
/************************************************************************
* generate random adaptive codebook & fixed codebook parameters *
* $$01/10/2000 used both in encoder and decoder *
* Calling Parameters *
* I2 : positon of codebook *
* I3 : sign of codebook *
* MX0 : nose gererate seed *
* Return Values *
* Altered Registers: AX0,AY0,AY1,AR,MR,SR *
* Computation Time : 18 cycles *
*************************************************************************/
gen_codebook: MY1=2;
CALL Random;
AY0=H#0003;
AF=AR AND AY0,SR0=AR;
AR=AF-1;
AF=AR-2;
IF EQ AR=PASS 0;
DM(frac)=AR;
SR=LSHIFT SR0 BY -2(LO);
AY0=H#003F;
AR=SR0 AND AY0;
AY0=40;
AR=AR+AY0;
DM(Inter)=AR;
AY1=H#0007;
SR=LSHIFT SR0 BY -6(LO);
AR=SR0 AND AY1;
MR=AR * MY1(SS),AY0=AR;
AR=MR0+AY0;
AF=PASS H#0001;
SR=LSHIFT SR0 BY -3(LO);
AR=SR0 AND AF,DM(I2,M1)=AR;
SR=LSHIFT SR0 BY -1(LO);
AR=SR0 AND AY1,DM(I3,M1)=AR;
MR=AR * MY1(SS),AY0=AR;
AR=MR0+AY0;
AR=AR+1;
SR=LSHIFT SR0 BY -3(LO);
AR=SR0 AND AF,DM(I2,M1)=AR;
DM(I3,M1)=AR;
CALL Random;
AR=AR AND AY1,SR0=AR;
MR=AR * MY1(SS),AY0=AR;
AR=MR0+AY0;
AR=AR+2;
SR=LSHIFT SR0 BY -3(LO);
AR=SR0 AND AF,DM(I2,M1)=AR;
SR=LSHIFT SR0 BY -1(LO);
AR=SR0 AND AF,DM(I3,M1)=AR;
AR=AR+3;
AY0=H#000F;
AR=SR0 AND AY0,DM(I2,M0)=AR;
AX1=SR0;
SR=LSHIFT AR BY -1(LO);
AR=SR0 AND AY1;
MR=AR * MY1(SS),AY0=AR;
AR=MR0+AY0,AY0=DM(I2,M0);
AR=AR+AY0,SR0=AX1;
SR=LSHIFT SR0 BY -4(LO);
AR=SR0 AND AF,DM(I2,M1)=AR;
DM(I3,M1)=AR;
CALL Random;
AY0=H#1FFF;
AR=AR AND AY0;
DM(Gp)=AR;
SR=LSHIFT AR BY 1(LO);
DM(Gp2)=SR0;
RTS;
/************************************************************************
* Compute fixed code gain *
* Solve EQ(X) = 4 X**2 + 2 b X + c *
* $$01/10/2000 used both in encoder and decoder *
* Calling Parameters *
* I1 : gain excitation *
* I3 : gain excitation sign *
* I2 : gain excitation position *
* AY1 : calculated gain *
* Return Values *
* MR0 : LSW of data *
* MR1 : MSW of data *
* Altered Registers: SR0,AR,AX0,AX1,AY0,AY1,I2,I3,M0,M1 *
* Computation Time : 18 cycles *
*************************************************************************/
gen_fixgain: MR=0;
AY0=I1;
CNTR=L_SUBFR;
DO mac_exc_lp UNTIL CE;
AR=DM(I1,M1);
mac_exc_lp: IF NOT MV MR=MR+AR*AR(SS);
IF MV SAT MR;
{------------inter_exc = b >> sh--------------}
AX1=0;
CNTR=4;
DO bique_loop UNTIL CE;
AX0=DM(I2,M1);
AR=AX0+AY0,SR0=DM(I3,M1);
I1=AR;
AY1=DM(I1,M1);
AR=AX1+AY1;
NONE=PASS SR0;
IF EQ AR=AX1-AY1;
bique_loop: AX1=AR;
SR=ASHIFT AR BY -1(LO);
DM(inter_exc)=SR0;
/*---------Compute k = cur_gainR x cur_gainR x L_SUBFR---------*/
AY0=DM(sh);
MX0=L_SUBFR;
MY0=DM(cur_gain);
AR=AY0+1,AY1=MR1;
DM(sh)=AR;
AR=AR+AY0,AY0=MR0;
AR=-AR;
MR=MX0 * MY0(SS),SE=AR;
SR=LSHIFT MR0 BY -6(LO);
SR=SR OR ASHIFT MR1 BY -6(HI);
MR=SR0*MY0(SS);
SR=LSHIFT MR0 BY -1(LO);
SR=LSHIFT MR0 (LO),MX0=SR0;
SR=SR OR ASHIFT MR1 (HI);
DIS AR_SAT;
AR=SR0-AY0,MX1=MR1;
ENA AR_SAT;
MR0=AR,AR=SR1-AY1+C-1;
MR1=AR;
IF NOT AV JUMP calc_noav0;
AR=PASS MR1;
AR=H#0000;
IF GE AR=AR-1;
MR0=AR;
{----------Compute delta = b^2 - 4 c----------------}
calc_noav0: AR=DM(inter_exc);
MR=MR+AR*AR(SS);
{----------inter_exc = b x 2^(-sh)------------------}
{----------L_acc = delta x 2^(-2sh+1)---------------}
AR=PASS MR1;
IF GE RTS;
{----------adaptive excitation = 0------------------}
I1=^excg;
// CNTR=L_SUBFR;
I2=DM(cur_exc);
CNTR=L_SUBFR;
DO double_exc UNTIL CE;
AR=DM(I1,M1);
double_exc: DM(I2,M1)=AR;
AY1=^excg;
ENA AR_SAT;
I3=^position;
AX1=DM(I3,M1);
AR=AX1+AY1,AX1=DM(I3,M1);
I2=AR;
AR=AX1+AY1,AX0=DM(I2,M1);
I2=AR;
AR=ABS AX0,AX1=DM(I2,M1);
AR=ABS AX1,AY0=AR;
AF=AR OR AY0,AX1=DM(I3,M1);
AR=AX1+AY1,AX1=DM(I3,M1);
I2=AR;
AR=AX1+AY1,AX0=DM(I2,M1);
I2=AR;
AR=ABS AX0,AX1=DM(I2,M1);
AR=ABS AX1,AX0=AR;
AF=AX0 OR AF;
AR=AR OR AF;
AF=AR AND H#4000;
AR=1;
IF NE AR=AR+1;
DM(sh)=AR;
AR=-AR;
// CNTR=4;
I3=^sign;
I2=^position;
AY1=^excg;
AF=PASS 0,SE=AR;
CNTR=4;
DO inter_exc_lp UNTIL CE;
AX1=DM(I2,M1);
AR=AX1+AY1;
I0=AR;
SR0=DM(I0,M0);
SR=ASHIFT SR0 (LO),AX1=DM(I3,M1);
AR=AF-SR0;
NONE=PASS AX1;
IF NE AR=SR0+AF;
inter_exc_lp: AF=PASS AR;
MY0=K0;
SR0=DM(sh);
DM(inter_exc)=AR;
SR=ASHIFT SR0 BY 1(LO);
AR=1-SR0;
AR=PASS 1,SE=AR;
MF=MX0 * MY0(SS);
MR=AR * MF(SS);
MR=MR+MX1*MY0(SS);
SR=LSHIFT MR0 (LO);
SR=SR OR ASHIFT MR1 (HI);
AR=PASS 0,MR0=SR0;
DM(Gp)=AR;
AR=PASS AF,MR1=SR1;
MR=MR+AR*AR(SS);
RTS;
/************************************************************************
* compute adaptive + gaussian exc -> cur_exc *
* $$01/10/2000 used both in encoder and decoder *
* Calling Parameters *
* I1 : gain excitation *
* I2 : current excitation *
* Return Values *
* Altered Registers: SR0,AR,AX0,AX1,AY0,AY1,I2,I3,M0,M1 *
* Computation Time : 18 cycles *
*************************************************************************/
gen_adapgain: AF=PASS 0;
MY0=DM(Gp2);
// CNTR=L_SUBFR;
MX0=DM(I2,M0);
CNTR=L_SUBFR;
DO find_max UNTIL CE;
MR=MX0*MY0(RND),AY0=DM(I1,M1);
AR=MR1+AY0;
AR=ABS AR,DM(I2,M1)=AR;
NONE=AR-AF;
IF GT AF=PASS AR;
find_max: AR=PASS AF,MX0=DM(I2,M0);
{------rescale cur_exc -> excs-----------}
NONE=PASS AR;
IF EQ JUMP comm_max;
SE=EXP AR (HI);
AX0=SE;
AR=AX0+3;
IF LE AR=PASS 0;
comm_max: DM(sh)=AR;
AR=-AR;
SE=AR;
I1=^excs;
I2=DM(cur_exc);
// CNTR=L_SUBFR;
MR0=DM(I2,M1);
CNTR=L_SUBFR;
DO shr_exc_lp UNTIL CE;
SR=ASHIFT MR0 (LO),MR0=DM(I2,M1);
shr_exc_lp: DM(I1,M1)=SR0;
RTS;
/************************************************************************
* Generate gaussian excitation *
* $$01/10/2000 used both in encoder and decoder *
* Calling Parameters *
* I1 : gain excitation *
* Return Values *
* Altered Registers: SR0,AR,AX0,AX1,AY0,AY1,I2,I3,M0,M1 *
* Computation Time : 18 cycles *
*************************************************************************/
gen_guassgain: MR=0;
CNTR=L_SUBFR;
DO mac_calc_exc UNTIL CE;
AX0=MR0;
AX1=MR1;
CALL Gauss;
MR0=AX0;
MR1=AX1;
MR=MR+SR0*SR0(SS);
mac_calc_exc: DM(I1,M1)=SR0;
DM(seed)=MX0;
/***********************************************************
* Compute fact = alpha x cur_gain * sqrt(L_SUBFR / Eg) *
* with Eg = SUM(i=0->39) excg[i]^2 *
* and alpha = 0.5 *
* alpha x sqrt(L_SUBFR)/2 = 1 + FRAC1 *
************************************************************/
SR=LSHIFT MR0 BY -1(LO);
SR=SR OR ASHIFT MR1 BY -1 (HI);
MR0=SR0;
MR1=SR1;
CALL Inv_sqrt;
{-----cur_gain = cur_gainR << 3-------------}
AX0=14;
MY0=FRAC1;
MX0=DM(cur_gain);
MR=MX0*MY0(RND),AY0=MX0;
AR=MR1+AY0,MX0=SR1;
{----<=> alpha x cur_gainR x 2^2 x sqrt(L_SUBFR)--}
SR=LSHIFT SR0 BY -1(LO);
AR=PASS 1,MY0=AR;
MF=SR0 * MY0(SS);
MR=AR * MF(SS);
MR=MR+MX0*MY0(SS);
SE=EXP MR1 (HI);
SE=EXP MR0 (LO);
SR=NORM MR0 (LO),AY0=SE;
SR=SR OR NORM MR1 (HI);
AR=AX0+AY0,MY0=SR1;
SE=AR;
I1=^excg;
I2=^excg;
// CNTR=L_SUBFR;
MX0=DM(I1,M1);
CNTR=L_SUBFR;
DO shr_calc_exc UNTIL CE;
MR=MX0 * MY0(RND);
SR=ASHIFT MR1 (HI);
AR=SR0+H#8000;
AR=SR1+C,MX0=DM(I1,M1);
shr_calc_exc: DM(I2,M1)=AR;
RTS;
/************************************************************************
* Update cur_exc with ACELP excitation *
* $$01/10/2000 used both in encoder and decoder *
* Calling Parameters *
* I2 : gain excitation position *
* I3 : gain excitation sign *
* AY1 : calculated gain *
* Return Values *
* Altered Registers: SR0,AR,AX0,AX1,AY0,AY1,I2,I3,M0,M1 *
* Computation Time : 18 cycles *
************************************************************************/
update_excit: AY0=MR0;
AY1=MR1;
CALL Sqrt;
AX1=2;
AY0=DM(sh);
AR=AY0-AX1;
AY0=DM(inter_exc);
AR=AX0-AY0,SE=AR;
AR=AX0+AY0,AX0=AR;
AR=-AR;
AR=ABS AR,AY0=AR;
AF=ABS AX0,AX1=AR;
AF=AX1-AF,AR=AX0;
IF LT AR=PASS AY0;
SR=ASHIFT AR (HI);
AR=SR0+H#8000;
AR=SR1+C;
AY0=G_MAX;
IF LT JUMP check_max2;
NONE=AR-AY0;
IF GT AR=PASS AY0;
JUMP check_comm;
check_max2: NONE=AR+AY0;
IF LT AR=-AY0;
/*---------Update cur_exc with ACELP excitation----------*/
//check_comm: CNTR=4;
check_comm: AY1=AR;
AY0=DM(cur_exc);
CNTR=4;
DO twin_loop UNTIL CE;
AX0=DM(I2,M1);
AR=AX0+AY0;
I1=AR;
AX0=DM(I1,M0);
AR=AX0+AY1,AX1=DM(I3,M1);
NONE=PASS AX1;
IF EQ AR=AX0-AY1;
twin_loop: DM(I1,M1)=AR;
RTS;
/***************************************************************/
.ENDMOD;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -