📄 qua_lsp.asm
字号:
addm #1,*sp(0)
ld *sp(0),16,b
sub #NC0,16,b
bc l_pre_s2,blt
frame 4
popm ar4
popm ar3
popm ar0
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Lsp_select_1(
; Word16 rbuf[], /* (i) Q13 : target vector */
; Word16 lspcb1[], /* (i) Q13 : first stage lsp codebook */
; Word16 wegt[], /* (i) norm: weighting coefficients */
; Word16 lspcb2[][M], /* (i) Q13 : second stage lsp codebook */
; Word16 *index /* (o) : selected codebook index */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Lsp_select_1:
pshm ar0
pshm ar2
pshm ar3
pshm ar4
pshm ar5
pshm ar6
frame -6 ;*sp(0)--k1,*sp(1)(2)--L_dist,*sp(3)(4)--L_dmin,*sp(5)--tmp
;rbuf,lspcb2,wegt,lspcb1[cand_cur]--*sp(13),*index--*sp(17)
mvdk *sp(13),ar2
stm #rbuf,ar3
stm #buf1,ar4
stm #lspcb2,ar5
stm #5,ar0
stm #NC-1,brc
rptb ls1_rep1-1
sub *ar3+,*ar2+,b
sth b,*ar4+
ls1_rep1:
st #0,*sp(17) ;*index = 0
ld #7fffh,16,a ;L_dmin = MAX_32
or #0ffffh,a
dst a,*sp(3)
st #0,*sp(0) ;for ( k1 = 0 ; k1 < NC1 ; k1++ )
ls1_rep3:
ld #0,b ;L_dist = 0
stm #buf1,ar4
stm #wegt,ar6
stm #NC-1,brc ;for ( j = 0 ; j < NC ; j++ )
rptb ls1_rep2-1
sub *ar4+,*ar5+,a ;tmp = sub(buf[j], lspcb2[k1][j])
sth a,*sp(5) ;tmp2 = mult( wegt[j], tmp )
ld *ar6+,t
mpy *sp(5),a
ld a,-16,a
stlm a,t ;L_dist = L_mac( L_dist, tmp2, tmp )
mac *sp(5),b
ls1_rep2:
dld *sp(3),a
min b
dst b,*sp(3)
ld *sp(17),b
xc 1,c
ld *sp(0),b
stl b,*sp(17)
ld *ar5+0,b ;for lspcb2 next k1
addm #1,*sp(0)
ld *sp(0),16,b
sub #NC1,16,b
bc ls1_rep3,blt
frame 6
popm ar6
popm ar5
popm ar4
popm ar3
popm ar2
popm ar0
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Lsp_select_2(
; Word16 rbuf[], /* (i) Q13 : target vector */
; Word16 lspcb1[], /* (i) Q13 : first stage lsp codebook */
; Word16 wegt[], /* (i) norm: weighting coef. */
; Word16 lspcb2[][M], /* (i) Q13 : second stage lsp codebook */
; Word16 *index /* (o) : selected codebook index */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Lsp_select_2:
pshm ar0
pshm ar2
pshm ar3
pshm ar4
pshm ar5
pshm ar6
frame -6 ;*sp(0)--k1,*sp(1)(2)--L_dist,*sp(3)(4)--L_dmin,*sp(5)--tmp
;rbuf,lspcb2,wegt,lspcb1[cand_cur]--*sp(13),*index--*sp(17)
mvdk *sp(13),ar2
stm #rbuf+5,ar3
stm #buf2+5,ar4
stm #lspcb2+5,ar5
stm #5,ar0
ld *ar2+0,a
stm #NC-1,brc
rptb ls1_rep2-1
sub *ar3+,*ar2+,b
sth b,*ar4+
ls2_rep1:
st #0,*sp(17) ;*index = 0
ld #7fffh,16,a ;L_dmin = MAX_32
or #0ffffh,a
dst a,*sp(3)
st #0,*sp(0) ;for ( k1 = 0 ; k1 < NC1 ; k1++ )
ls2_rep3:
ld #0,b ;L_dist = 0
stm #buf2,ar4
stm #wegt,ar6
stm #NC-1,brc ;for ( j = 0 ; j < NC ; j++ )
rptb ls2_rep2-1
sub *ar4+,*ar5+,a ;tmp = sub(buf[j], lspcb2[k1][j])
sth a,*sp(5) ;tmp2 = mult( wegt[j], tmp )
ld *ar6+,t
mpy *sp(5),a
ld a,-16,a
stlm a,t ;L_dist = L_mac( L_dist, tmp2, tmp )
mac *sp(5),b
ls2_rep2:
dld *sp(3),a
min b
dst b,*sp(3)
ld *sp(17),b
xc 1,c
ld *sp(0),b
stl b,*sp(17)
ld *ar5+0,b ;for lspcb2 next k1
addm #1,*sp(0)
ld *sp(0),16,b
sub #NC1,16,b
bc ls2_rep3,blt
frame 6
popm ar6
popm ar5
popm ar4
popm ar3
popm ar2
popm ar0
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Lsp_get_tdist(
; Word16 wegt[], /* (i) norm: weight coef. */
; Word16 buf[], /* (i) Q13 : candidate LSP vector */
; Word32 *L_tdist, /* (o) Q27 : distortion */
; Word16 rbuf[], /* (i) Q13 : target vector */
; Word16 fg_sum[] /* (i) Q15 : present MA prediction coef. */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Lsp_get_tdist:
pshm ar2
pshm ar3
pshm ar4
pshm ar5
pshm ar6
frame -1 ;*sp(0)--tmp2
;*sp(7)--&L_tdist,*sp(8)--fg_sum[mode]
stm #wegt,ar2 ;ar2--wegt
stm #buf,ar3 ;ar3--buf
stm #rbuf,ar4 ;ar4--rbuf
mvdk *sp(7),ar6 ;ar6--&L_tdist[mode]
mvdk *sp(8),ar5 ;ar5--fg_sum[mode]
ld #0,b
stm #M-1,brc
rptb Lgt_rep-1
sub *ar3+,*ar4+,a
ld a,-16,a
stlm a,t
mpy *ar5+,a
ld a,-16,a
stlm a,t
mpy *ar2+,a
ld a,4,a
sth a,*sp(0)
mac *sp(0),b
Lgt_rep:
dst b,*ar6
frame 1
pshm ar6
popm ar5
popm ar4
popm ar3
popm ar2
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Lsp_last_select(
; Word32 L_tdist[], /* (i) Q27 : distortion */
; Word16 *mode_index /* (o) : the selected mode */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Lsp_last_select:
pshm ar3
;*sp(10)--mode_index
stm #L_tdist,ar3
st #0,*sp(10)
dld *ar3,b
dld *ar3(2),a
sub b,a
xc 2,alt
st #1,*sp(10)
popm ar3
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Get_wegt(
; Word16 flsp[], /* (i) Q13 : M LSP parameters */
; Word16 wegt[] /* (o) Q11->norm : M weighting coefficients */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Get_wegt:
PSHM ST0
PSHM ST1
pshm ar2
pshm ar3
pshm ar4
pshm ar5
frame -4 ;*sp(0)--i,*sp(1)--tmp,*sp(2)--sft,*sp(3)--flsp
;*sp(11)--wegt
stl a,*sp(3)
add #2,a,b
stlm b,ar2 ;ar2--flsp+2
stlm a,ar3 ;ar3--flsp
mvdk *sp(11),ar4 ;ar4--wegt
stm #buf,ar5 ;ar5--buf
ld *ar2(1),16,b ;buf[0] = sub( flsp[1], (PI04+8192) )
sub #PI04+8192,16,b
sth b,*ar5+
stm #M-3,brc ;for ( i = 1 ; i < M-1 ; i++ )
rptb gw_rep1-1
sub *ar2+,*ar3+,b ;tmp = sub( flsp[i+1], flsp[i-1] )
sub #8192,b ;buf[i] = sub( tmp, 8192 )
sth b,*ar5+
gw_rep1:
ld #PI92-8192,16,b ;buf[M-1] = sub( (PI92-8192), flsp[M-2] )
sub *ar3,16,b
sth b,*ar5
stm #buf,ar5
stm #M-1,brc
rptb gw_rep2-1
ld *ar5,a
bc gw_n,aleq
st #2048,*ar4+
ld *ar5+,b
b gw_p
gw_n:
squr *ar5+,b
sth b,2,*sp(1)
mpy *sp(1),#CONST10,b
ld b,2,b
add #2048,16,b
sth b,*ar4+
gw_p:
nop
gw_rep2:
mvdk *sp(11),ar4 ;ar4--wegt
mpy *ar4(4),#CONST12,b
sth b,1,*ar4(4)
mpy *ar4(5),#CONST12,b
sth b,1,*ar4(5)
ld #0,b
stm #M-1,brc
rptb gw_rep3-1
ld *ar4+,16,a
max b
gw_rep3:
exp b
stm #M-1,brc
rptb gw_rep4-1
ld *ar4,16,b
norm b
sth b,*ar4+
gw_rep4:
frame 4
popm ar5
popm ar4
popm ar3
popm ar2
POPM ST1
POPM ST0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -