📄 gainpred.dsp
字号:
/****************************************************************************/
/* $$01/10/2000 checked gain predict 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 GainPred;
/****************************************************************************/
#include "ld8a.inc"
#include "tab_ld8a.inc"
/****************************************************************************/
.EXTERNAL Log2,Pow2;
/*****************************************************************************
* MA prediction performed on the innovation energy (in dB with mean removed) *
* $$01/10/2000 only used in encoder *
* $$01/11/2000 move dm data table to pm data table *
* $$01/11/2000 modify pointer and varaibles to adapt table change *
* Calling Parameters *
* I1 : Q10 Past quantized energies *
* I2 : Q13 Innovative vector. *
* CNTR : Subframe length. *
* Return Values *
* SR0 : Qxx Predicted codebook gain *
* AR : Q-Format(gcode0) *
* Altered Registers: MR,MF,SR,SE,AR,AF,AY0,MY0,I1,I2,I5 *
* Computation Time : 18 cycles *
******************************************************************************/
.ENTRY Gain_predict;
Gain_predict: MR=0;
/*---------------------------------------------*
* Energy coming from code *
*----------------------------------------------*/
DO sum_gain UNTIL CE;
AR=DM(I2,M1);
sum_gain: IF NOT MV MR=MR+AR*AR(SS);
IF MV SAT MR;
/*-----------------------------------------------------------------*
* Compute: means_ener - 10log10(ener_code/ L_sufr) *
* Note: mean_ener change from 36 dB to 30 dB because input/2 *
*-----------------------------------------------------------------*/
CALL Log2;
AR=PASS 1;
MY0=H#9FAC;
MR0=H#D300;
MR1=H#001F;
MF=SR0 * MY0(SS);
MR=MR+AR * MF(SS);
MR=MR+SR1*MY0(SS);
/*-----------------------------------------------------------------*
* Compute gcode0. *
* = Sum(i=0,3) pred[i]*past_qua_en[i] - ener_code + mean_ener *
*-----------------------------------------------------------------*/
SR=LSHIFT MR0 BY 10(LO);
SR=SR OR ASHIFT MR1 BY 10(HI);
MR0=SR0;
MR1=SR1;
// CNTR=4;
I5=^pred;
CNTR=4;
DO sum_pre_qua UNTIL CE;
MX0=DM(I1,M1),MY0=PM(I5,M4);
sum_pre_qua: IF NOT MV MR=MR+MX0*MY0(SS);
IF MV SAT MR;
/*---------------------------------------------------------*
* gcode0 = pow(10.0, gcode0/20) *
* = pow(2, 3.3219*gcode0/20) *
* = pow(2, 0.166*gcode0) *
*---------------------------------------------------------*/
AY0=14;
MY0=5439;
MR=MR1*MY0(SS);
SR=LSHIFT MR0 BY -8(LO);
SR=SR OR ASHIFT MR1 BY -8(HI);
AF=AY0-SR1,MR1=AY0;
SR=LSHIFT SR0 BY -1(LO);
MR0=SR0;
CALL Pow2;
AR=PASS AF;
RTS;
/****************************************************************************
* Function Gain_update is update table of past quantized energies *
* $$01/10/2000 only used in encoder *
* Calling Parameters *
* MR1 : Q13 gbk1[indice1][1]+gbk2[indice2][1] *
* MR0 : Q13 gbk1[indice1][1]+gbk2[indice2][1] *
* Return Values *
* I1 : Q10 Past quantized energies *
* Altered Registers: MR,SR,SE,AR,AF,AY0,MY0,I1,I5 *
* Computation Time : 18 cycles *
*****************************************************************************/
.ENTRY Gain_update;
Gain_update: CALL Log2;
AY0=13;
AF=SR1-AY0;
SR=ASHIFT SR0 BY 1(LO);
AR=SR1+AF;
SR=LSHIFT SR0 BY 13(LO);
SR=SR OR ASHIFT AR BY 13(HI);
MY0=24660;
MR=SR1*MY0(SS),SR0=DM(I1,M0);
DM(I1,M1)=MR1;
AR=DM(I1,M0);
DM(I1,M1)=SR0;
SR0=DM(I1,M0);
DM(I1,M1)=AR;
DM(I1,M1)=SR0;
RTS;
/****************************************************************************
* update table of past quantized energies (frame erasure) *
* $$01/10/2000 only used in decoder *
* Calling Parameters *
* I1 : Q10 Past quantized energies *
* Return Values *
* Altered Registers: MR,SR,SE,AR,AF,I1,I2,I5,AY0,AY1,MY0 *
* Computation Time : 18 cycles *
*****************************************************************************/
.ENTRY Gain_update_erasure;
Gain_update_erasure:
MR=0;
SE=0;
I2=I1;
CNTR=4;
DO add_gain UNTIL CE;
AR=DM(I2,M1);
SR=ASHIFT AR (LO),AY0=AR;
DIS AR_SAT;
AR=MR0+AY0,AY1=SR1;
ENA AR_SAT;
MR0=AR,AR=MR1+AY1+C;
IF NOT AV JUMP add_gain;
AR=PASS AR,MR1=AR;
AR=H#FFFF;
IF NEG AR=AR+1;
AR=PASS MR1,MR0=AR;
add_gain: MR1=AR;
SR=LSHIFT MR0 BY -2(LO);
SR=SR OR ASHIFT AR BY -2(HI);
AR=SR0-4096;
AY0=-14336;
AF=AR-AY0,SR0=DM(I1,M0);
IF LT AR=PASS AY0;
DM(I1,M1)=AR;
AR=DM(I1,M0);
DM(I1,M1)=SR0;
SR0=DM(I1,M0);
DM(I1,M1)=AR;
DM(I1,M1)=SR0;
RTS;
/****************************************************************************/
.ENDMOD;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -