📄 norm_corr.asm
字号:
***************************************************************************
** Description: norm_corr() in pitch_fr.c
**
** Inputs
**
** XAR1: Word16 &exc[0]
** XAR2: Word16 &h[0]
** XAR4: Word16 &xn[0]
** AR5: Word16 t_min
** AR6: Word16 t_max
** XAR7: Word32 &corr_norm[0]
**
** Outputs:
**
** Word16 &corr_norm[0]
**
** Return value:
**
**
** Attribute: Cycles: 45682 Pm: 91
**
** Modified Registers: all
**
** Programmer: Liu Yang
**
** Complete time: 2003 3 30
*****************************************************************************
.global _norm_corr
.ref _convolve
.ref _inv_sqrt
.ref _mpy_32_v_reg
.ref _buffer2
_norm_corr:
; Compute the filtered excitation for the first delay t_min
ADDB SP,#18
;BY SKIFF
MOV AH,#0
MOV AL,@AR5 ; ACC = AR5 = t_min
SUBL @XAR1,ACC ; XAR1 = &exc[-t_min] = &exc[k]
MOVL *-SP[2],XAR1 ; *-SP[2] = &exc[-t_min]
MOVL ACC,XAR2 ; ACC = XAR2 = &h
ADD ACC,#40 ; ACC = &h[L_subfr]
MOVL *-SP[4],ACC ; *-SP[4] = &h[L_subfr]
MOVL XAR3,#_buffer2 ; XAR3 = #_buffer2 = &excf[0]
MOVL *-SP[6],XAR4 ; *-SP[6] = &xn[0]
MOV *-SP[14],AR5 ; *-SP[14] = t_min
MOV *-SP[15],AR6 ; *-SP[15] = t_max
MOVL *-SP[8],XAR7 ; *-SP[8] = &corr_norm[0]
LCR _convolve
; Scale excf[] to avoid overflow
MOVL XAR1,#_buffer2+40 ; XAR1 = #_buffer2+40 = &scaled_excf[0]
MOV AR0,#39 ; AR0 = L_subfr - 1: j = 0
L1: MOV AL,*XAR3++ ; AL = *XAR3 = excf[j]
ASR AL,#2 ; AL = shr (excf[j], 2)
MOV *XAR1++,AL ; *XAR1 = AL = scaled_excf[j]
BANZ L1,AR0-- ; if j < L_subfr branch to L1, j++
;Compute 1/sqrt(energy of excf[])
MOVL XAR3,#_buffer2 ; XAR3 = #_buffer2 = &excf[0]
ZAPA
NOP
NOP
NOP
RPT #39 ; Repeat L_subfr times
||SQRA *XAR3++ ; ACC = s = L_mac (s, excf[j], excf[j])
ADDL ACC,P << PM ; Perform final accumulate
SUB ACC,#0x0800 << #15 ; if s <= 2^26
SB B1,GT
MOVL XAR0,#_buffer2
MOVL *-SP[10],XAR0 ; *-SP[10] = &s_excf[0] = &excf[0]
MOV *-SP[16],#3 ; *-SP[16] = h_fac = 15 - 12
MOV *-SP[17],#0 ; *-SP[17] = scaling = 0
SB B2,UNC
B1: MOVL XAR0,#_buffer2+40 ; else excf[] is divided by 2
MOVL *-SP[10],XAR0 ; *-SP[10] = &s_excf[0] = &scaled_excf[0]
MOV *-SP[16],#1 ; *-SP[16] = h_fac = 15 - 12 - 2
MOV *-SP[17],#2 ; *-SP[17] = scaling = 2
B2: MOVL ACC,*-SP[8] ; ACC = *-SP[8] = &corr_norm[0]
ADD ACC,*-SP[14] ; ACC = *-SP[8] + *-SP[14] = &corr_norm[t_min]
MOVL @XAR5,ACC ; XAR5 = ACC = &corr_norm[t_min]
MOV AL,*-SP[15] ; AL = *-SP[15] = t_max
SUB AL,*-SP[14] ; AL = t_max - t_min
MOV @AR6,AL ; AR6 = t_max - t_min
MOVL XAR2,*-SP[2] ; XAR2 = &exc[-t_min]
; Compute 1/sqrt(energy of excf[])
L3: MOVL *-SP[12],XAR2 ; *-SP[12] = &exc[k]
MOVL XAR1,*-SP[10] ; XAR1 = *-SP[10] = &s_excf[0]
ZAPA
NOP
NOP
NOP
RPT #39 ; Repeat L_subfr times
||SQRA *XAR1++ ; ACC = s = L_mac (s, s_excf[j], s_excf[j])
ADDL ACC,P << PM ; Perform final accumulate
LCR _inv_sqrt ; ACC = s = inv_sqrt (s)
MOV @AR1,AH ; AR1 = norm_h
LSR AL,#1
MOV @AR2,AL ; AR2 = norm_l
; Compute correlation between xn[] and excf[]
MOVL XAR3,*-SP[6] ; XAR3 = *-SP[6] = &xn[0]
MOVL XAR7,*-SP[10] ; XAR7 = *-SP[10] = &s_excf[0]
ZAPA
rpt #39
||MAC P,*XAR3++,*XAR7++ ; ACC = ACC + P << #1, P = *XAR3++ * *XAR7++
; ACC = s = L_mac (s, xn[j], s_excf[j])
ADDL ACC,P << PM ; Perform final accumulate
MOV @AR3,AH ; AR3 = corr_h
LSR AL,#1
MOV @AR4,AL ; AR4 = corr_l
; Normalize correlaion = correlation * (1/sqrt(energy))
LCR _mpy_32_v_reg ; ACC = s = Mpy_32 (corr_h, corr_l, norm_h, norm_l)
MOV *XAR5++,AL ; *XAR5 = corr_norm[i] = extract_h (L_shl (s, 16)), i++
; Modify the filtered excitation excf[] for the next iteration
CMP AR6,#0 ; if (sub (i, t_max) != 0)
SB B3,EQ
MOVL XAR3,@XAR7 ; XAR3 = &s_excf[L_subfr]
SUBB XAR3,#1 ; XAR3 = &s_excf[L_subfr - 1]
MOV AR1,#38 ; AR1 = L_subfr - 2
MOVL XAR2,*-SP[12] ; XAR2 = &exc[k]
MOVL XAR4,*-SP[4] ; XAR4 = &h[L_subfr]
SUBB XAR2,#1 ; k--
L2: MOV T,*XAR2 ; T = exc[k]
MPY P,T,*--XAR4 ; j--, P = exc[k] * h[j]
MOVL ACC,P << PM ; ACC = s = L_mult (exc[k], h[j])
MOV T,*-SP[16] ; T = h_fac
LSLL ACC,T ; ACC = s = L_shl (s, h_fac)
MOV AL,@AH ; ACC = extract_h (s)
ADD AL,*--XAR3 ; j--, AL = add (extract_h (s), s_excf[j - 1])
MOV *--XAR7,AL ; j--, *XAR7 = s_excf[j] = AL
BANZ L2,AR1--
SUBB XAR7,#1
MOV T,*-SP[17] ; T = scaling
MOV AL,*XAR2 ; AL = exc[k]
ASR AL,T ; AL = shr (exc[k], scaling)
MOV *XAR7,AL ; *XAR7 = s_excf[0] = AL
BANZ L3,AR6--
B3: SUBB SP,#18
LRETR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -