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

📄 lpcfunc.asm

📁 c 5402 g729a编码源代码
💻 ASM
字号:
          .mmregs
          .include "tab_ld8a.inc"
          .include "ld8a.inc"
          .bss     lsp,M
          .bss     f1,12
          .bss     f2,12
          .global  Lsp_lsf2
          .global  Lsf_lsp2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Lsp_Az(
;  Word16 lsp[],    /* (i) Q15 : line spectral frequencies            */
;  Word16 a[]       /* (o) Q12 : predictor coefficients (order = 10)  */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Lsp_Az:
    pshm  ar0
    pshm  ar2
    pshm  ar3
    pshm  ar4
    pshm  ar5
    pshm  ar6
    pshm  ar7
    
    frame -1       ;*sp(0)--arg1
                   ;*sp(9)--a
    
    st   #f1,*sp(0)

    call Get_lsp_pol
    
    st   #f2,*sp(0)
    add  #1,a
    call Get_lsp_pol
    
    stm   #f1+10,ar2
    stm   #f1+8,ar3
    stm   #f2+10,ar4
    stm   #f2+8,ar5
    stm    #2,ar0
    stm  #4,brc
    rptb  lsp_az_rep-1
    dld   *ar2,a
    dld   *ar3-0,b
    add   a,b
    dst   b,*ar2-0
    dld   *ar4,a
    dld   *ar5-0,b
    sub   b,a
    dst   a,*ar4-0   
lsp_az_rep:
    
    stm   #2,ar0
    mvdk  *sp(9),ar6
    ld    *sp(9),a
    add   #10,a
    stlm  a,ar7
    st    #4096,*ar6
    
    stm   #f1+2,ar2
    stm   #f2+2,ar3
    
    stm   #4,brc
    rptb  lsp_az_rep1-1
    dld   *ar2,a
    dld   *ar3+,b
    add   b,a
    ld    a,-13,a
    stl   a,*ar6+0
    
    dld   *ar2+,a
    sub   b,a
    ld    a,-13,a
    stl   a,*ar7-0
    
lsp_az_rep1:
    frame  1
    popm  ar7
    popm  ar6
    popm  ar5
    popm  ar4
    popm  ar3
    popm  ar2
    popm  ar0
    ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Find the polynomial F1(z) or F2(z) from the LSPs
;Parameters:                                               *
; *  lsp[]   : line spectral freq. (cosine domain)    in Q15  *
; *  f[]     : the coefficients of F1 or F2           in Q24  *
;static void Get_lsp_pol(Word16 *lsp, Word32 *f)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Get_lsp_pol:
     pshm  ar0
     pshm  ar2
     pshm  ar3
     frame -3
     ;All computation in Q24
                               ;*sp(0)--i,*sp(1)--hi,*sp(2)--lo
                               ;*sp(7)--f
     stm   #2,ar0
     stlm  a,ar3               ;ar3--lsp
     mvdk  *sp(7),ar2         ;ar2--f
     ld    #100h,16,b         ;f[0] = 1.0;    in Q24 
     dst   b,*ar2+0
     
     st    #512,t            ;f[1] =  -2.0 * lsp[0];  in Q24
     mpy   *ar3+0,b
     neg   b
     dst   b,*ar2+0
     
     st    #2,*sp(0)   
glp_rep1:     
     dld   *ar2(-4),b       ;*f = f[-2]
     dst   b,*ar2
     
     ld   *sp(0),a
     sub  #2,a
     stlm  a,brc
     rptb  glp_rep-1
    
     dld   *ar2(-4),a      ;*f = L_add(*f, f[-2])
     dld   *ar2,b
     add   a,b
     dst   b,*ar2
     
     dld   *ar2(-2),b      ;L_Extract(f[-1] ,&hi, &lo)
     sth   b,*sp(1)
     sub   *sp(1),16,b
     ld    b,-1,b
     stl   b,*sp(2)
     ld    *ar3,t          ;t0 = f[-1] * lsp
     mpy   *sp(1),b
     mpy   *sp(2),a
     add   a,-15,b
     ld    b,1,b           ;t0 = L_shl(t0, 1)
     
     dld   *ar2,a          ;*f = L_sub(*f, t0)
     sub   b,a
     dst   a,*ar2
     ld    *ar2-0,a
     
glp_rep:
     ld    *ar3,9,b           ;*f -= lsp<<9
     dld   *ar2,a
     sub   b,a
     dst   a,*ar2
     ld    *sp(0),a
     ld    a,1,a
     stlm  a,ar0
     ld    *ar2+0,a
     stm   #2,ar0
     ld    *ar3+0,a
     addm  #1,*sp(0)
     ld    *sp(0),b
     sub   #5,b
     bc    glp_rep1,bleq
     
     frame 3
     popm  ar3
     popm  ar2
     popm  ar0
     
     ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Lsf_lsp2(
;  Word16 lsf[],    /* (i) Q13 : lsf[m] (range: 0.0<=val<PI) */
;  Word16 lsp[],    /* (o) Q15 : lsp[m] (range: -1<=val<1)   */
;  Word16 m         /* (i)     : LPC order                   */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Lsf_lsp2:
    PSHM    ST0
    PSHM    ST1
    pshm    ar0
    pshm    ar2
    pshm    ar3
    pshm    ar4
    pshm    ar5
    frame   -3    ;*sp(0)--ind,*sp(1)--offset
                  ;*sp(2)--freq
                  ;*sp(11)--lsp,*sp(12)--m
    ssbx    sxm
    ssbx    ovm
    ssbx    frct
    
    stlm    a,ar2        ;ar2--lsf
    mvdk    *sp(11),ar3  ;ar3--lsp

    
    ld      *sp(12),b        ;for(i=0; i<m; i++)
    sub     #1,b
    stlm    b,brc
    ssbx    braf
    rptb    lsf2_rep-1
    stm     #table2,ar4  ;ar4--table2
    stm     #slope_cos,ar5  ;ar5--slope_cos
    mpy     *ar2+,#20861,b  ;20861: 1.0/(2.0*PI) in Q17
    ld      b,-16,b
    ld      b,-8,a          ;ind    = b8-b15 of freq
    and     #0ffh,b          ;offset = b0-b7  of freq
    stlm    b,t              
    ld      a,b
    sub     #63,a            ;if ( sub(ind, 63)>0 ) 
    xc      1,agt
    ld      #63,b            ;ind = 63
  ;lsp[i] = table2[ind]+ (slope_cos[ind]*offset >> 12)  
    stlm    b,ar0
    ld      ar4+0,a
    ld      ar5+0,a
    mpy     *ar5,b           ;L_tmp   = L_mult(slope_cos[ind], offset),L_tmp in Q28
    ld      b,3,b
    add     *ar4,16,b
    sth     b,*ar3+          ;lsp[i] = add(table2[ind], extract_l(L_shr(L_tmp, 13)))
lsf2_rep:
    frame   3
    popm    ar5
    popm    ar4
    popm    ar3
    popm    ar2
    popm    ar0
    POPM    ST1
    POPM    ST0
    RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Lsp_lsf2(
;  Word16 lsp[],    /* (i) Q15 : lsp[m] (range: -1<=val<1)   */
;  Word16 lsf[],    /* (o) Q13 : lsf[m] (range: 0.0<=val<PI) */
;  Word16 m         /* (i)     : LPC order                   */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Lsp_lsf2:
    PSHM    ST0
    PSHM    ST1
    
    pshm    ar0
    pshm    ar2
    pshm    ar3
    pshm    ar4
    pshm    ar5
    frame   -3    ;*sp(0)--ind,*sp(1)--offset
                  ;*sp(2)--freq
                  ;*sp(11)--lsf,*sp(12)--m
    ssbx    sxm
    ssbx    ovm
    ssbx    frct 
    
    stlm    a,ar2           ;ar2--lsp
    mvdk    *sp(11),ar3     ;ar3--lsf
    
    st      #63,*sp(0)      ;begin at end of table2 -1
    stm     #table2+63,ar4     ;ar4--table2
    
    
    ld      *sp(12),b        ;for(i= m-(Word16)1; i >= 0; i--)
    sub     #1,b
    stlm    b,ar0
    ld      ar2+0,a
    ld      ar3+0,a
    stlm    b,brc
    ssbx    braf
    rptb    lsp2_rep-1
    
    ld      *sp(0),b
lsp2_while:    
    sub     *ar4,*ar2,a     ;while( sub(table2[ind], lsp[i]) < 0 )
    bc      lsp2_break,ageq
    ld      *ar4-,a
    sub     #1,b
    bc      lsp2_break,bleq
    b       lsp2_while
lsp2_break:
    stl     b,*sp(0)
    sub     *ar2-,*ar4,b
    ld      b,-16,b
    stlm    b,t
    stm     #slope_acos,ar5  ;ar5--slope_acos
    mvdk    *sp(0),ar0      
    ld      *ar5+0,a
    mpy     *ar5,b
    ld      b,4,b
    ld      *sp(0),16,a
    add     a,9,b
    sth     b,*sp(2)
    stm      #25736,t
    mpy     *sp(2),b
    sth     b,*ar3-
lsp2_rep:
    frame   3
    popm    ar5
    popm    ar4
    popm    ar3
    popm    ar2
    popm    ar0
    POPM    ST1
    POPM    ST0
    RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Weight_Az(
;  Word16 a[],      /* (i) Q12 : a[m+1]  LPC coefficients             */
;  Word16 gamma,    /* (i) Q15 : Spectral expansion factor.           */
;  Word16 m,        /* (i)     : LPC order.                           */
;  Word16 ap[]      /* (o) Q12 : Spectral expanded LPC coefficients   */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_Weight_Az:
    pshm   st0
    pshm   st1
    
    pshm   ar2
    pshm   ar3
    frame  -1      ;*sp(0)--fac
                   ;*sp(6)--gamma,*sp(7)--m,*sp(8)--ap
    
    ssbx    sxm
    ssbx    ovm
    ssbx    frct 
    
    stlm   a,ar2       ;ar2--a
    mvdk   *sp(8),ar3   ;ar3--ap
    mvdd   *ar2+,*ar3+
    ld     *sp(6),b     ;fac   = gamma
    stl    b,*sp(0)
    
    ld     *sp(7),a
    sub    #2,a
    stlm   a,brc
    rptb   weight_az_rep-1
    ld     *ar2+,t
    mpy    *sp(0),b
    add    #4000h,1,b
    sth    b,*ar3+
    
    ld     *sp(6),t
    mpy    *sp(0),b
    add    #4000h,1,b
    sth    b,*sp(0)
weight_az_rep:
    ld     *ar2,t
    mpy    *sp(0),b
    add    #4000h,1,b
    sth    b,*ar3
    
    frame   1
    popm   ar3
    popm   ar2
    popm   st1
    popm   st0
    ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Interpolation of the quantized LSP's
;void Int_qlpc(
; Word16 lsp_old[], /* input : LSP vector of past frame              */
; Word16 lsp_new[], /* input : LSP vector of present frame           */
; Word16 Az[]       /* output: interpolated Az() for the 2 subframes */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_Int_qlpc:
    PSHM    ST0
    PSHM    ST1
    pshm    ar2
    pshm    ar3
    pshm    ar4
    
    frame   -1     ;*sp(0)--arg1
                   ;*sp(7)--lsp_new,*sp(8)--Az
    ssbx    sxm
    ssbx    ovm
    ssbx    frct 
    
    stlm    a,ar3         ;ar3--lsp_old
    mvdk    *sp(7),ar2    ;ar2--lsp_new
    stm     #lsp,ar4      ;ar4--lsp
    
    stm     #M-1,brc
    rptb    Int_qlpc_rep-1
    ld      *ar2+,16,b
    ld      b,-1,b
    ld      *ar3+,16,a
    ld      a,-1,a
    add     a,b
    sth     b,*ar4+
Int_qlpc_rep:
    
    ld      *sp(8),b
    stl     b,*sp(0)
    ld      #lsp,a
    call    Lsp_Az
    
    ld      *sp(8),b
    add     #MP1,b
    stl     b,*sp(0)
    ld      *sp(7),a
    call    Lsp_Az
    
    popm    ar4
    popm    ar3
    popm    ar2
    frame   1
    POPM    ST1
    POPM    ST0
    RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    .end

⌨️ 快捷键说明

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