📄 pitch_fr.asm
字号:
*****************************************************************************
** Description: pitch_fr() in pitch_fr.c
**
** Inputs
**
** 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
**
** Outputs:
**
** Pitch_frStare *st
** XAR6: Word16 *pit_frac
** AR7: Word16 ana_index
**
** Return value:
**
** AL: Word15 lag
**
** Attribute: Cycles: 46424 Pm: 140
**
** Modified Registers: all
**
** Programmer: Liu Yang
**
** Complete time: 2003 4 7
*****************************************************************************
.global _pitch_fr
.ref _norm_corr
.ref _searchfrac
.ref _getrange
.ref _enc_lag3
.ref _buffer1
.ref _buffer3
.ref T0_prev_subframe
.ref L_INTER_SRCH ; cnst 4
_pitch_fr:
ADDB SP,#16
MOVL *-SP[2],XAR2 ; *-SP[2] = &exc[0]
MOVL *-SP[4],XAR3 ; *-SP[4] = &xn[0]
MOVL *-SP[6],XAR4 ; *-SP[6] = &h[0]
MOVL *-SP[8],XAR6 ; *-SP[8] = *pit_frac
; Decide upon full or differential search
MOV *-SP[10],#1 ; *-SP[10] = delta_search = 1
; subframe 1
CMP @AR5,#0 ; if i_subfr == 0
SB B1,NEQ
MOV *-SP[10],#0 ; *-SP[10] = delta_search = 0
; AR1 = T_op[0]
MOV @AR2,#5 ; AR2 = delta_int_low = 5
MOV @AR3,#10 ; AR3 = delta_int_range = 10
LCR _getrange
SB B2,UNC
; subframe 2 3 and 4
B1: MOVL XAR0,#T0_prev_subframe ; XAR0 = #T0_prev_subframe
MOV AL,*XAR0 ; AL = T0_prev_subframe
MOV AR1,AL ; AR1 = T0_prev_subframe
MOV AR2,#5 ; AR2 = delta_frc_low = 5
MOV AR3,#9 ; AR3 = delta_frc_range = 9
LCR _getrange ; AR1 = t0_min, AR2 = t0_max
; Find interval to compute normalized correlation
B2: MOV *-SP[11],AR1 ; *-SP[11] = t0_min
MOV *-SP[12],AR2 ; *-SP[12] = t0_max
MOV AL,#L_INTER_SRCH ; AL = L_INTER_SRCH = 4
SUB @AR1,AL ; AR1 = t_min = t0_min - L_INTER_SRCH
ADD @AR2,AL ; AR2 = t_max = t0_max + L_INTER_SRCH
MOV @AR5,AR1 ; AR5 = t_min
MOV @AR6,AR2 ; AR6 = t_max
MOVL XAR1,*-SP[2] ; XAR1 = &exc[0]
MOVL XAR2,*-SP[6] ; XAR2 = &h[0]
MOVL XAR4,*-SP[4] ; XAR4 = &xn[0]
MOVL XAR7,#_buffer3+32 ; XAR7 = #_buffer3+32 = &corr[0] = &corr_v[-t_min]
; Compute normalized correlation between target and filtered excitation
LCR _norm_corr ; #_buffer3+32 = &corr[0]
; Find integer pitch
MOVL XAR5,#_buffer3+32 ; XAR5 = #_buffer3+32 = &corr[0]
MOV AR6,*-SP[11] ; AR6 = lag = t0_min
MOV @AR0,AR6 ; AR0 = t0_min
MOV AL,*+XAR5[AR0] ; AL = max = corr[t0_min]
INC AR0 ; AR0 = i = t0_min + 1
MOV AR7,*-SP[12] ; AR7 = t0_max
INC AR7 ; AR7 = t0_max + 1
L1: CMP AL,*+XAR5[AR0] ; if max <= corr[i]
SB B3,GT
MOV AL,*+XAR5[AR0] ; AL = max = corr[i]
MOV @AR6,AR0 ; AR6 = lag = i
B3: INC AR0 ; i++
BAR L1,AR0,AR7,NEQ ; if i <= t0_max loop
MOV *-SP[13],AR6 ; *-SP[13] = lag
; Find fractional pitch
MOVL XAR4,#_buffer3+32 ; XAR4 = &corr[0]
MOV AL,*-SP[10] ; AL = delta_search
; if delta_search == 0
SB B4,NEQ ;
CMP @AR6,#84 ; and if lag > max_frac_lag = 84
SB B4,LEQ
MOV *-SP[14],#0 ; *-SP[14] = frac = 0
MOV AL,@AR6 ; AL = lag
MOV @AR1,AL ; AR1 = lag
MOV AR2,#0 ; AR2 = frac = 0
SB B11,UNC
B4: CMP AL,#0 ; else if delta_search != 0
SB B5,EQ
MOVL XAR0,#T0_prev_subframe ; XAR0 = #T0_prev_subframe
MOV AR6,*XAR0 ; AR6 = tmp_lag = T0_prev_subframe
MOV AL,@AR6 ; AL = tmp_lag
MOV AR7,*-SP[11] ; AR7 = t0_min
SUB AL,@AR7 ; AL = tmp_lag - t0_min
CMP AL,#5 ; if tmp_lag - t0_min > 5
SB B6,LEQ
MOV AL,@AR7 ; AL = t0_min
ADD AL,#5 ; AL = tmp_lag = t0_min + 5
MOV @AR6,AL ; AR6 = tmp_lag
B6: MOV AR7,*-SP[12] ; AR7 = t0_max
MOV AL,@AR7 ; AL = t0_max
SUB AL,@AR6 ; AL = t0_max - tmp_lag
MOV AH,*-SP[13] ; AH = lag
CMP AL,#4 ; if t0_max - tmp_lag > 4
SB B7,LEQ
MOV AL,@AR7 ; AL = t0_max
SUB AL,#4 ; AL = tmp_lag = t0_max - 4
MOV @AR6,AL ; AR6 = tmp_lag
B7: CMP AH,@AR6 ; if lag == tmp_lag
SB B8,EQ
MOV AL,@AR6 ; AL = tmp_lag
DEC AL ; AL = tmp_lag - 1
CMP AH,@AL ; if lag == tmp_lag - 1
SB B9,NEQ
B8: MOV @AR1,AH ; AR1 = lag
MOV AR2,#-2 ; AR2 = frac = -2
MOV AR3,#2 ; AR3 = last_frac = 2
LCR _searchfrac ; AR1 = lag, AR2 = frac
SB B11,UNC
B9: MOV AL,@AR6 ; AL = tmp_lag
SUB AL,#2 ; AL = tmp_lag - 2
CMP AH,@AL ; else if lag == tmp_lag - 2
SB B10,NEQ
MOV @AR1,AH ; AR1 = lag
MOV AR2,#0 ; AR2 = frac = 0
MOV AR3,#2 ; AR3 = last_frac = 2
LCR _searchfrac ; AR1 = lag, AR2 = frac
SB B11,UNC
B10: MOV AL,@AR6 ; AL = tmp_lag
INC @AL ; AL = tmp_lag + 1
CMP AH,@AL ; else if lag == tmp_lag + 1
SB B12,NEQ
MOV @AR1,AH ; AR1 = lag
MOV AR2,#-2 ; AR2 = frac = -2
MOV AR3,#0 ; AR3 = last_frac = 0
LCR _searchfrac ; AR1 = lag, AR2 = frac
SB B11,UNC
; No fractional search
B12: MOV @AR1,AH ; AR1 = lag
MOV AR2,#0 ; AR2 = frac = 0
SB B11,UNC
B5: MOV AL,*-SP[13] ; AL = lag
MOV @AR1,AL ; AR1 = lag
MOV AR2,#-2 ; AR2 = frac = first_frac = -2
MOV AR3,#2 ; AR3 = last_frac = 2
LCR _searchfrac ; AR1 = lag, AR2 = frac
; Encode pitch
B11: MOV *-SP[13],AR1 ; *-SP[13] = lag
MOV *-SP[14],AR2 ; *-SP[14] = frac
MOV AL,@AR1 ; AL = lag
MOV @AR0,AL ; AR0 = lag
MOV AL,@AR2 ; AL = frac
MOV @AR1,AL ; AR1 = frac
MOVL XAR7,#T0_prev_subframe ; XAR7 = #T0_prev_subframe
MOV AL,*XAR7 ; AL = T0_prev_subframe
MOV @AR2,AL ; AR2 = T0_prev_subframe
MOV AL,*-SP[11] ; AL = t0_min
MOV @AR3,AL ; AR3 = t0_min
MOV AL,*-SP[12] ; AL = t0_max
MOV @AR4,AL ; AR4 = t0_max
MOV AL,*-SP[10] ; AL = delta_search
MOV @AR5,AL ; AR5 = delta_search
; Encode with 1/3 subsample resolution
LCR _enc_lag3 ; AR7 = ana_index
; Update state variables
MOVL XAR0,#T0_prev_subframe ; XAR0 = #T0_prev_subframe
MOV AL,*-SP[13] ; AL = lag
MOV *XAR0,AL ; T0_prev_subframe = lag
; Update output variables
MOVL XAR6,*-SP[8] ; XAR0 = *pit_frac
MOV AL,*-SP[14] ; AL = frac
MOV *XAR6,AL ; *pit_frac = frac
MOV AL,*-SP[13] ; AL = lag
SUBB SP,#16
LRETR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -