📄 qua_lsp.asm
字号:
.mmregs
.include "ld8a.inc"
.include "tab_ld8a.inc"
.ref Lsp_prev_extract
.ref freq_prev
.ref Lsp_expand_1
.ref Lsp_expand_2
.ref Lsp_expand_1_2
.ref Lsp_get_quant
.ref Lsp_lsf2
.ref Lsf_lsp2
.bss buf,M
.bss buf1,M
.bss buf2,M
.bss rbuf,M
.bss cand,MODE
.bss tindex1,MODE
.bss tindex2,MODE
.bss lsf,M
.bss lsf_q,M
.bss wegt,M
.bss L_tdist,4
.global lsf_q
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Qua_lsp(
; Word16 lsp[], /* (i) Q15 : Unquantized LSP */
; Word16 lsp_q[], /* (o) Q15 : Quantized LSP */
; Word16 ana[] /* (o) : indexes */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_Qua_lsp:
PSHM ST0
PSHM ST1
frame -3 ;*sp(0)--arg2,*sp(1)--arg3
;*sp(2)--lsp
;*sp(6)--lsp_q,*sp(7)--ana
ssbx sxm
ssbx ovm
ssbx frct
st #lsf,*sp(0)
st #M,*sp(1)
call Lsp_lsf2
call Lsp_qua_cs
ld *sp(6),b
stl b,*sp(0)
st #M,*sp(1)
ld #lsf_q,a
call Lsf_lsp2
frame 3
POPM ST1
POPM ST0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Lsp_qua_cs(
; Word16 flsp_in[M], /* (i) Q13 : Original LSP parameters */
; Word16 lspq_out[M], /* (o) Q13 : Quantized LSP parameters */
; Word16 *code /* (o) : codes of the selected LSP */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Lsp_qua_cs:
frame -1
;flsp_in--lsf,lspq_out--lsf_q,*sp(0)--arg1
;code--ana--*sp(9)
st #wegt,*sp(0)
ld #lsf,a
call Get_wegt
call Relspwed
frame 1
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Relspwed(
; Word16 lsp[], /* (i) Q13 : unquantized LSP parameters */
; Word16 wegt[], /* (i) norm: weighting coefficients */
; Word16 lspq[], /* (o) Q13 : quantized LSP parameters */
; Word16 lspcb1[][M], /* (i) Q13 : first stage LSP codebook */
; Word16 lspcb2[][M], /* (i) Q13 : Second stage LSP codebook */
; Word16 fg[MODE][MA_NP][M], /* (i) Q15 : MA prediction coefficients */
; Word16 freq_prev[MA_NP][M], /* (i) Q13 : previous LSP vector */
; Word16 fg_sum[MODE][M], /* (i) Q15 : present MA prediction coef.*/
; Word16 fg_sum_inv[MODE][M], /* (i) Q12 : inverse coef. */
; Word16 code_ana[] /* (o) : codes of the selected LSP */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Relspwed:
pshm ar3
pshm ar4
pshm ar5
pshm ar6
;lsp--lsf,wegt--wegt,lspq--lsf_q,lspcb1
;lspcb2,fg,freq_prev,fg_sum,fg_sum_inv
;code_ana--*sp(23)
frame -9 ;*sp(0)--arg1,*sp(1)--arg2,*sp(2)--arg3,*sp(3)--arg4
;*sp(4)--index
;*sp(5)--count1,*sp(6)--cand_cur,*sp(7)--mode
;*sp(8)--mode_index
st #0,*sp(7)
relspwed_loop:
;Lsp_prev_extract(lsp, rbuf, fg[mode], freq_prev, fg_sum_inv[mode])
stm #20,t
mpy *sp(7),a
stl a,*sp(5) ;count1=0
st #rbuf,*sp(0) ;arg1
ld #fg,a
add *sp(5),a
stl a,*sp(1) ;arg2
st #freq_prev,*sp(2) ;arg3
stm #5,t
mpy *sp(7),a
stl a,*sp(5)
ld #fg_sum_inv,a
add *sp(5),a
stl a,*sp(3) ;arg4
ld #lsf,a
call Lsp_prev_extract ;Lsp_prev_extract(lsp, rbuf, fg[mode], freq_prev, fg_sum_inv[mode])
call Lsp_pre_select
ld #cand,a ;cand[mode] = cand_cur
add *sp(7),a
stlm a,ar3
ld *sp(6),a
stl a,*ar3
stm #5,t
mpy *ar3,b
ld #lspcb1,a
add b,a
stl a,*sp(0) ;lspcb1[cand_cur]
call Lsp_select_1
ld #tindex1,a ;tindex1[mode] = index
add *sp(7),a
stlm a,ar3
ld *sp(4),a
stl a,*ar3
stm #5,t ;lspcb1[cand_cur]
mpy *sp(6),b
ld #lspcb1,a
add b,a
stlm a,ar3
mpy *sp(4),b ;lspcb2[index]
ld #lspcb2,a
add b,a
stlm a,ar4
stm #buf,ar5
stm #NC-1,brc ;for( j = 0 ; j < NC ; j++ )
rptb relspwed_rep1-1
add *ar3+,*ar4+,b ; buf[j] = add( lspcb1[cand_cur][j], lspcb2[index][j] )
stl b,*ar5+
relspwed_rep1:
st #GAP1,*sp(0) ;Lsp_expand_1(buf, GAP1)
ld #buf,a
call Lsp_expand_1
stm #5,t ;lspcb1[cand_cur]
mpy *sp(6),b
ld #lspcb1,a
add b,a
stlm a,*sp(0)
call Lsp_select_2
ld #tindex2,a ;tindex2[mode] = index
add *sp(7),a
stlm a,ar3
ld *sp(4),a
stl a,*ar3
stm #5,t ;lspcb1[cand_cur]
mpy *sp(6),b
ld #lspcb1+5,a
add b,a
stlm a,ar3
mpy *sp(4),b ;lspcb2[index]
ld #lspcb2+5,a
add b,a
stlm a,ar4
stm #buf+5,ar5
stm #NC-1,brc ;for( j = 0 ; j < NC ; j++ )
rptb relspwed_rep2-1
add *ar3+,*ar4+,b ; buf[j] = add( lspcb1[cand_cur][j], lspcb2[index][j] )
stl b,*ar5+
relspwed_rep2:
st #GAP1,*sp(0) ;Lsp_expand_2(buf, GAP1)
ld #buf,a
call Lsp_expand_2
st #GAP2,*sp(0) ;Lsp_expand_1_2(buf, GAP2)
ld #buf,a
call Lsp_expand_1_2
stm #1,t ;&L_tdist[mode]
mpy *sp(7),b
ld #L_tdist,a
add b,a
stl a,*sp(0)
ld #fg_sum,a ;fg_sum[mode]
add *sp(7),a
stl a,*sp(1)
call Lsp_get_tdist
addm #1,*sp(7)
ld *sp(7),16,a
sub #MODE,16,a
bc relspwed_loop,alt
call Lsp_last_select
mvdk *sp(23),ar4
ld *sp(8),#NC0_B,b
ld #cand,a
add *sp(8),a
stlm a,ar3
or *ar3,b
stl b,*ar4
ld #tindex1,a
add *sp(8),a
stlm a,ar3
ld *ar3,NC1_B,b
ld #tindex2,a
add *sp(8),a
stlm a,ar3
or *ar3,b
stl b,*ar4(1)
ld #tindex1,b
add *sp(8),b
stl b,*sp(0)
ld #tindex2,b
add *sp(8),b
stl b,*sp(1)
stm #20,t
mpy *sp(8),b
ld #fg,a
add b,a
stl a,*sp(2)
stm #5,t
mpy *sp(8),b
ld #fg_sum,a
add b,a
stl a,*sp(3)
ld #cand,a
add *sp(8),a
call Lsp_get_quant
frame 9
popm ar6
popm ar5
popm ar4
popm ar3
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Lsp_pre_select(
; Word16 rbuf[], /* (i) Q13 : target vetor */
; Word16 lspcb1[][M], /* (i) Q13 : first stage LSP codebook */
; Word16 *cand /* (o) : selected code */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Lsp_pre_select:
pshm ar0
pshm ar3
pshm ar4
frame -4 ;*sp(0)--i,*sp(1)(2)--L_min,*sp(3)--tmp
;rbuf,lspcb1,cand--*sp(14)
stm #lspcb1,ar4 ;ar4--lspcb1
st #0,*sp(13) ;*cand = 0
ld #7fffh,16,a ;L_dmin = MAX_32
or #0ffffh,a
dst a,*sp(1)
st #0,*sp(0)
l_pre_s2:
ld #0,b
stm #rbuf,ar3 ;ar3--rbuf
stm #M-1,brc
rptb l_pre_s1-1
sub *ar3+,*ar4+,a
sth a,*sp(3)
squra *sp(3),b
l_pre_s1:
dld *sp(1),a
min b
dst b,*sp(1)
ld *sp(14),b
xc 1,c
ld *sp(0),b
stl b,*sp(14)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -