⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lsp_sel.asm

📁 TI C54写的G729代码,视线8kbps高质量语音编码,汇编优化
💻 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 + -