📄 cl_ltp.asm
字号:
*****************************************************************************
** Description: cl_ltp() in cl_ltp.c
**
** Inputs
**
** _buffer1: Word16 frameOffset
** _buffer1+1: Word16 lsp_flag
** _buffer1+2: Word16 T0
** _buffer1+3: Word16 T0_frac
** _buffer1+4: Word16 gain_pit
** _buffer1+5: Word16 gp_limit
** _buffer1+6: Word16 g_coeff[0]
** ; _buffer1+6~_buffer1+9: g_coeff[0]~g_coeff[3]
** _buffer1+10: Word16 T_op[0]
** _buffer1+12: Word16 exc
** _buffer1+14: Word16 &xn[0]
** _buffer1+16: Word16 h1
** _buffer1+18: Word16 &res2[0]
** _buffer1+20: Word16 &xn2[0]
** _buffer1+22: Word16 &y1[0]
** _buffer1+24: Word16 anap
**
** Outputs:
**
** clLtpState *clSt
** tonStabState *tonSt
** _buffer2+12: Word16 exc
** _buffer2+18: Word16 &res2[0]
** _buffer2+20: Word16 &xn2[0]
** _buffer2+22: Word16 &y1[0]
** _buffer2+2: Word16 T0
** _buffer2+3: Word16 T0_frac
** _buffer2+4: Word16 gain_pit
** _buffer2+6: Word16 g_coeff[0]
** _buffer2+24: Word16 anap
** _buffer2+5: Word16 gp_limit
**
** Return value:
**
** AL:
**
** Attribute: Cycles: 153586 Pm: 69
**
** Modified Registers: all
**
** Programmer: Liu Yang
**
** Complete time: 2003 4
*****************************************************************************
.global _cl_ltp
.ref _pitch_fr
.ref _Pred_lt_3or6
.ref _convolve
.ref _g_pitch
.ref _check_gp_clipping
.ref _buffer1
.ref _buffer2
.ref GP_CLIP ; cnst = 15565
.ref gp
_cl_ltp:
; Closed-loop fractional pitch search
; To call _pitch_fr, get ready as:
; AR1: Word16 T_op[0]
; XAR2: Word16 &exc[0]
; XAR3: Word16 &xn[0]
; XAR4: Word16 &h[0]
; AR5: Word16 i_subfr
; XAR6: Word16 pit_frac
MOV @AR5,*(0:_buffer1) ; AR5 = frameOffset
MOV @AR1,*(0:_buffer1+10) ; AR1 = T_op[0]
MOVL XAR2,@_buffer1+12 ; XAR2 = exc
MOVL XAR3,@_buffer1+14 ; XAR3 = &xn[0]
MOVL XAR4,@_buffer1+16
;MOVL XAR2,@12 ; XAR2 = exc
;MOVL XAR3,@14 ; XAR3 = &xn[0]
;MOVL XAR4,@16 ; XAR4 = h1
MOVL XAR6,#_buffer1+3 ; XAR6 = T0_frac
LCR _pitch_fr ; AL = lag, AR7 = ana_index
MOV *(0:_buffer1+2),@AL ; T0 = lag
MOVL XAR0,@_buffer1+24 ; XAR0 = anap
MOV *XAR0++,AR7 ; *anap = ana_index, anap++
MOVL @_buffer1+24,XAR0 ; @_buffer1+24 = anap
MOV @AR7,*(0:_buffer1+2) ; AR7 = T0
MOV @AR6,*(0:_buffer1+3) ; AR6 = T0_frac
MOVL XAR0,@_buffer1+12 ; XAR0 = exc
LCR _Pred_lt_3or6
MOVL XAR1,@_buffer1+12 ; XAR1 = exc
MOVL XAR2,@_buffer1+16 ; XAR2 = h1
MOVL XAR3,@_buffer1+22 ; XAR3 = &y1[0]
LCR _convolve
MOV @AR0,#40 ; AR0 = L_subfr = 40
MOVL XAR1,@_buffer1+14 ; XAR1 = &xn[0]
MOVL XAR2,@_buffer1+22 ; XAR2 = &y1[0]
MOVL XAR3,#_buffer1+6 ; XAR3 = &g_coeff[0]
LCR _g_pitch ; AR1 = gain
MOV *(0:_buffer1+4),@AR1 ; gain_pit = gain
; Check if the pitch gain should be limit due to resonance in LPC filter
MOV AR0,#0 ; AR0 = gpc_flag = 0
MOV AL,#0x7FFF ; AL = MAX_16 = #0x7FFF
MOV *(0:_buffer1+5),@AL ; gp_limit = MAX_16
MOV AL,*(0:_buffer1+1) ; AL = lsp_flag
; if lsp_flag != 0
SB B1,EQ
CMP @AR1,#GP_CLIP ; and gain_pit > GP_CLIP
SB B1,LEQ
MOV @AR2,AR1 ; AR2 = gain_pit
MOVL XAR1,#gp ; XAR1 = #gp
LCR _check_gp_clipping ; AR6 = flag
MOV @AR0,AR6 ; AR0 = gpc_flag = flag
; Limit the gain to 0.85 to cope with bit errors in the decoder in a better way
B1: MOV @AL,*(0:_buffer1+4) ; AL = gain_pit
CMP AL,#13926 ; if gain_pit > 13926
SB B2,LEQ
MOV AL,#13926 ; AL = #13926
MOV *(0:_buffer1+4),@AL ; gain_pit = 13926
B2: CMP @AR0,#0 ; if gpc_flag != 0
SB B3,EQ
MOV AL,#GP_CLIP
MOV *(0:_buffer1+5),@AL ; gp_limit = GP_CLIP
; Update target vector und evaluate LTP residual
B3: MOV AR0,#39 ; AR0 = L_SUBFR - 1
MOV @T,*(0:_buffer1+4) ; T = gain_pit
MOVL XAR2,@_buffer1+12 ; XAR2 = exc
MOVL XAR3,@_buffer1+14 ; XAR3 = &xn[0]
MOVL XAR4,@_buffer1+18 ; XAR4 = &res2[0]
MOVL XAR5,@_buffer1+20 ; XAR5 = &xn2[0]
MOVL XAR7,@_buffer1+22 ; XAR7 = &y1[0]
L1: ZAPA
MPY P,T,*XAR7++ ; P = y1[i] * gain_pit, i++
ADDL ACC,P << Pm ; ACC = L_temp = L_mult(y1[i], gain_pit)
LSL ACC,#1 ; ACC = L_temp = L_shl(L_temp, 1)
MOV AR6,*XAR3++ ; AR6 = xn[i], i++
SUB @AR6,AH ; AR6 = sub(xn[i], extract_h(L_temp)
MOV AH,@AR6 ; AH = sub(xn[i], extract_h(L_temp)
MOV *XAR5++,AH ; xn2[i] = sub(xn[i], extract_h(L_temp)
ZAPA
MPY P,T,*XAR2++ ; P = exc[i] * gain_pit, i++
ADDL ACC,P << Pm ; ACC = L_temp = L_mult(exc[i], gain_pit)
LSL ACC,#1 ; ACC = L_temp = L_shl(L_temp, 1)
MOV AR6,*XAR4 ; AR6 = res2[i], i++
SUB @AR6,AH ; AR6 = sub(res2[i], extract_h(L_temp)
MOV AH,@AR6 ; AH = sub(res2[i], extract_h(L_temp)
MOV *XAR4++,AH ; xn2[i] = sub(res2[i], extract_h(L_temp)
BANZ L1,AR0--
LRETR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -