📄 lag_max.asm
字号:
***************************************************************************
** Description: lag_max() in pitch_ol.c
**
** Inputs
**
** XAR1: Word32 &corr[0] /* i : correlation vector. */
** XAR2: Word16 &scal_sig[0] /* i : scaled signal. */
** AR3: Word16 lag_max /* i : maximum lag */
** AR4: Word16 lag_min /* i : minimum lag */
** XAR5: Word16 &cor_max /* i,o : normalized correlation of selected lag */
**
** Outputs:
**
** XAR5: Word16 &cor_max
**
** Return value:
**
** AL: Word16 p_max
**
** Attribute: Cycles: depend on lag_max & lag_min Pm: 45
**
** Modified Registers: all
**
** Programmer: Liu Yang
**
** Complete time: 2003 3 18
*****************************************************************************
.global _lag_max
.ref _inv_sqrt
_lag_max:
; Compute max and p_max
MOV AH,#0x8000 ; XAR7 = max = MIN_32
MOVB AL,#0
MOVL @XAR7,ACC
CLRC TC
MOVL ACC,@XAR1 ; ACC = XAR1 = &corr[0]
SUB ACC,@AR3 << #1 ; ACC = *corr[-i], i = lag_max
MOVL @XAR0,ACC ; XAR0 = *corr[-i]
L1: MOVL ACC,*XAR0
CMPL ACC,XAR7 ; if corr[-i] - max >= 0
SB B1,LT
MOVL XAR7,*XAR0 ; XAR7 = max = corr[-i]
MOV @AR6,AR3 ; AR6 = p_max = i
B1: ADDB XAR0,#2 ; i = i - 1
DEC AR3
MOV AL,@AR3
CMP AL,@AR4 ; if AR3 = i >= AR4 = lag_min
SB L1,GEQ ; SB L1
; Compute energy
MOVL ACC,@XAR2 ; ACC = &scal_sig[0]
SUB ACC,@AR6 << #0 ; ACC = p = &scal_sig[-p_max]
MOVL @XAR4,ACC ; XAR4 = p
ZAPA
RPT #159 ; Repeat L_frame times
||SQRA *XAR4++ ; PM = 1, ACC = t0 = L_mac (t0, *p, *p);
ADDL ACC,P << PM ; Perform final accumulate, ACC = t0
; 1/sqrt(energy)
LCR _inv_sqrt ; ACC = t0 = inv_sqrt (t0)
; max = max/sqrt(energy)
MOV @AR0,AH ; AR0 = ener_h
LSR AL,#1
MOV @AR3,AL ; AR3 = ener_l
MOVL ACC,@XAR7 ; ACC = max
MOV T,@AH ; T = max_h
LSR AL,#1
MOV @AR4,AL ; AR4 = max_l
; ACC = t0 = mpy_32 (max_h,max_l,ener_h,ener_l)
ZAPA
MPY P,T,@AR0 ; P = max_h * ener_h
MPYA P,T,@AR3 ; ACC = P, P = max_h * ener_l
MOVH AR3,P ; AR4 = PH: get upper 16 bits
ADD ACC,AR3 << #1 ; Perform accumulate
MOV T,@AR4 ; T = max_l
MPY P,T,@AR0 ; P = max_l * ener_h
MOVH AR4,P ; AR4 = PH: get upper 16 bits
ADD ACC,AR4 << #1 ; Perform final accumulate
; ACC = t0
MOV *XAR5,AL ; &cor_max = extract_l(t0)
MOV AL,@AR6 ; AL = AR6 = p_max
LRETR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -