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

📄 lpc_lsp.asm

📁 TI C54写的G729代码,视线8kbps高质量语音解码,汇编优化
💻 ASM
字号:
;==========================================================================
;  File Name
;  ----------
;  LPC_LSP.ASM
;
;  Brief Description of the Code:
;  ------------------------------
;  Compute the LSPs from  the LPC coefficients  (order=10)
;
;  Ref
;  ------
;  LPC.C
;==========================================================================

;-------------------------------------------------------------
;  procedure Az_lsp:
;            ~~~~~~
;  Compute the LSPs from  the LPC coefficients  (order=10)
;-------------------------------------------------------------
; int lpc_lsp(
;   Word16 a[],        /* (i) Q12 : predictor coefficients              */
;   Word16 lsp[],      /* (o) Q15 : line spectral pairs                 */
;   Word16 old_lsp[]   /* (i)     : old lsp[] (in case not found 10 roots) */
; )
;-------------------------------------------------------------
;  Input :
;        Constants :
;                  Addr_lpc_coefQ12 = &a[1]
;                  Addr_lsp_coef = lsp
;
;  Output:
;        If successfully find 10 lsp
;            A = 0, and Addr_lsp_coef = lsp
;        else
;            A = 1
;
;  Modified : DP, AR0, AR1, AR2, AR3, AR4, AR5, AR6
;--------------------------------------------------------------
		
        .MMREGS

        .include ..\include\const.h
        .include ..\include\lpc_lsp.h

        .text
        .ref	 Addr_lpc_coefQ12
        .ref     Addr_lsp_coef
        .ref     Grid

        .def     lpc_lsp
        .ref     Chebps_11
        .ref     Chebps_10
        .bss     Overflow,1,0,0
        .global  pChebps
        .bss     pChebps,1,0,0

One_Q10         .set     1024
One_Q11         .set     2048
One_Q14         .set     16383

        .asg    "AR1", pLspCoef
        .asg    "AR2", pGrid
        .asg    "AR3", pf
        .asg    "AR4", pXlow
        .asg    "AR4", pXmid

lpc_lsp:
        STM     #f1, AR2
        STM     #f2, AR3
        ST      #Chebps_11,*(pChebps)

        ST        #0,*(Overflow)

        STM     #Addr_lpc_coefQ12, AR4
        STM     #Addr_lpc_coefQ12+M-1, AR5

        LD      #One_Q11, 16, B            ; B = f1[0] = f2[0] = 1.0
        ADD     *AR4, *AR5, A              ; f1[1] = a[1] + a[M] - f1[0]
        LD      A, -1, A
        SUB     B, A
        STL     A, -16, *AR2

        SUB     *AR4+, *AR5-, A            ; f1[2] = a[1] - a[M] + f1[0]
        LD      A, -1, A
        ADD     B, A
        STL     A, -16, *AR3

        STM     #NC-2, BRC
        RPTB    Init_Blk_End1 - 1
        ADD     *AR4, *AR5, A              ; f1[i+1] = a[i+1] + a[M-i] - f1[i]
        LD      A, -1, A
        SUB     *AR2+, 16, A
        LD      A, -16, A
        CALL    #CheckOverFlow
        STL     A, *AR2

        SUB     *AR4+, *AR5-, A            ; f2[i+1] = a[i+1] + a[M-i] - f2[i]
        LD      A, -1, A
        ADD     *AR3+, 16, A
        LD      A, -16, A
        CALL    #CheckOverFlow
        STL     A, *AR3

Init_Blk_End1
        LD      *(Overflow), B
        BC      #Bzero, BEQ

        STM     #f1, AR2
        STM     #f2, AR3

        STM     #Addr_lpc_coefQ12, AR4
        STM     #Addr_lpc_coefQ12+M-1, AR5

        ST      #Chebps_10,*(pChebps)
        LD      #One_Q10, 16, B            ; B = f1[0] = f2[0] = 1.0
        ADD     *AR4, *AR5, A              ; f1[1] = a[1] + a[M] - f1[0]
        LD      A, -2, A
        SUB     B, A
        STL     A, -16, *AR2

        SUB     *AR4+, *AR5-, A            ; f1[2] = a[1] - a[M] + f1[0]
        LD      A, -2, A
        ADD     B, A
        STL     A, -16, *AR3

        STM     #NC-2, BRC
        RPTB    Init_Blk_End - 1
        ADD     *AR4, *AR5, A              ; f1[i+1] = a[i+1] + a[M-i] - f1[i]
        LD      A, -2, A
        SUB     *AR2+, 16, A
        STL     A, -16, *AR2

        SUB     *AR4+, *AR5-, A            ; f2[i+1] = a[i+1] + a[M-i] - f2[i]
        LD      A, -2, A
        ADD     *AR3+, 16, A
        STL     A, -16, *AR3
Bzero:

Init_Blk_End
        LD      #Addr_Lpc_Lsp_Buf, DP
        STM     #5, BK
        STM     #1, AR0
        STM     #Addr_lsp_coef, AR1
        STM     #Grid, AR2
        STM     #f1, AR3
        STM     #xlow, AR4

        MVDD    *pGrid+, *pXlow             ; xlow = grid[0]
;        CALLD   Chebps_11                   ; AR4 -> xlow, AR3 -> f[]
        LD      *(pChebps), B
        CALAD   B                   ; AR4 -> xlow, AR3 -> f[]
        STM     #NC-3, BRC
        SAT     A
        STL     A, -16, ylow                     ; ylow = (*pChebps)(xlow,coef,NC)

Outter_Loop
           MVDK    *pXlow+, xhigh           ; xhigh = xlow
           MVDK    *pXlow-, yhigh           ; yhigh = ylow
           MVDD    *pGrid+, *pXlow          ; xlow  = grid[j]
        LD      *(pChebps), B
        CALAD   B                   ; AR4 -> xlow, AR3 -> f[]
;           CALLD   Chebps_11
           STM     #NC-3, BRC
           SAT     A
           MPYA    yhigh
           BCD     Outter_Loop_Test, BGT
           STL     A, -16, ylow                  ; ylow = (*pChebps)(xlow,coef,NC)
           NOP
                                            ; divide 4 times the interval
           STM     #2-1,AR6
           STM     #xmid, AR4
Inner_Loop
                 LD     xhigh, -1, A

                 ADD    xlow,  -1, A
                 STL     A, *pXmid

		        LD      *(pChebps), B
    		    CALAD   B                   ; AR4 -> xlow, AR3 -> f[]
                STM     #NC-3, BRC
                SAT     A
                MPYA    ylow                ; A = ymid, B = sign
                STM     #xhigh, AR5
                XC      2, BGT
                        STM     #xlow,  AR5 ; AR5 -> x

                MVDD    *pXmid, *AR5+       ; AR5 -> y
                BANZD   Inner_Loop, *AR6-
                STL     A, -16, *AR5

Inner_Loop_End
; "STM  #xlow, AR4" is moved behind "BCD  Store_Lsp, BEQ" for efficiency
; Linear interpolation : xint = xlow - ylow*(xhigh-xlow)/(yhigh-ylow)

           LD      yhigh, 16, B
           SUB     ylow,  16, B             ; B = yhigh - ylow
           LD      *pXlow, A
           BCD     Store_Lsp, BEQ
           STM     #xlow, AR4

           LD      xhigh, 16, A
           SUB     xlow,  16, A
           STL     A, -16, x                     ; x = xhigh - xlow
           ABS     B, A
           EXP     A
           STM     #AL, AR5
           NORM    A
           STL     A, -16, y

           LDM     T, A
           SUB     #20-16, A
           LD      *AR5, ASM

           LD      #One_Q14, 16, A
           RPT     #16-2
	             SUBC    y, A

           STLM    A, T
           MPY     x, A
           LD      A, ASM, A
           SFTA        A,-16,A
           LD          A,15,A
           LD          A,1,A

           XC      1, BLT
                   NEG     A                ; A = t0
           MPYA    ylow
           LD      *pXlow, A
           LD      B, -11, B
           SUB     B, A

           ; -----------------------

Store_Lsp
           STL     A, *pLspCoef+            ; A = xint
           STL     A, *pXlow

           LDM     AR3, A                   ; if   AR3 == f1 then AR3 = f2
           XOR     #f1, A                   ; else AR3 =  f1
           XOR     #f2, A
           STLM    A, AR3

;           CALLD    Chebps_11
        LD      *(pChebps), B
        CALAD   B                   ; AR4 -> xlow, AR3 -> f[]
           STM     #NC-3, BRC
           SAT     A
           STL     A, -16, ylow

Outter_Loop_Test
           CMPM    *pGrid, 1
           LDM     pLspCoef, A
           SUB     #Addr_lsp_coef + M, A
           BC      Outter_Loop, NTC, NC

        XOR     A, A
        XC      1, NC
                LD      #1, A
        RET

CheckOverFlow:
         LD        A, B
         SUB       #32767,B,B
         BC        L4,BLEQ

         LD        #32767, A
         ST        #1,*(Overflow)
         B         L6

L4:
         LD        A, B
         SUB       #-32768,B,B
         BC        L6,BGEQ

         ST        #1,*(Overflow)
         LD        #-32768, A

L6:
         RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -