📄 taming.dsp
字号:
/************************************************************************/
/* Taming functions. */
/* $$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*/
/* $$01/10/2001 checked taming module data variables and function */
/************************************************************************/
.MODULE/SEG=App_PM Taming;
#include "ld8a.inc"
#include "tab_ld8a.inc"
/************************************************************************/
/* $$01/10/2000 local static memory buffer used in module Taming */
/* $$01/10/2000 static varaibles used in decoder frame speech process */
/************************************************************************/
.VAR/DM/RAM/SEG=App_DMmem exc_err_hi[4];
.VAR/DM/RAM/SEG=App_DMmem exc_err_lo[4];
/*************************************************************************
* initialize excation errorance *
* $$01/10/2000 only used in encoder *
* Calling Parameters *
* Return Values *
* Altered Registers: I1,I2 *
* Computation Time : 18 cycles *
**************************************************************************/
.ENTRY Init_exc_err;
Init_exc_err: //CNTR=4;
I1=^exc_err_lo;
I2=^exc_err_hi;
CNTR=4;
DO Init_exc UNTIL CE;
DM(I1,M1)=0x4000;
Init_exc: DM(I2,M1)=0x0000;
RTS;
/*************************************************************************
* routine test_err - computes the accumulated potential error in the *
* adaptive codebook contribution *
* $$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 *
* MR1 : integer part of pitch delay *
* MR0 : fractional part of pitch delay *
* Return Values *
* AR : flag set to 1 if taming is necessary *
* Altered Registers: MR,SR,SE,AR,AF,I1,I2,I5,AX0,AY0,MY0,M3,M5 *
* Computation Time : 18 cycles *
*************************************************************************/
.ENTRY test_err;
test_err: AF=PASS MR0,AR=MR1;
IF GT AR=AR+1;
AY0=L_SUBFR+L_INTER10;
AR=AR-AY0,AX0=AR;
IF LT AR=PASS 0;
M5=AR;
I5=^tab_zone;
MODIFY(I5,M5);
AY0=L_INTER10 - 2;
AR=AX0+AY0,SR0=PM(I5,M4);
M5=AR;
I5=^tab_zone;
MODIFY(I5,M5);
AF=PASS SR0,SR1=PM(I5,M4);
M3=SR1;
I1=^exc_err_hi;
I2=^exc_err_lo;
MODIFY(I1,M3);
MODIFY(I2,M3);
AY0=H#FFFF;
AY1=H#FFFF;
find_maxloc: AX0=DM(I2,M2);
AX1=DM(I1,M2);
DIS AR_SAT;
AR=AX0-AY0,MX0=AY0;
ENA AR_SAT;
AY0=AR,AR=AX1-AY1+C-1;
NONE=PASS AR;
IF LT JUMP find_con;
NONE=AR OR AY0;
IF EQ JUMP find_con;
MX0=AX0;
AY1=AX1;
find_con: AF=AF-1,AY0=MX0;
NONE=AF-SR1;
IF GE JUMP find_maxloc;
AX0=THRESH_ERRLO;
AX1=THRESH_ERRHI;
DIS AR_SAT;
AR=AY0-AX0;
ENA AR_SAT;
AF=AY1-AX1+C-1,AX0=AR;
AR=1;
IF LT AR=PASS 0;
NONE=AX0 OR AF;
IF EQ AR=PASS 0;
RTS;
/************************************************************************
* routine update_exc_err - maintains the memory used to compute the *
* error function due to an adaptive codebook mismatch between encoder *
* and decoder *
* $$01/10/2000 only used in encoder *
* Calling Parameters *
* MY0 : pitch gain *
* AY0 : integer part of pitch delay *
* Return Values *
* Altered Registers: MR,MF,SR,AR,AF,AX0,AY0,AY1,MX0,MX1,MY0,I1,I2 *
* Computation Time : 18 cycles *
*************************************************************************/
.ENTRY update_exc_err;
update_exc_err:
AX0=L_SUBFR;
AR=AY0-AX0;
IF GE JUMP update_exc_2;
update_exc_1: I1=^exc_err_hi;
I2=^exc_err_lo;
AY1=H#FFFF;
AR=PASS 1,MR0=DM(I2,M1);
SR=ASHIFT MR0 BY -1(LO);
MF=SR0 * MY0(SS),SR0=DM(I1,M1);
MR=AR * MF(SS),AY0=AY1;
MR=MR+SR0*MY0(SS);
SR=LSHIFT MR0 BY 1(LO);
SR=SR OR ASHIFT MR1 BY 1(HI);
DIS AR_SAT;
AR=SR0+H#4000;
ENA AR_SAT;
SR0=AR,AR=SR1+C;
SR1=AR;
IF NOT AV JUMP longadd_0;
AR=H#0000;
AR=PASS SR1;
IF GE AR=AR-1;
SR0=AR;
longadd_0: AF=SR0-AY0;
AF=SR1-AY1+C-1;
NONE=PASS AF;
IF LT JUMP update_con1;
AY0=SR0;
AY1=SR1;
update_con1: AR=PASS 1,MR0=AY0;
SR=ASHIFT MR0 BY -1(LO);
MF=SR0 * MY0(SS),SR0=AY1;
MR=AR * MF(SS);
MR=MR+SR0*MY0(SS);
SR=LSHIFT MR0 BY 1(LO);
SR=SR OR ASHIFT MR1 BY 1(HI);
DIS AR_SAT;
AR=SR0+H#4000;
ENA AR_SAT;
SR0=AR,AR=SR1+C;
SR1=AR;
IF NOT AV JUMP longadd_1;
AR=H#0000;
AR=PASS SR1;
IF GE AR=AR-1;
SR0=AR;
longadd_1: AF=SR0-AY0;
AF=SR1-AY1+C-1;
NONE=PASS AF;
IF LT JUMP update_exc_3;
MX1=SR0;
AY1=SR1;
JUMP update_exc_3;
update_exc_2: AY1=^tab_zone;
AR=AR+AY1;
I5=AR;
AR=AY0-1,SR0=PM(I5,M5);
MX1=H#FFFF;
AR=AR+AY1,AY1=MX1;
I5=AR;
AF=PASS SR0,AX1=PM(I5,M5);
M3=SR0;
I1=^exc_err_hi;
I2=^exc_err_lo;
MODIFY(I1,M3);
MODIFY(I2,M3);
update_loop: AF=AF+1,AR=DM(I2,M1);
SR=LSHIFT AR BY -1(LO);
AR=PASS 1,MX0=DM(I1,M1);
MF=SR0 * MY0(SS),AY0=MX1;
MR=AR * MF(SS);
MR=MR+MX0*MY0(SS);
SR=LSHIFT MR0 BY 1(LO);
SR=SR OR ASHIFT MR1 BY 1(HI);
DIS AR_SAT;
AR=SR0+H#4000;
ENA AR_SAT;
SR0=AR,AR=SR1+C;
IF NOT AV JUMP longadd_2;
NONE=PASS AR;
AR=H#0000;
IF GE AR=AR-1;
AR=PASS AF,SR0=AR;
longadd_2: DIS AR_SAT;
AR=SR0-AY0,AX0=AR;
ENA AR_SAT;
AY0=AR,AR=AX0-AY1+C-1;
NONE=PASS AR;
IF LT JUMP update_con2;
NONE=AR OR AY0;
IF EQ JUMP update_con2;
MX1=SR0;
AY1=AX0;
update_con2: NONE=AX1-AF;
IF GE JUMP update_loop;
update_exc_3: M3=-2;
// CNTR=3;
I1=^exc_err_hi+2;
I2=^exc_err_lo+2;
CNTR=3;
DO copy_exc UNTIL CE;
AR=DM(I1,M1);
DM(I1,M3)=AR;
AR=DM(I2,M1);
copy_exc: DM(I2,M3)=AR;
DM(exc_err_lo)=MX1;
DM(exc_err_hi)=AY1;
RTS;
/************************************************************/
.ENDMOD;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -