📄 pitch_ol.asm
字号:
***************************************************************************
** Description: pitch_ol() in pitch_ol.c
**
** Inputs
**
** XAR1: Word16 &signal
**
** Outputs:
**
** Return value:
**
** AL: Word16 p_max1
**
** Attribute: Cycles: 377726 Pm: 78
**
** Modified Registers: all
**
** Programmer: Liu Yang
**
** Complete time: 2003 3 21
*****************************************************************************
.global _pitch_ol
.ref _buffer1
.ref _buffer3
.ref _lag_max
.ref _comp_corr
_pitch_ol:
MOVL ACC,@XAR1 ; ACC = XAR1 = &signal
SUBB ACC,#143 ; ACC = &signal[-pit_max]
MOVL @XAR1,ACC ; XAR1 = &signal[-pit_max]
MOVL @XAR2,ACC ; XAR2 = &signal[-pit_max]
MOV @AR0,#302 ; AR0 = L_frame + pit_max - 1
ZAPA
RPT AR0 ; Repeat L_frame + pit_max times
||SQRA *XAR1++ ; PM = 1, ACC = t0 = L_mac (t0, signal[i], signal[i]);
ADDL ACC,P << PM ; Perform final accumulate, ACC = t0
MOVL @XAR1,ACC ; XAR1 = ACC = t0
; Scaling of input signal
MOVL XAR3,#_buffer3 ; Allocate scal_sig[]: &scal_sig = #_buffer3 + pit_max
; XAR3 = &scal_sig[-pit_max]
MOV AH,#0x7FFF ; ACC = MAX_32
MOV AL,#0xFFFF
CMPL ACC,@XAR1 ; if t0 = MAX_32
SB B1,GT
L1: MOV AL,*XAR2++ ; AL = *XAR1 = signal[i]
ASR AL,#3 ; AL = shr (signal[i], 3)
MOV *XAR3++,AL ; *XAR3 = AL = shr (signal[i], 3)
BANZ L1,AR0-- ; if AR0 != 0, loop and AR0--
SB B2,UNC ; else SB B2
B1: MOV AH,#0x0010 ; ACC = 2^20
MOV AL,#0x0000
CMPL ACC,@XAR1 ; else if t0 < 2^20
SB B3,LT
L2: MOV AL,*XAR2++ ; AL = *XAR1 = signal[i]
LSL AL,#3 ; AL = shl (signal[i], 3)
MOV *XAR3++,AL ; *XAR3 = AL = shl (signal[i], 3)
BANZ L2,AR0-- ; if AR0 != 0, loop and AR0--
SB B2,UNC ; else SB B2
B3: ; else
L3: MOV AL,*XAR2++ ; AL = *XAR1 = signal[i]
MOV *XAR3++,AL ; *XAR3 = AL = shl (signal[i], 3)
BANZ L3,AR0-- ; if AR0 != 0, loop and AR0--
; Calculate all coreelations of scal_sig, from pit_min to pit_max
B2: MOVL XAR3,#_buffer3+700 ; Allocate corr[]: &corr = #_buffer3+700
MOV ACC,#286 ; ACC = 2 * pit_max
ADDL @XAR3,ACC ; XAR3 = &corr[pit_max]
MOV @AR0,#143 ; AR0 = pit_max
MOV @AR1,#160 ; AR1 = L_frame
MOVL XAR2,#_buffer3+143 ; XAR2 = &scal_sig
MOV @AR4,#20 ; AR4 = pit_min
LCR _comp_corr
MOVL XAR1,#_buffer3+700+286 ; XAR1 = &corr[pit_max]
MOVL XAR2,#_buffer3+143 ; XAR2 = &scal_sig
MOV @AR3,#143 ; AR3 = pit_max
MOV @AR4,#80 ; AR4 = 4 * pit_min
MOVL XAR5,#_buffer1 ; XAR5 = &max1 = #_buffer1
LCR _lag_max
PUSH AL ; PUSH AL = p_max1
MOV @AR3,#79 ; AR3 = 4 * pit_min - 1
MOV @AR4,#40 ; AR4 = 2 * pit_min
ADDB XAR5,#1 ; XAR5 = &max2 = #_buffer1 + 1
LCR _lag_max
PUSH AL ; PUSH AL = p_max2
MOV @AR3,#39 ; AR3 = 2 * pit_min - 1
MOV @AR4,#20 ; AR4 = pit_min
ADDB XAR5,#1 ; XAR5 = &max2 = #_buffer1 + 2
LCR _lag_max
MOV @AR3,AL ; AR3 = AL = p_max3
POP AR2 ; AR2 = p_max2
POP AR1 ; AR1 = p_max1
MOV @AR4,*(0:_buffer1) ; AR4 = max1
MOV @AR5,*(0:_buffer1+1) ; AR5 = max2
MOV @AR6,*(0:_buffer1+2) ; AR6 = max3
MOV T,#27853 ; T = THRESHOLD = 27853
MPY P,T,AR4 ; P = max1 * THRESHOLD
MOVH AR0,P ; AR0 = PH << 1: Get upper 16 bits
MOV ACC,@AR0 ; AL = mult (max1, THRESHOLD) = 2 * max1 * THRESHOLD
CMP AL,@AR5 ; if mult (max1, THRESHOLD) < max2
SB B4,GEQ
MOV @AR1,AR2
MOV @AR4,AR5
B4: MPY P,T,AR4 ; P = max1 * THRESHOLD
MOVH AR0,P ; AR0 = PH << 1: Get upper 16 bits
MOV ACC,@AR0 ; AL = mult (max1, THRESHOLD) = 2 * max1 * THRESHOLD
CMP AL,@AR6 ; if mult (max1, THRESHOLD) < max3
SB B5,GEQ
MOV @AR1,AR3
B5: MOV AL,@AR1
LRETR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -