?? autocorr.asm
字號:
*****************************************************************************
** Description: Autocorr() in autocorr.c **
** **
** Inputs : **
** AR1---Word16 m : LPC order **
** *XAR2---XWord16 x[], : Input signal (L_WINDOW) **
** *XAR3---CONST Word16 wind[] : window for LPC analysis (L_WINDOW) **
** **
** Outputs: **
** *XAR4---Word16 r_h[] :Autocorrelations (msb) **
** *XAR5---Word16 r_l[] :Autocorrelations (lsb) **
** **
** Return value : AL : Word16 Autocorr **
** **
** Attribute : Cycles:13021 Pm: 59 **
** Modified Registers:AR0,AR1,XAR2,XAR3,XAR4,XAR5,XAR6,XAR7 **
** ACC,T,P **
** @buffer1--@buffer1+3 **
** @buffer3 **
** Programmer : ZHOU Bei (OK,MAR 10th,2003) **
*****************************************************************************
.global _autocorr
.ref L_WINDOW
.ref _buffer1
.ref _buffer3
_autocorr:
MOV AR0,#L_WINDOW-1 ; Set loop time
MOV @_buffer1+3,#7FFFh ; Get MAX_32
MOV @_buffer1+2,#0FFFFh
;PUSH XAR2 ; Temp save start addr of x[]
PUSH XAR4
MOVL XAR4,#_buffer3
_LOOP_67:
MOV T,*XAR3++ ; T=x[i]
MPY ACC,T,*XAR2++ ; ACC=x[i]*wind[i]
ADD ACC,#4000H ; Adjust num in ACC
LSL ACC,#1
MOV *XAR4++,AH ; Save hige 16bit without sign to y[i]
BANZ _LOOP_67,AR0-- ; Loop if AR0!=0
POP XAR4
;POP XAR2 ; Resume start addr of x[] (y[])
MOVL XAR2,#_buffer3
MOV @_buffer1,#0 ; overfl_shft=0
_LOOP_76:
ZAPA ; Clear ACC,P
PUSH XAR2 ; Temp save start addr of y[]
SETC OVM,SXM
; movl xar7, xar2
; mov ar6, #L_WINDOW-1
;a: mac p,*xar2++,*xar7++
; banz a, ar6--
RPT #L_WINDOW-1 ; Repeat SQRA L_WINDOW times
||SQRA *XAR2++ ; ACC = ACC + P<<1 ; P = (*XAR2++)^2
ADDL ACC,P << PM ; Perform final accumulate
POP XAR2 ; Resume start addr of y[]
CMPL ACC,@_buffer1+2 ; Compare ACC with MAX_32
SBF _LINE_102,NEQ ; Not EQ,to _LINE_102
; EQ,continue
ADD @_buffer1,#4 ; overfl_shft+4
PUSH XAR2 ; Temp save start addr of y[]
MOV AR0,#L_WINDOW-1 ; Set loop time
_LOOP_93:
MOV ACC,*XAR2 ; y[i]=y[i]>>2
ASR AL,#2
MOV *XAR2++,ACC
BANZ _LOOP_93,AR0--
POP XAR2 ; Resume start addr of y[]
SB _LOOP_76,UNC ; Jump to _LOOP_76
_LINE_102:
ADDB ACC,#1 ; To avoid all bit is zero
MOVB XAR3,#0 ; Initialize XAR3 to zero
nop
RPT #31 ; Repeat next operation 32 times
||NORM ACC,XAR3++ ; Normalize contents of ACC;Save norm time to AR3
MOV *XAR4++,AH ; Save MSB to r_h[0]
LSR AL,#1
MOV *XAR5++,AL ; Save LSB>>1 to r_l[0]
MOVB XAR6,#0 ; 0->AR6 for loop (m times)
_LOOP_112:
MOV ACC,#L_WINDOW-1
INC AR6
SUB ACC,AR6
MOV AR0,AL ;RPT times=#L_WINDOW-AR6
PUSH XAR2
MOVL ACC,XAR2 ;Save start addr y[AR6] to XAR7
ADD ACC,AR6
MOVL XAR7,ACC
ZAPA
NOP
NOP
rpt ar0
||mac p,*xar2++,*xar7++
ADDL ACC,P<<PM ; Perform final accumulate
POP XAR2
MOV T,AR3 ; Norm times to T
LSLL ACC,T ; ACC<<T
MOV *XAR4++,AH ; Save MSB to r_h[i]
LSR AL,#1
MOV *XAR5++,AL ; Save LSB>>1 to r_l[i]
BAR _LOOP_112,AR1,AR6,NEQ;Loop for m times
MOV ACC,AR3 ; norm=norm-overfl_shft
SUB ACC,@_buffer1
LRETR
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -