📄 qsidgain.dsp
字号:
/************************************************************************/
/* $$01/10/2000 checked Qsidgain 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 Qsidgain;
/************************************************************************/
#include "ld8a.inc"
#include "vad.inc"
#include "dtx.inc"
#include "tab_dtx.inc"
/************************************************************************/
.EXTERNAL Log2;
/************************************************************************
* Function Qua_Sidgain *
* $$01/10/2000 used only in encoder and decoder *
* Calling Parameters *
* I1 : array of energies *
* I2 : corresponding scaling factors *
* AY0 : number of energies or *
* Return Values *
* AR : decoded energies in dB *
* AX0 : SID gain quantization index *
* Altered Registers: MR,MF,SR,SE,AR,AF,AX0,AY0,AY1,MX0,MY0,MX1,MY1 *
* Computation Time : 18 cycles *
*************************************************************************/
.ENTRY Qua_Sidgain;
Qua_Sidgain: M5=AY0;
AR=PASS AY0;
IF NE JUMP Sidgain_con;
I5=^fact;
AR=DM(I1,M1);
SR=ASHIFT AR BY 0(LO);
AR=PASS SR1,SE=DM(I2,M1);
SR=LSHIFT SR0 (LO),MY0=PM(I5,M5);
SR=SR OR ASHIFT AR (HI);
AR=PASS 1,MX0=SR1;
SR=LSHIFT SR0 BY -1(LO);
MF=SR0 * MY0(SS);
MR=AR * MF(SS);
MR=MR+MX0*MY0(SS);
AY1=0;
JUMP Sidgain_com;
Sidgain_con: I0=I2;
AR=AY0-1,AX1=DM(I0,M1);
IF EQ JUMP find_ener+1;
CNTR=AR;
DO find_ener UNTIL CE;
AR=PASS AX1,AY0=DM(I0,M1);
NONE=AY0-AR;
IF LT AR=PASS AY0;
find_ener: AX1=AR;
I5=^marg;
MODIFY(I5,M5);
AR=AX1+16;
AY0=PM(I5,M5);
AF=AR-AY0;
// CNTR=M5;
AY0=H#0000;
AY1=H#0000;
CNTR=M5;
DO sum_ener UNTIL CE;
AX0=DM(I2,M1);
AR=AF-AX0,SR0=DM(I1,M1);
SE=AR;
SR=ASHIFT SR0(LO);
DIS AR_SAT;
AR=SR0+AY0;
ENA AR_SAT;
AY0=AR,AR=SR1+AY1+C;
AY1=AR;
IF NOT AV JUMP sum_ener;
AR=PASS AY1;
AR=H#0000;
IF GE AR=AR-1;
AY0=AR;
sum_ener: AR=PASS AY0;
I5=^fact;
MODIFY(I5,M5);
SR=LSHIFT AR BY -1(LO);
AR=PASS 1,MY0=PM(I5,M5);
MF=SR0 * MY0(SS);
MR=AR * MF(SS);
AR=PASS AF,MX0=AY1;
MR=MR+MX0*MY0(SS),AY1=AR;
Sidgain_com: CALL Quant_Energy;
RTS;
/************************************************************************
* $$01/10/2000 used only in encoder and decoder *
* Calling Parameters *
* MR0 : LSW of L_x Q0 Energy *
* MR1 : MSW of L_x Q0 Energy *
* AY1 : Exponent of the energy *
* Return Values *
* AR : quantized energy in dB *
* Altered Registers: MR,SR,SE,AR,AF,AX0,AY0,AY1,MY0,I0,M0,M1 *
* Computation Time : 18 cycles *
*************************************************************************/
Quant_Energy: CALL Log2;
MY0=1024;
I4=^Gain_thresh;
MR=SR0 * MY0(RND);
AR=SR1-AY1,AY0=MR1;
SR=LSHIFT AR BY 10(LO);
AR=SR0+AY0,AY1=PM(I4,M4);
AF=AR-AY1,AY0=PM(I4,M4);
IF GT JUMP great_65db;
AX0=0;
AR=-12;
RTS;
great_65db: AF=AR-AY0,AY1=PM(I4,M4);
IF LE JUMP less_14db;
AX0=31;
AR=66;
RTS;
less_14db: AF=AR-AY1,AY0=PM(I4,M4);
IF GT JUMP little_db;
MY0=24;
AY0=3401;
AR=AR+AY0;
MR=AR * MY0(SS);
AR=MR1;
AF=MR1-1;
IF LT AR=PASS 1;
AX0=AR;
SR=LSHIFT AR BY 2(LO);
AR=SR0-8;
RTS;
little_db: MY0=193;
AR=AR-AY0;
MR=AR * MY0(SS);
SR=LSHIFT MR0 BY -2(LO);
SR=SR OR ASHIFT MR1 BY -2(HI);
AY0=6;
AR=SR1-1;
NONE=AR-AY0;
IF LT AR=PASS AY0;
AX0=AR;
SR=LSHIFT AR BY 1(LO);
AR=SR0+4;
RTS;
/************************************************************************/
.ENDMOD;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -