📄 lsp_sel.asm
字号:
;==========================================================================
; File Name
; ----------
; LSP_SEL.ASM
;
; Brief Description of the Code:
; ------------------------------
; Select LSP codebooks (L0, L1, L2, L3).
;
; Ref
; ------
; QUA_LSP.C
;==========================================================================
.mmregs
.include ..\include\const.h
.include ..\include\ld8amem.h
.include ..\include\tab_ld8a.h
.text
.def Lsp_select_L1
.def Lsp_select_L2L3
;-----------------------------------------------------------------------
; Lsp_select_L1
;-----------------------------------------------------------------------
; void Lsp_select_L1(
; Word16 rbuf[], /* (i) Q13 : target vetor */
; Word16 lspcb1[][M], /* (i) Q13 : first stage LSP codebook */
; Word16 *cand /* (o) : selected code */
; )
;-----------------------------------------------------------------------
; Constants : Addr_lsp_vecQ13 -> rbuf
; (xxxx xxxx xxxx 0000) for use of circular buffer
;
; Tables : LspCb1Q13 -> lspcb1[][M]
;
; Pointers : ptr_L1 -> &cand
;
;-----------------------------------------------------------------------
; Input : DP = ptr_L1
; Lmin1
; BK = M
;
; Output & returning : *ptr_L1++ = L1
; *ptr_L1++ = *ptr_sel_lspcb1 = LspCb1Q13[L1]
;-----------------------------------------------------------------------
.asg "AR2", pLspVecQ13
.asg "AR3", pLspCb1Q13
.asg "AR4", pL1
Lsp_select_L1:
STM #NC0 - 1, BRC
STM #Addr_lsp_vecQ13, pLspVecQ13
STM #LspCb1Q13, pLspCb1Q13
MVDM ptr_L1, pL1
STM #1, AR0
RPTBD EndFindL1 - 1
ST #07fffh, Lmin1
SUB *pLspVecQ13+0%, *pLspCb1Q13+, A
RPTZ B, #M - 2
SQDST *pLspVecQ13+0%, *pLspCb1Q13+
; A(32 -- 16) * A(32 -- 16) + B -> B
; (*pLspVecQ13+ - *pLspCb1Q13+) << 16 -> A
SQDST *pLspVecQ13, *pLspCb1Q13
LD B, A
DSUB Lmin1, B
MVMD BRC, T
XC 2, BLT
DST A, Lmin1
ST T, *pL1
EndFindL1:
LD #NC0 - 1, A
SUB *pL1, A
STL A, *pL1 ; store L1
LD #LspCb1Q13, A
MAC *pL1+, #M >> 1, A
STL A, ptr_sel_lspcb1 ; store LspCb1[L1]
STL A, *pL1+ ; store LspCb1[L1]
RETD
MVMD pL1, ptr_L1
;-----------------------------------------------------------------------
; Lsp_select_L2L3
;-----------------------------------------------------------------------
; void Lsp_select_L2L3(
; 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 *pL2 /* (o) : selected codebook index L2 */
; Word16 *pL3 /* (o) : selected codebook index L3 */
; )
;-----------------------------------------------------------------------
; Constants : Addr_lsp_vecQ13 -> rbuf
; Addr_wegtQ11 -> wegt ; use circular buffer size of 10
;
; Tables : LspCb2Q13 -> lspcb2[][M]
;
; Pointers : ptr_L2 -> pL2
; ptr_L3 -> pL3
; ptr_sel_lspcb1 -> lspcb1[]
;
; ptr_lsp_vec -> tempbuf ; use circular buffer size of 10
; (xxxx xxxx xxxx 0000) for use of circular buffer
;-----------------------------------------------------------------------
; Input : DP = ptr_L2
; Lmin1
;
; Output & returning : *ptr_L2++ = L2
; *ptr_L2++ = LspCb2Q13[L2]
; *ptr_L3++ = L3
; *ptr_L3++ = LspCb2Q13[L3]
;-----------------------------------------------------------------------
.asg "AR1", AR_Counter
.asg "AR2", pWegtQ11
.asg "AR2", pL2
.asg "AR3", pL3
.asg "AR4", pLspCb2Q13
.asg "AR5", pDifQ13
.asg "Lmin1", Lmin3
Lsp_select_L2L3:
STM #Addr_lsp_vecQ13, pLspVecQ13
MVDM ptr_sel_lspcb1, pLspCb1Q13
STM #M - 1, BRC
STM #1, AR0
RPTBD EndGetDif - 1
MVDM ptr_lsp_vec, pDifQ13
SUB *pLspVecQ13+, *pLspCb1Q13+, A
STL A, -16, *pDifQ13+%
EndGetDif:
STM #LspCb2Q13, pLspCb2Q13
STM #Addr_wegtQ11, pWegtQ11
ST #07fffh, Lmin2
ST #07fffh, Lmin3
STM #NC1 - 1, AR_Counter
GetL2:
STM #NC - 1, BRC
LD #0, B
RPTB EndGetDist2 - 1
SUB *pDifQ13+0%, *pLspCb2Q13+, A
LD A,-16,A
STLM A,T
MPY *pWegtQ11+%,A
MACA T,B
EndGetDist2:
LD B, A
DSUB Lmin2, B
MVMD AR_Counter, T
XC 2, BLT
DST A, Lmin2
ST T, L2
GetL3:
STM #NC - 1, BRC
LD #0, B
RPTB EndGetDist3 - 1
SUB *pDifQ13+0%, *pLspCb2Q13+, A
LD A,-16,A
STLM A,T
MPY *pWegtQ11+%,A
MACA T,B
EndGetDist3:
LD B, A
DSUB Lmin3, B
MVMD AR_Counter, T
XC 2, BLT
DST A, Lmin3
ST T, L3
BANZ GetL2, *AR_Counter-
LD #NC1 - 1, A
MVDM ptr_L2, pL2
MVDM ptr_L3, pL3
SUB L2, A, B
SUB L3, A
STL B, *pL2 ; store L2
STL A, *pL3 ; store L3
LD #LspCb2Q13, A
MAC *pL2+, #M >> 1, A, B
ADD #M >> 1, A
MAC *pL3+, #M >> 1, A
STL B, *pL2+ ; store LspCb2[L2]
STL A, *pL3+ ; store LspCb2[L3]
STL B, ptr_sel_lspcb2_L2
STL A, ptr_sel_lspcb2_L3
MVMD pL2, ptr_L2
RETD
MVMD pL3, ptr_L3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -