📄 qua_gain.asm
字号:
;==========================================================================
; File Name
; ----------
; QUA_GAIN.ASM
;
; Brief Description of the Code:
; ------------------------------
; Quantize gain.
;
; Ref
; ------
; QUA_GAIN.C
;==========================================================================
; Function Qua_gain
;----------------------------------------------------------------------
; Word16 Qua_gain(
; Word16 code[], /* (i) Q13 :Innovative vector. */
; Word16 g_coeff[], /* (i) :Correlations <xn y1> -2<y1 y1> */
; /* <y2,y2>, -2<xn,y2>, 2<y1,y2> */
; Word16 exp_coeff[], /* (i) :Q-Format g_coeff[] */
; Word16 L_subfr, /* (i) :Subframe length. */
; Word16 *gain_pit, /* (o) Q14 :Pitch gain. */
; Word16 *gain_cod, /* (o) Q1 :Code gain. */
; Word16 tameflag /* (i) : set to 1 if taming is needed */
; )
;----------------------------------------------------------------------
; Constants : Addr_cn -> code
; Addr_g_coeff_cs -> g_coeff
; Addr_exp_g_coeff_cs -> exp_coeff
;
; Addr_gain_pit -> gain_pit
; Addr_gain_code -> gain_cod
; Addr_TempFlag -> &tameflag
;
; L_SUBFR = L_subfr
;
; Pointers : ptr_prev_qua_eng -> past_qua_en
;
; Return : AL = Qua_Gain
;----------------------------------------------------------------------
; Modified Registers : AR0, AR1, AR2, AR3, AR4, AR5, BRC, DP
;-----------------------------------------------------------------------
.mmregs
.include ..\include\const.h
.include ..\include\ld8amem.h
.include ..\include\tab_ld8a.h
.include ..\include\qua_gain.h
.text
.def Qua_gain
.ref Gain_predict
.ref Gbk_presel
.ref Gain_update
.asg "AR2", pG_coeff
.asg "AR3", pExp_coeff
.asg "AR4", pCoeff
.asg "AR5", pExp_min
.asg "AR2", pGbk1
.asg "AR3", pGbk2
Qua_gain:
CALL Gain_predict
LD #Addr_local_buf1, DP
STL A, gcode0
STL B, exp_gcode0
STM #0, BK
STM #2, AR0
STM #Addr_g_coeff_cs, AR2 ; pG_coeff -> g_coeff[0]
STM #Addr_exp_g_coeff_cs, AR3 ; pExp_coeff -> exp_coeff[0]
;-----------------------------------------------------------------
; tmp = -1./(4.*coeff[0]*coeff[2]-coeff[4]*coeff[4]);
;-----------------------------------------------------------------
LD *pG_coeff+0, T ; pG_coeff -> g_coeff[2]
MPY *pG_coeff+0, A ; pG_coeff -> g_coeff[4], A = L_tmp1
SQUR *pG_coeff-0, B ; pG_coeff -> g_coeff[2], B = L_tmp2
DST A, L_tmp1
DST B, L_tmp2
LD #1-2, A
ADD *pExp_coeff+0, A ; pExp_coeff -> exp_coeff[2]
ADD *pExp_coeff+0, A ; pExp_coeff -> exp_coeff[4], A = exp1
LD #1, B
ADD *pExp_coeff-0%, 1, B ; pExp_coeff -> exp_coeff[2], B = exp2
SUB B, A ; A = exp1 - exp2 , B = exp2
BC Else1, ALEQ
If1:
STL B, exp
NEG A
BC Rar0,AGT
ABS A,B
SUB #31,B
BC Comm0,BLT
LD L_tmp1,B
NOP
LD #0,A
XC 2,BLT
LD #-1,A
NOP
B Endm0
Rar0:
LD A,B
SUB #31,B
NOP
BC Comm0,BLT
LD L_tmp1,A
NOP
NOP
BC Ltm0,ALT
LD #0X7fff,16,A
OR #0xFFFF,A
B Endm0
Ltm0:
LD #0X8000,16,A
B Endm0
Comm0:
SFTA A, -1
STL A, shift
LD shift, ASM
DLD L_tmp1, A
XC 1, C
LD A, 1
LD A, ASM, A
LD A, ASM, A
Endm0:
BD Next1
DLD L_tmp2, B
SUB B, A ; A = L_tmp
Else1:
ADD A, B ; if (A <= 0) B = exp1
STL B, exp
NOP
BC Tarm11,AGT
ABS A,B
SUB #31,B
NOP
BC Comm11,BLT
LD L_tmp2,A
NOP
LD #0,B
XC 2,ALT
LD #-1,B
NOP
B Endm11
Tarm11:
LD A,B
SUB #31,B
NOP
BC Comm11,BLT
LD L_tmp2,B
NOP
NOP
BC Lt11,BLT
LD #0X7fff,16,B
OR #0xFFFF,B
B Endm11
Ltm11:
LD #0X8000,16,B
B Endm11
Comm11:
SFTA A, -1
STL A, shift
LD shift, ASM
DLD L_tmp2, B
XC 1, C
LD B, 1
LD B, ASM, B
LD B, ASM, B
Endm11:
DLD L_tmp1, A
SUB B, A ; A = L_tmp
Next1:
EXP A
NOP
LDM T, B
NORM A
STL A,-16, inv_denom
LD #4000h, 16, A
RPT #15-1
SUBC inv_denom, A
NEG A
STL A, inv_denom
ADD exp, B
SUB #14+15+16, B, A
NEG A
STL A, exp_inv_denom
;-----------------------------------------------------------------
; best_gain[0] = (2.*coeff[2]*coeff[1]-coeff[3]*coeff[4])*tmp;
;-----------------------------------------------------------------
LD *pG_coeff-, T ; pG_coeff -> g_coeff[1]
MPY *pG_coeff+0, A ; pG_coeff -> g_coeff[3], A = L_tmp1
LD *pG_coeff+, T ; pG_coeff -> g_coeff[4]
MPY *pG_coeff-, B ; pG_coeff -> g_coeff[3], B = L_tmp2
DST A, L_tmp1
DST B, L_tmp2
LD *pExp_coeff-, A ; pExp_coeff -> exp_coeff[1]
ADD *pExp_coeff+0, A ; pExp_coeff -> exp_coeff[3], A = exp1
LD #1, B
ADD *pExp_coeff+, B ; pExp_coeff -> exp_coeff[4]
ADD *pExp_coeff-, B ; pExp_coeff -> exp_coeff[3], B = exp2
SUB B, A ; A = exp1 - exp2 , B = exp2
BC Else2, ALEQ
If2:
SUB #1, B
STL B, exp
ADD #1, A
NEG A
NOP
BC Tar0,AGT
ABS A,B
SUB #31,B
NOP
BC Com0,BLT
LD L_tmp1,B
NOP
LD #0,A
XC 2,BLT
LD #-1,A
NOP
B End0
Tar0:
LD A,B
SUB #31,B
NOP
BC Com0,BLT
LD L_tmp1,A
NOP
NOP
BC Lt0,ALT
LD #0X7fff,16,A
OR #0xFFFF,A
B End0
Lt0:
LD #0X8000,16,A
B End0
Com0:
SFTA A, -1
STL A, shift
LD shift, ASM
DLD L_tmp1, A
XC 1, C
LD A, 1, A
LD A, ASM, A
LD A, ASM, A
End0:
BD Next2
DLD L_tmp2, B
SUB B, -1, A ; A = L_tmp
Else2:
ADD A, B ; if (A <= 0) B = exp1
SUB #1, B
STL B, exp
SUB #1, A
NOP
BC Tar11,AGT
ABS A,B
SUB #31,B
NOP
BC Com11,BLT
LD L_tmp2,B
NOP
NOP
XC 2,BLT
LD #-1,B
NOP
XC 1,BGEQ
LD #0,B
NOP
B End11
Tar11:
LD A,B
SUB #31,B
NOP
BC Com11,BLT
LD L_tmp2,B
NOP
NOP
BC Lt11,BLT
LD #0X7fff,16,B
OR #0xFFFF,B
B End11
Lt11:
LD #0X8000,16,B
B End11
Com11:
SFTA A, -1
STL A, shift
LD shift, ASM
DLD L_tmp2, B
XC 1, C
LD B, 1, B
LD B, ASM, B
LD B, ASM, B
End11:
DLD L_tmp1, A
LD A, -1, A
SUB B, A ; A = L_tmp
Next2:
EXP A
NOP
NORM A ; A = nume
LDM T, B
ADD exp, B
ADD exp_inv_denom, B
SUB #16+9+16-1, B
NEG B
SFTA B, -1
STL B, shift
LD shift, ASM
MPYA inv_denom
XC 1, C
LD B, 1, B
LD B, ASM, B
LD B, ASM, B
SAT B
STL B,-16,best_gain0
LD #Addr_TempFlag, DP
CMPM Addr_TempFlag, 1
LD #GPCLIP2, 16, A
SUB A, B
LD #Addr_local_buf1, DP
MAR *AR0+ ; AR0 = 3
XC 2, TC, C
STL A, -16,best_gain0
;-----------------------------------------------------------------
; best_gain[1] = (2.*coeff[0]*coeff[3]-coeff[1]*coeff[4])*tmp ;
;-----------------------------------------------------------------
LD *pG_coeff-0, T ; pG_coeff -> g_coeff[0]
MPY *pG_coeff+, A ; pG_coeff -> g_coeff[1], A = L_tmp1
LD *pG_coeff+0, T ; pG_coeff -> g_coeff[4]
MPY *pG_coeff, B ; pG_coeff -> g_coeff[4], B = L_tmp2
DST A, L_tmp1
DST B, L_tmp2
LD *pExp_coeff-0, A ; pExp_coeff -> exp_coeff[0]
ADD *pExp_coeff+, A ; pExp_coeff -> exp_coeff[1], A = exp1
LD #1, B
ADD *pExp_coeff+0, B ; pExp_coeff -> exp_coeff[4]
ADD *pExp_coeff, B ; pExp_coeff -> exp_coeff[4], B = exp2
SUB B, A ; A = exp1 - exp2 , B = exp2
BC Else3, ALEQ
If3:
SUB #1, B
STL B, exp
ADD #1, A
NEG A
NOP
BC Tar,AGT
ABS A,B
SUB #31,B
NOP
BC Com,BLT
LD L_tmp1,A
NOP
NOP
XC 2,ALT
LD #-1,A
XC 1,AGEQ
LD #0,A
B End
Tar:
LD A,B
SUB #31,B
NOP
BC Com,BLT
LD L_tmp1,A
NOP
NOP
BC Lt,ALT
LD #0X7fff,16,A
OR #0xFFFF,A
B End
Lt:
LD #0X8000,16,A
B End
Com:
SFTA A, -1
STL A, shift
LD shift, ASM
DLD L_tmp1, A
XC 1, C
LD A, 1, A
LD A, ASM, A
LD A, ASM, A
End:
BD Next3
DLD L_tmp2, B
SUB B, -1, A ; A = L_tmp
Else3:
ADD A, B ; if (A <= 0) B = exp1
SUB #1, B
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -