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

📄 qua_lsp.asm

📁 G.729在54X上的定点实现源代码.C++编程,可以直接下载运行,并且优化
💻 ASM
📖 第 1 页 / 共 2 页
字号:
           .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 + -