?? lpc.asm
字號:
.mmregs
.include "ld8a.inc"
.include "tab_ld8a.inc"
.global _Autocorr
.global _Lag_window
.global _Levinson
.ref _Div_32
.bss temp,240
.bss Ah,11
.bss Al,11
.bss Anh,11
.bss old_A,11
.bss old_rc,2
.bss f1,6
.bss f2,6
.global old_A
.global old_rc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Autocorr(
; Word16 x[], /* (i) : Input signal */
; Word16 m, /* (i) : LPC order */
; Word16 r_h[], /* (o) : Autocorrelations (msb) */
; Word16 r_l[], /* (o) : Autocorrelations (lsb) */
; Word16 *exp_R0 (o) :exponent of the autocorrelation vector
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_Autocorr:
pshm st0
pshm st1
frame -2
ssbx sxm
ssbx ovm
ssbx frct
stlm a,ar2
stm #hamwindow,ar3
stm #temp,ar4
mvdk *sp(8),ar5
st #1,*ar5
;Windowing of signal
stm #L_WINDOW-1,brc
rptb endrep1-1
ld *ar2+,T
MPYR *ar3+,b
sth b,*ar4+
endrep1:
rsbx ova
rsbx ovb
stm #temp,ar4
ld #1,b
;Compute r[0] and test for overflow
rpt #L_WINDOW-1
squra *ar4+,b
bc autocorr_NOV,BNOV
stm #temp,ar4
STM #L_WINDOW-1,BRC
RPTB endrep2-1
ld *ar4,-2,a
stl a,*ar4+
endrep2:
addm #4,*ar5
b endrep1
autocorr_NOV:
;Normalization of r[0]
exp b
st t,*sp(1)
norm b
MVDK *sp(6),ar2
MVDK *sp(7),ar3
sth b,*ar2
sub *ar2+,16,b
ld b,-1,b
stl b,*ar3+
ld *ar5,b
ldm t,a
sub a,b
stl b,*ar5
stm #0,ar0
st #L_WINDOW-1,*SP(0)
;r[1] to r[m]
ld *sp(5),a
sub #1,a
STlm a,BRC
ssbx braf
RPTB endrep3-1
ld #0,b
ld *ar0+,a
stm #temp,ar4
stm #temp,ar5
ld *ar5+0,a
ADDM #-1,*SP(0)
RPT *SP(0)
mac *ar4+,*ar5+,b
ld *sp(1),t
norm b
sth b,*ar2
sub *ar2+,16,b
ld b,-1,b
stl b,*ar3+
endrep3:
frame 2
popm st1
popm st0
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Lag_window(
; Word16 m, /* (i) : LPC order */
; Word16 r_h[], /* (i/o) : Autocorrelations (msb) */
; Word16 r_l[] /* (i/o) : Autocorrelations (lsb) */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_Lag_window:
pshm st0
pshm st1
ssbx sxm
ssbx ovm
ssbx frct
mvdk *sp(3),ar2
mvdk *sp(4),ar3
stm #lag_h,ar4
stm #lag_l,ar5
ld *ar2+,b
ld *ar3+,b
sub #1,a
STlm a,BRC
ssbx braf
RPTB endrep4-1
;x =Mpy_32(r_h[i], r_l[i], lag_h[i-1], lag_l[i-1])
ld *ar2,t
mpy *ar4,b
mpy *ar5+,a
add a,-15,b
ld *ar3,t
mpy *ar4+,a
add a,-15,b
;L_Extract(x, &r_h[i], &r_l[i])
sth b,*ar2
sub *ar2+,16,b
ld b,-1,b
stl b,*ar3+
endrep4:
popm st1
popm st0
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Levinson(
; Word16 Rh[], /* (i) : Rh[M+1] Vector of autocorrelations (msb) */
; Word16 Rl[], /* (i) : Rl[M+1] Vector of autocorrelations (lsb) */
; Word16 A[], /* (o) Q12 : A[M] LPC coefficients (m = 10) */
; Word16 rc[], /* (o) Q15 : rc[M] Reflection coefficients. */
; Word16 *Err /* (o) : Residual energy */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_Levinson:
pshm st0
pshm st1
pshm ar1
pshm ar6
pshm ar7
rsbx ova
rsbx ovb
frame -9 ;*sp(2)--Kh,*sp(3)--Kl,*sp(4)--hi,*sp(5)--lo,*sp(6)--alp_exp
;*sp(7)--alp_h,*sp(8)--alp_l,*sp(9)--i,*sp(10)--Rh
;*sp(17)--Rl,*sp(18)--A,*sp(19)--rc,*sp(20)--Err
ssbx sxm
ssbx ovm
ssbx frct
stl a,*sp(10) ;*sp(10)--Rh
stlm a,ar2 ;ar2--Rh
mvdk *sp(17),ar3 ;ar3--Rl
mvdk *sp(18),ar4 ;ar4--A
mvdk *sp(19),ar5 ;ar5--rc
stm #Ah,ar6 ;ar6--Ah
stm #Al,ar7 ;ar7--Al
;K = A[1] = -R[1] / R[0]
ld *ar2(1),16,a
add *ar3(1),1,a ;t1 = L_Comp(Rh[1], Rl[1])
rsbx tc
xc 1,agt
ssbx tc
abs a ;t2 = L_abs(t1)
;t0 = Div_32(t2, Rh[0], Rl[0])
ld *ar2,b
stl b,*sp(0)
ld *ar3,b
stl b,*sp(1)
call _Div_32
;if(t1 > 0) t0= L_negate(t0)
xc 1,tc
neg a
;L_Extract(t0, &Kh, &Kl)
ld a,b
sth a,*sp(2)
ld a,-1,a
sub *sp(2),15,a
stl a,*sp(3)
ld *sp(2),a
stl a,*ar5 ;rc[0] = Kh
ld b,-4,b ;t0 = L_shr(t0,4)
;L_Extract(t0, &Ah[1], &Al[1])
ld b,a
sth a,*(Ah+1)
ld a,-1,a
sub *(Ah+1),15,a
stl a,*(Al+1)
;Alpha = R[0] * (1-K**2)
squr *sp(2),b ;t0 = Mpy_32(Kh ,Kl, Kh, Kl)
ld *sp(2),t
mpy *sp(3),a
add a,-14,b
abs b ;t0 = L_abs(t0)
ld #7fffh,16,a;t0 = L_sub( (Word32)0x7fffffffL, t0 )
or #0ffffh,a
sub b,a
sth a,*sp(4) ;L_Extract(t0, &hi, &lo)
ld a,-1,a
sub *sp(4),15,a
stl a,*sp(5)
;t0 = Mpy_32(Rh[0] ,Rl[0], hi, lo)
ld *ar2+,t
mpy *sp(4),b
mpy *sp(5),a
add a,-15,b
ld *ar3+,t
mpy *sp(4),a
add a,-15,b
;alp_exp = norm_l(t0)
exp b
st t,*sp(6)
norm b
sth b,*sp(7)
ld b,-1,b
sub *sp(7),15,b
stl b,*sp(8)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;ITERATIONS I=2 to M
st #2,*sp(9)
interations:
ld #0,b
;for(j=1; j<i; j++)
; t0 = L_add(t0, Mpy_32(Rh[j], Rl[j], Ah[i-j], Al[i-j]))
stm #Ah,ar6
stm #Al,ar7
ld *sp(9),a
sub #1,a
stlm a,ar0
ld ar6+0,a
ld ar7+0,a
ld *sp(9),a
sub #2,a
stlm a,brc
ssbx braf
rptb endrep5-1
ld *ar2+,t
mac *ar6,b
mpy *ar7-,a
add a,-15,b
ld *ar3+,t
mpy *ar6-,a
add a,-15,b
endrep5:
;t0 = L_shl(t0,4)
ld b,4,b
;t1 = L_Comp(Rh[i],Rl[i])
ld *ar2,16,a
add *ar3,1,a
;t0 = L_add(t0, t1)
add a,b
rsbx tc
xc 1,bgt
ssbx tc
;K = -t0 / Alpha
abs b,a
ld *sp(7),b
stl b,*sp(0)
ld *sp(8),b
stl b,*sp(1)
call _Div_32
xc 1,tc
neg a
;t2 = L_shl(t2, alp_exp)
ld *sp(6),t
norm a
ld a,b
;L_Extract(t2, &Kh, &Kl)
sth a,*sp(2)
ld a,-1,a
sub *sp(2),15,a
stl a,*sp(3)
;rc[i-1] = Kh
sth b,*+ar5
;Test for unstable filter. If unstable keep old A(z)
ld *sp(2),16,a
sub #32750,16,a
bc Le_test,aleq
mvdk *sp(18),ar4
stm #old_A,ar2
rpt #M ;for(j=0; j<=M; j++)
mvdd *ar2+,*ar4+ ;A[j] = old_A[j]
;rc[0] = old_rc[0]
mvdk *sp(19),ar5
stm #old_rc,ar2
mvdd *ar2+,*ar5+
;rc[1] = old_rc[1]
mvdd *ar2,*ar5
b Le_Exit
Le_test:
stm #Ah,ar6
stm #Ah+1,ar2
stm #Al,ar7
stm #Al+1,ar3
stm #Anh+1,ar1
stm #Anl+1,ar4
ld ar6+0,a
ld ar7+0,a
ld *sp(9),a
sub #2,a
stlm a,brc
ssbx braf
rptb endrep6-1
ld *sp(2),t ;t0 = Mpy_32(Kh, Kl, Ah[i-j], Al[i-j])
mpy *ar6,b
mpy *ar7,a
add a,-15,b
ld *sp(3),t
mpy *ar6,a
add a,-15,b
ld *ar2+,16,a
add *ar3+,1,a
add a,b
sth b,*ar1
ld b,-1,b
sub *ar1+,15,b
stl b,*ar4+
endrep6:
ld *sp(2),16,b ;t2 = L_shr(t2, 4)
add *sp(3),1,b
ld b,-4,b
sth b,*ar1 ;L_Extract(t2, &Anh[i], &Anl[i])
ld b,-1,b
sub *ar1,15,b
stl b,*ar4
;t0 = Mpy_32(Kh ,Kl, Kh, Kl)
squr *sp(2),b ;t0 = Mpy_32(Kh ,Kl, Kh, Kl)
ld *sp(2),t
mpy *sp(3),a
add a,-14,b
abs b ;t0 = L_abs(t0)
ld #7fffh,16,a;t0 = L_sub( (Word32)0x7fffffffL, t0 )
or #0ffffh,a
sub b,a
sth a,*sp(4) ;L_Extract(t0, &hi, &lo)
ld a,-1,a
sub *sp(4),15,a
stl a,*sp(5)
;t0 = Mpy_32(alp_h , alp_l, hi, lo)
ld *sp(4),t
mpy *sp(7),b
mpy *sp(8),a
add a,-15,b
ld *sp(5),t
mpy *sp(7),a
add a,-15,b
;j = norm_l(t0)
exp b
norm b
;L_Extract(t0, &alp_h, &alp_l)
sth b,*sp(4)
ld b,-1,b
sub *sp(4),15,b
stl b,*sp(5)
;alp_exp = add(alp_exp, j)
ld t,a
add *sp(6),a
stl a,*sp(6)
;A[j] = An[j]
stm #Ah+1,ar6
stm #Al+1,ar7
stm #Anh+1,ar1
stm #Anl+1,ar4
ld *sp(9),a ;for(j=1; j<=i; j++)
sub #1,a ;Ah[j] =Anh[j]
stlm a,brc ;Al[j] =Anl[j]
ssbx braf
rptb endrep7-1
ld *ar1+,a
stl a,*ar6+
ld *ar4+,a
stl a,*ar7+
endrep7:
addm #1,*sp(9)
ld *sp(9),a
sub #M,a
bc interations,aleq
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;*Err = shr(alp_h, alp_exp)
ld *sp(6),b
neg b
stlm b,t
ld *sp(7),ts,b
ld b,8,b
ld b,8,b
mvdk *sp(20),ar1
sth b,*ar1
;Truncate A[i] in Q27 to Q12 with rounding
mvdk *sp(18),ar4
st #4096,*ar4+
stm #Ah+1,ar6
stm #Al+1,ar7
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -