?? pitch_a.asm
字號:
sub #80,16,a
bc pitch_olsecond_rep,alt
;;;;;;;;;;;;;;;;;;;;
;Test around max3
;;;;;;;;;;;;;;;;;;;;
ld *sp(11),a ;i=T3+1
add #1,a
stl a,*sp(0)
ld *sp(20),a
sub *sp(0),a
stlm a,ar5 ;ar5--&scal_sig[-(T3+1)]
mvdk *sp(20),ar4 ;ar4--scal_sig
ld #0,a ;sum = 0
mvdk *sp(1),brc ;for (j=0; j<L_frame; j+=2)
ssbx braf
rptb pitch_olthird1-1
ld *ar4+0,t
mac *ar5+0,a
pitch_olthird1:
max b ;L_temp = L_sub(sum, max)
ld *sp(11),a ;if (L_temp > 0) { max = sum; T3 = i; }
nop
xc 1,nc
ld *sp(0),a
stl a,*sp(11)
addm #-2,*sp(0)
ld *sp(20),a
sub *sp(0),a
stlm a,ar5 ;ar5--&scal_sig[-(T3-1)]
mvdk *sp(20),ar4 ;ar4--scal_sig
ld #0,a ;sum = 0
mvdk *sp(1),brc ;for (j=0; j<L_frame; j+=2)
ssbx braf
rptb pitch_olthird2-1
ld *ar4+0,t
mac *ar5+0,a
pitch_olthird2:
max b ;L_temp = L_sub(sum, max)
ld *sp(11),a ;if (L_temp > 0) { max = sum; T3 = i; }
nop
xc 1,nc
ld *sp(0),a
stl a,*sp(11)
;;;;;;;;;;;;;;;;;;;;;;;;
;compute energy of maximum
;;;;;;;;;;;;;;;;;;;;;;;;
sth b,*sp(5) ;L_Extract(max, &max_h, &max_l)
sub *sp(5),16,b
ld b,-1,b
stl b,*sp(6)
;compute energy of maximum
ld *sp(20),a
sub *sp(11),a
stlm a,ar4 ;p = &scal_sig[-T3]
ld #1,b ;sum = 1
rpt *sp(1) ;for(i=0; i<L_frame; i+=2, p+=2)
squra *ar4+0,b
;max3 = max/sqrt(energy)
;This result will always be on 16 bits
ld b,a
call Inv_sqrt ;sum = Inv_sqrt(sum), result in Q30
sth a,*sp(7) ;L_Extract(sum, &ener_h, &ener_l)
sub *sp(7),16,a
ld a,-1,a
stl a,*sp(8)
ld *sp(5),t ;sum = Mpy_32(max_h, max_l, ener_h, ener_l)
mpy *sp(7),b
mpy *sp(8),a
add a,-15,b
ld *sp(6),t
mpy *sp(7),a
add a,-15,b
stl b,*sp(4) ;max3 = extract_l(sum)
;;;;;;;;;;;;;;;;;;;
;Test for multiple
;;;;;;;;;;;;;;;;;;;
;if( abs(T2*2 - T3) < 5)
;max2 += max3 * 0.25
ld *sp(10),16,a
ld a,1,a
sub *sp(11),16,a
abs a
sub #5,16,a
ld *sp(3),16,b
nop
xc 2,alt
add *sp(4),14,b
sth b,*sp(3)
;if( abs(T2*3 - T3) < 7)
; max2 += max3 * 0.25
ld *sp(10),16,a
ld a,1,a
sub *sp(11),16,a
add *sp(10),16,a
abs a
sub #7,16,a
ld *sp(3),16,b
nop
xc 2,alt
add *sp(4),14,b
sth b,*sp(3)
;if( abs(T1*2 - T2) < 5)
;max1 += max2 * 0.20
ld *sp(9),16,a
ld a,1,a
sub *sp(10),16,a
abs a
sub #5,16,a
ld *sp(2),16,b
stm #6554,t
xc 2,alt
mac *sp(3),b
sth b,*sp(2)
;if( abs(T1*3 - T2) < 7)
;max1 += max2 * 0.20
ld *sp(9),16,a
ld a,1,a
sub *sp(10),16,a
add *sp(9),16,a
abs a
sub #7,16,a
ld *sp(2),16,b
stm #6554,t
xc 2,alt
mac *sp(3),b
sth b,*sp(2)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Compare the 3 sections maxima
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ld *sp(2),16,b
ld *sp(3),16,a
max b
ld *sp(9),a
nop
xc 1,nc
ld *sp(10),a
sub *sp(4),16,b
nop
nop
xc 1,blt
ld *sp(11),a
;return T1
frame 22
popm ar7
popm ar6
popm ar5
popm ar4
popm ar3
popm ar2
popm ar1
popm ar0
popm st1
popm st0
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Word32 Dot_Product( /* (o) :Result of scalar product. */
; Word16 x[], /* (i) :First vector. */
; Word16 y[], /* (i) :Second vector. */
; Word16 lg /* (i) :Number of point. */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Dot_Product:
pshm ar2
pshm ar3
;*sp(3)--y,*sp(4)--lg
stm #Dn,ar2 ;ar2--x--Dn
mvdk *sp(3),ar3 ;ar2--y
ld #0,b
addm #-1,*sp(4)
rpt *sp(4)
mac *ar2+,*ar3+,b
ld b,a
popm ar3
popm ar2
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Fast version of the pitch close loop
;Word16 Pitch_fr3_fast(/* (o) : pitch period. */
; Word16 exc[], /* (i) : excitation buffer */
; Word16 xn[], /* (i) : target vector */
; Word16 h[], /* (i) Q12 : impulse response of filters. */
; Word16 L_subfr, /* (i) : Length of subframe */
; Word16 t0_min, /* (i) : minimum value in the searched range. */
; Word16 t0_max, /* (i) : maximum value in the searched range. */
; Word16 i_subfr, /* (i) : indicator for first subframe. */
; Word16 *pit_frac /* (o) : chosen fraction. */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Pitch_fr3_fast:
pshm st0
pshm st1
pshm ar2
frame -12 ;*sp(0)--arg1,*sp(1)--arg2,*sp(2)--arg3,*sp(3)--t,*sp(4)--t0
;*sp(5)(6)--max,*sp(7)(8)--corr,*sp(9)(10)--L_temp,*sp(11)--arg0
;*sp(16)--xn,*sp(17)--h,*sp(18)--L_subfr,*sp(19)--t0_min
;*sp(20)--t0_max,*sp(21)--i_subfr,*sp(22)--pit_frac
ssbx ovm
ssbx sxm
ssbx frct
stl a,*sp(11)
ld *sp(16),b
stl b,*sp(0)
stm #Dn,*sp(1)
ld *sp(17),a
call Cor_h_X
ld #8000h,16,b ;max = MIN_32
dst b,*sp(5)
ld *sp(19),b ;t0 = t0_min
stl b,*sp(4)
stl b,*sp(3) ;t=
ld *sp(11),b
sub *sp(19),b
stl b,*sp(0) ;arg1
ld *sp(18),b
stl b,*sp(1) ;arg2
ld *sp(20),b
sub *sp(19),b
stlm b,brc
ssbx braf
rptb pitch_fr3_rep1-1 ;for(t=t0_min; t<=t0_max; t++)
call Dot_Product ;corr = Dot_Product(Dn, &exc[-t], L_subfr)
dld *sp(5),b
max b
dst b,*sp(5)
ld *sp(4),a
xc 1,nc
ld *sp(3),a
stl a,*sp(4)
addm #1,*sp(3)
addm #-1,*sp(0)
pitch_fr3_rep1:
;;;;;;;;;;;;;;;;;;;;;;
;Test fractions
;;;;;;;;;;;;;;;;;;;;;;
;Fraction 0
ld *sp(4),a
stl a,*sp(0)
stm #0,*sp(1)
ld *sp(18),a
stl a,*sp(2)
ld *sp(11),a
call Pred_lt_3
ld *sp(11),a
stl a,*sp(0)
ld *sp(18),a
stl a,*sp(1)
call Dot_Product
dst a,*sp(5)
frame 12
popm ar2
popm st1
popm st0
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -