📄 quantgain.dsp
字号:
/************************************************************************/
/* $$01/10/2000 checked Quagain 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 Quagain;
/************************************************************************/
#include "ld8a.inc"
#include "tab_ld8a.inc"
/************************************************************************/
/* Gain predictor, Past quantized energies = -14.0 in Q10 */
/* $$01/10/2000 static varaibles used in decoder frame speech process */
/************************************************************************/
.VAR/DM/RAM/SEG=App_DMmem Enc_pastqua_en[4];
.VAR/DM/RAM/SEG=App_DMmem tmp_m6, tmp_i6, alias_m7, alias_i7; //+sunny
/************************************************************************/
.EXTERNAL div_s;
.EXTERNAL Gain_update;
.EXTERNAL Gain_predict;
.EXTERNAL Enc_gcoeff_cs,Enc_exp_gcoeff_cs,tameflag;
/************************************************************************
* Function init the quantizer of gain *
* $$01/10/2000 used only in encoder *
* Calling Parameters *
* Return Values *
* Altered Registers: I1,M1 *
* Computation Time : 18 cycles *
*************************************************************************/
.ENTRY Init_QuantGain;
Init_QuantGain:
I1=^Enc_pastqua_en;
DM(I1,M1)=H#C800;
DM(I1,M1)=H#C800;
DM(I1,M1)=H#C800;
DM(I1,M1)=H#C800;
RTS;
/************************************************************************
* Function Qua_gain *
* $$01/10/2000 used only in encoder *
* $$01/11/2000 modify pointer and varaibles to adapt table change *
* Calling Parameters *
* I2 : Q13 Innovative vector. *
* Enc_gcoeff_cs: Correlations coefficents *
* Enc_exp_gcoeff_cs : Q-Format g_coeff[] *
* SI : Subframe length. *
* tameflag : set to 1 if taming is needed *
* Return Values *
* MR0 : Q14 Pitch gain. *
* MY1 : Q1 Code gain. *
* AR : Index of quantization. *
* Altered Registers: MR,SR,SE,AR,I0,AY0,MY0 *
* Computation Time : 18 cycles *
*************************************************************************/
.ENTRY Qua_gain;
.VAR/DM/RAM/SEG=App_DMbuf coeff[5], coeff_lsf[5];
.VAR/DM/RAM/SEG=App_DMbuf exp_min[5],best_gain[2];
.VAR/DM/RAM/SEG=App_DMtmp exp_gcode0,gcode0;
.VAR/DM/RAM/SEG=App_DMtmp gain_pitch,gain_code;
Qua_gain: //CNTR=SI;
/*---------------------------------------------------*
*- energy due to innovation -*
*- predicted energy -*
*- predicted codebook gain => gcode0[exp_gcode0] -*
*---------------------------------------------------*/
I1=^Enc_pastqua_en;
CNTR=SI;
CALL Gain_predict;
DM(gcode0)=SR0;
DM(exp_gcode0)=AR;
/*--------------------------------------------------------------*
* pre-selection *
* calculate best gain *
*--------------------------------------------------------------*/
M3=2;
I1=^Enc_gcoeff_cs;
I2=^Enc_exp_gcoeff_cs;
MX0=DM(I1,M3);
MY0=DM(I1,M3);
MR=MX0 * MY0(SS),AX0=DM(I2,M3);
AY0=DM(I2,M3);
AF=AX0+AY0,SR0=MR0;
AF=AF-1,AY0=DM(I2,M0);
AR=AY0+1,MX0=DM(I1,M0);
AR=AR+AY0,SR1=MR1;
MR=MX0 * MX0(SS);
AR=AF-AR,AX0=AR;
IF GT AR=-AR;
AR=AF-AX0,SE=AR;
IF LE JUMP quagain_br1;
SR=LSHIFT SR0(LO),AR=SR1;
SR=SR OR ASHIFT AR(HI);
AY0=SR0;
DIS AR_SAT;
AR=MR0-AY0,AY1=SR1;
ENA AR_SAT;
MR0=AR,AR=MR1-AY1+C-1;
AR=PASS AX0,MR1=AR;
JUMP quagain_comm1;
quagain_br1: AY0=SR0;
SR=LSHIFT MR0 (LO),AY1=SR1;
SR=SR OR ASHIFT MR1(HI);
DIS AR_SAT;
AR=AY0-SR0;
ENA AR_SAT;
MR0=AR,AR=AY1-SR1+C-1;
AR=PASS AF,MR1=AR;
quagain_comm1: SE=EXP MR1(HI);
SE=EXP MR0(LO);
SR=NORM MR0(LO),AY0=SE;
SR=SR OR NORM MR1(HI);
SR=ASHIFT SR1 BY 0(LO);
AR=AR-AY0;
AR=AR-16;
AX0=AR;
MR1=H#0000;
MR0=H#4000;
CALL div_s;
AY0=29;
AR=-AR;
AR=AY0-AX0,MY1=AR;
AX1=AR;
/*--------------------------------------------------------------*
* best_gain[0] = (2.*coeff[2]*coeff[1]-coeff[3]*coeff[4])*tmp *
*--------------------------------------------------------------*/
I1=^Enc_gcoeff_cs+1;
I2=^Enc_exp_gcoeff_cs+1;
MX0=DM(I1,M1);
MY0=DM(I1,M1);
MR=MX0 * MY0(SS),AX0=DM(I2,M1);
AY0=DM(I2,M1);
AF=AX0+AY0,SR0=MR0;
AY0=DM(I2,M1);
AR=AY0+1,SR1=MR1;
MX0=DM(I1,M1);
AY0=DM(I2,M1);
AR=AR+AY0,MY0=DM(I1,M1);
MR=MX0 * MY0(SS),AX0=AR;
AR=AF-AX0;
IF GT AR=-AR;
AR=AR-1;
AR=AF-AX0,SE=AR;
IF LE JUMP quagain_br2;
SR=LSHIFT SR0 (LO),AR=SR1;
SR=SR OR ASHIFT AR (HI);
AY0=SR0;
AY1=SR1;
SR=LSHIFT MR0 BY -1(LO);
SR=SR OR ASHIFT MR1 BY -1(HI);
DIS AR_SAT;
AR=AY0-SR0,AY0=AX0;
ENA AR_SAT;
MR0=AR,AR=AY1-SR1+C-1;
AR=AY0-1,MR1=AR;
JUMP quagain_comm2;
quagain_br2: AR=PASS SR1;
SR=LSHIFT SR0 BY -1(LO);
SR=SR OR ASHIFT AR BY -1(HI);
AY0=SR0;
SR=LSHIFT MR0(LO),AY1=SR1;
SR=SR OR ASHIFT MR1(HI);
DIS AR_SAT;
AR=AY0-SR0;
ENA AR_SAT;
MR0=AR,AR=AY1-SR1+C-1;
AR=AF-1,MR1=AR;
quagain_comm2: SE=EXP MR1(HI);
SE=EXP MR0(LO);
SR=NORM MR0(LO),AY0=SE;
SR=SR OR NORM MR1(HI);
MR=SR1 * MY1(SS);
AF=AR-AY0;
AR=AX1+AF,AY1=MR1;
AY0=40;
AR=AY0-AR;
AF=MR0 OR AY1,SE=AR;
IF EQ JUMP lacc_dto1;
NONE=PASS AR;
IF LE JUMP lacc_dto1;
SE=EXP MR1(HI);
SE=EXP MR0(LO);
AY1=SE;
AR=AR+AY1,SE=AR;
IF LE JUMP lacc_dto1;
SR1=H#7FFF;
NONE=PASS MR1;
IF GE JUMP quagain_con1;
SR1=H#8000;
JUMP quagain_con1;
lacc_dto1: SR=LSHIFT MR0 (LO);
SR=SR OR ASHIFT MR1(HI);
quagain_con1: AY0=DM(tameflag);
AF=AY0-1,AR=SR1;
IF NE JUMP no_change;
AY0=GPCLIP2;
AF=AR-AY0;
IF GT AR=PASS AY0;
/*--------------------------------------------------------------*
* best_gain[1] = (2.*coeff[0]*coeff[3]-coeff[1]*coeff[4])*tmp *
*--------------------------------------------------------------*/
no_change: DM(best_gain)=AR;
I1=^Enc_gcoeff_cs;
I2=^Enc_exp_gcoeff_cs;
MX0=DM(I1,M1);
MX1=DM(I1,M3);
MY0=DM(I1,M1);
MR=MX0 * MY0(SS),AX0=DM(I2,M1);
AY1=DM(I2,M3);
AR=AY1+1,AY0=DM(I2,M1);
MY0=DM(I1,M1);
AF=AX0+AY0,SR0=MR0;
MR=MX1 * MY0(SS),SR1=MR1;
AY0=DM(I2,M1);
AR=AR+AY0;
AR=AF-AR,AX0=AR;
IF GT AR=-AR;
AR=AR-1;
AR=AF-AX0,SE=AR;
IF LE JUMP quagain_br3;
SR=LSHIFT SR0(LO),AR=SR1;
SR=SR OR ASHIFT AR(HI);
AY0=SR0;
AY1=SR1;
SR=LSHIFT MR0 BY -1(LO);
SR=SR OR ASHIFT MR1 by -1(HI);
DIS AR_SAT;
AR=AY0-SR0,AY0=AX0;
ENA AR_SAT;
MR0=AR,AR=AY1-SR1+C-1;
AR=AY0-1,MR1=AR;
JUMP quagain_comm3;
quagain_br3: AR=PASS SR1;
SR=LSHIFT SR0 BY -1(LO);
SR=SR OR ASHIFT AR BY -1(HI);
AY0=SR0;
SR=LSHIFT MR0(LO),AY1=SR1;
SR=SR OR ASHIFT MR1(HI);
DIS AR_SAT;
AR=AY0-SR0;
ENA AR_SAT;
MR0=AR,AR=AY1-SR1+C-1;
AR=AF-1,MR1=AR;
quagain_comm3: SE=EXP MR1(HI);
SE=EXP MR0(LO);
SR=NORM MR0(LO),AY0=SE;
SR=SR OR NORm MR1(HI);
MR=SR1 * MY1(SS);
AF=AR-AY0;
AR=AX1+AF;
AY0=33;
AR=AY0-AR;
AF=MR0 OR AY1,SE=AR;
IF EQ JUMP lacc_dto2;
NONE=PASS AR;
IF LE JUMP lacc_dto2;
SE=EXP MR1(HI);
SE=EXP MR0(LO);
AY1=SE;
AR=AR+AY1,SE=AR;
IF LE JUMP lacc_dto2;
SR1=H#7FFF;
NONE=PASS MR1;
IF GE JUMP quagain_con2;
SR1=H#8000;
JUMP quagain_con2;
lacc_dto2: SR=LSHIFT MR0 (LO);
SR=SR OR ASHIFT MR1(HI);
quagain_con2: DM(best_gain+1)=SR1;
/*----------Change Q-format of gcode0 ( Q[exp_gcode0] -> Q4 )---*/
MR1=DM(gcode0);
AR=DM(exp_gcode0);
AR=AR-4;
IF LT JUMP no_expgain;
AR=-AR;
SE=AR;
SR=ASHIFT MR1(HI);
JUMP presearch_codebook;
no_expgain: AR=16-AR;
SE=AR;
SR=LSHIFT MR1 (LO);
SR=SR OR ASHIFT MR2(HI);
/*----------------------------------------------*
* - presearch for gain codebook - *
*----------------------------------------------*/
presearch_codebook:
I1=^best_gain;
MY1=SR1;
CALL Gbk_presel;
/*-----------------------------------------------*
* Find the best quantizer. *
*-----------------------------------------------*/
AY0=13;
I0=^exp_min;
I3=^Enc_exp_gcoeff_cs;
AX0=DM(I3,M1);
AR=AX0+AY0,AX0=DM(I3,M1);
AF=AX0+AY0,DM(I0,M1)=AR;
AY0=21;
MR0=DM(exp_gcode0);
SR=ASHIFT MR0 BY 1(LO);
AR=AF+1,AX0=DM(I3,M1);
AF=SR0-AY0,DM(I0,M1)=AR;
AR=AX0+AF,AX1=MR0;
AY1=3;
AX0=DM(I3,M1);
AF=AX1-AY1,DM(I0,M1)=AR;
AR=AX0+AF,AX0=DM(I3,M1);
AF=AF-1,DM(I0,M1)=AR;
AR=AX0+AF;
DM(I0,M1)=AR;
CNTR=4;
I3=^exp_min;
AR=DM(I3,M1);
DO find_minexp UNTIL CE;
AF=PASS AR,AY0=DM(I3,M1);
NONE=AY0-AR;
IF LT AF=PASS AY0;
find_minexp: AR=PASS AF;
/*----------align coeff[] and save in special----------*/
/*----------32 bit double precision--------------------*/
// CNTR=5;
I1=^coeff;
I3=^exp_min;
I2=^coeff_lsf;
I0=^Enc_gcoeff_cs;
CNTR=5;
DO align_coeff UNTIL CE;
AX0=DM(I3,M1);
AR=AF-AX0,SR1=DM(I0,M1);
SE=AR;
SR=ASHIFT SR1(HI);
DM(I1,M1)=SR1;
SR=LSHIFT SR0 BY -1(LO);
align_coeff: DM(I2,M1)=SR0;
/*----------Codebook search-------------*/
MX1=H#FFFF;
AY1=H#7FFF;
AX1=DM(gcode0);
CALL search_codbook;
/*-----------Read the quantized gain--------------------------*
* *gain_pit = gbk1[indice1][0] + gbk2[indice2][0]; *
*------------------------------------------------------------*/
read_quagain: MY0=DM(gcode0);
M5=M2;
M6=M3;
I5=^gbk11;
I6=^gbk21;
MODIFY(I5,M5);
MODIFY(I6,M6);
AX0=PM(I5,M5);
AY0=PM(I6,M6);
/*-----------------------------------------------------------*
* *gain_code = (gbk1[indice1][1]+gbk2[indice2][1]) * gcode0 *
*-----------------------------------------------------------*/
I5=^gbk12;
I6=^gbk22;
MODIFY(I5,M5);
MODIFY(I6,M6);
AR=AX0+AY0,SR0=PM(I5,M5);
DM(gain_pitch)=AR;
SR=ASHIFT SR0 BY 0(LO);
AF=PASS SR0,MR0=PM(I6,M6);
DIS AR_SAT;
AR=MR0+AF,AY1=SR1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -