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

📄 lpc.asm

📁 G.729协议压缩的语音传输程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        .mmregs
        .include "ld8a.inc"
        .include "tab_ld8a.inc"
        .global  _Autocorr
        .global  _Lag_window
        .global  _Levinson
        .ref     _Div_32
        .bss   temp,240
        .bss   Ah,11
        .bss   Al,11
        .bss   Anh,11
        .bss   Anl,11
        .bss   old_A,11
        .bss   old_rc,2
        .bss   f1,6
        .bss   f2,6
        .global old_A
        .global old_rc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Autocorr(
;  Word16 x[],      /* (i)    : Input signal                      */
;  Word16 m,        /* (i)    : LPC order                         */
;  Word16 r_h[],    /* (o)    : Autocorrelations  (msb)           */
;  Word16 r_l[],    /* (o)    : Autocorrelations  (lsb)           */
;  Word16 *exp_R0      (o)    :exponent of the autocorrelation vector
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_Autocorr:
      pshm   st0
      pshm   st1
      frame  -2
      
      ssbx	  sxm
      ssbx    ovm
      ssbx    frct
      
      stlm    a,ar2
      stm      #hamwindow,ar3
      stm      #temp,ar4
      mvdk    *sp(8),ar5
      st      #1,*ar5
;Windowing of signal     
      stm     #L_WINDOW-1,brc
      rptb    endrep1-1
      ld      *ar2+,T
      MPYR    *ar3+,b
      sth     b,*ar4+
      
endrep1: 
      rsbx    ova
      rsbx    ovb
      stm     #temp,ar4
      ld      #1,b
;Compute r[0] and test for overflow
      rpt     #L_WINDOW-1
      squra   *ar4+,b
      bc      autocorr_NOV,BNOV
      stm     #temp,ar4
      STM     #L_WINDOW-1,BRC
      RPTB    endrep2-1
      ld      *ar4,-2,a
      stl     a,*ar4+
endrep2:
      addm    #4,*ar5
      b       endrep1     
autocorr_NOV:
;Normalization of r[0] 
      exp     b
      st      t,*sp(1)
      norm    b
      MVDK    *sp(6),ar2
      MVDK    *sp(7),ar3
      sth     b,*ar2
      sub     *ar2+,16,b
      ld      b,-1,b
      stl     b,*ar3+
      ld      *ar5,b
      ldm     t,a
      sub     a,b
      stl     b,*ar5
      stm     #0,ar0
      st      #L_WINDOW-1,*SP(0)
;r[1] to r[m] 
      ld      *sp(5),a
      sub     #1,a
      STlm    a,BRC
      ssbx    braf
      RPTB    endrep3-1
      ld      #0,b
      ld      *ar0+,a
      stm     #temp,ar4
      stm     #temp,ar5
      ld      *ar5+0,a
      ADDM    #-1,*SP(0)
   
      RPT     *SP(0)
      mac     *ar4+,*ar5+,b
      
      ld      *sp(1),t
      norm    b
      sth     b,*ar2
      sub     *ar2+,16,b
      ld      b,-1,b
      stl     b,*ar3+
endrep3:
      frame   2      
      popm    st1
      popm    st0
      ret 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Lag_window(
;  Word16 m,         /* (i)     : LPC order                        */
;  Word16 r_h[],     /* (i/o)   : Autocorrelations  (msb)          */
;  Word16 r_l[]      /* (i/o)   : Autocorrelations  (lsb)          */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_Lag_window:
      pshm   st0
      pshm   st1
      
      ssbx	  sxm
      ssbx    ovm
      ssbx    frct
      
      mvdk    *sp(3),ar2
      mvdk    *sp(4),ar3
      stm     #lag_h,ar4
      stm     #lag_l,ar5 
      
      ld      *ar2+,b
      ld      *ar3+,b
      sub     #1,a
      STlm    a,BRC
      ssbx    braf
      RPTB    endrep4-1
;x  =Mpy_32(r_h[i], r_l[i], lag_h[i-1], lag_l[i-1])      
      ld      *ar2,t
      mpy     *ar4,b
    
      mpy     *ar5+,a
      add     a,-15,b
    
      ld      *ar3,t
      mpy     *ar4+,a
      add     a,-15,b
;L_Extract(x, &r_h[i], &r_l[i])      
      sth     b,*ar2
      sub     *ar2+,16,b
      ld      b,-1,b
      stl     b,*ar3+
endrep4:      
      popm    st1
      popm    st0
      ret 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
;void Levinson(
;  Word16 Rh[],      /* (i)     : Rh[M+1] Vector of autocorrelations (msb) */
;  Word16 Rl[],      /* (i)     : Rl[M+1] Vector of autocorrelations (lsb) */
;  Word16 A[],       /* (o) Q12 : A[M]    LPC coefficients  (m = 10)       */
;  Word16 rc[],      /* (o) Q15 : rc[M]   Reflection coefficients.         */
;  Word16 *Err       /* (o)     : Residual energy                          */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_Levinson:
      pshm    st0
      pshm    st1
      pshm    ar1
      pshm    ar6
      pshm    ar7
      rsbx    ova
      rsbx    ovb
      
      frame   -9      ;*sp(2)--Kh,*sp(3)--Kl,*sp(4)--hi,*sp(5)--lo,*sp(6)--alp_exp
                      ;*sp(7)--alp_h,*sp(8)--alp_l,*sp(9)--i,*sp(10)--Rh
                      ;*sp(17)--Rl,*sp(18)--A,*sp(19)--rc,*sp(20)--Err
      ssbx	  sxm
      ssbx    ovm
      ssbx    frct
      
      stl     a,*sp(10)       ;*sp(10)--Rh
      stlm    a,ar2          ;ar2--Rh
      mvdk    *sp(17),ar3     ;ar3--Rl
      mvdk    *sp(18),ar4     ;ar4--A
      mvdk    *sp(19),ar5     ;ar5--rc
      stm     #Ah,ar6         ;ar6--Ah
      stm     #Al,ar7         ;ar7--Al
;K = A[1] = -R[1] / R[0]
      ld      *ar2(1),16,a
      add     *ar3(1),1,a    ;t1  = L_Comp(Rh[1], Rl[1])
      rsbx    tc
      xc      1,agt
      ssbx    tc
      abs     a              ;t2  = L_abs(t1)
  ;t0  = Div_32(t2, Rh[0], Rl[0])
      ld      *ar2,b
      stl     b,*sp(0)
      ld      *ar3,b
      stl     b,*sp(1)
      call    _Div_32
  ;if(t1 > 0) t0= L_negate(t0)
      xc      1,tc
      neg     a
  ;L_Extract(t0, &Kh, &Kl)      
      ld      a,b
      sth     a,*sp(2)
      ld      a,-1,a
      sub     *sp(2),15,a
      stl     a,*sp(3)
      
      ld      *sp(2),a
      stl     a,*ar5       ;rc[0] = Kh
      ld      b,-4,b            ;t0 = L_shr(t0,4)
  ;L_Extract(t0, &Ah[1], &Al[1])      
      ld      b,a
      sth     a,*(Ah+1)
      ld      a,-1,a
      sub     *(Ah+1),15,a
      stl     a,*(Al+1)
;Alpha = R[0] * (1-K**2)
      squr    *sp(2),b   ;t0 = Mpy_32(Kh ,Kl, Kh, Kl)
      ld      *sp(2),t
      mpy     *sp(3),a
      add     a,-14,b
      abs     b           ;t0 = L_abs(t0)
      ld      #7fffh,16,a;t0 = L_sub( (Word32)0x7fffffffL, t0 )
      or      #0ffffh,a
      sub     b,a
      sth     a,*sp(4)    ;L_Extract(t0, &hi, &lo)
      ld      a,-1,a
      sub     *sp(4),15,a
      stl     a,*sp(5)
    ;t0 = Mpy_32(Rh[0] ,Rl[0], hi, lo)
      ld      *ar2+,t
      mpy     *sp(4),b
    
      mpy     *sp(5),a
      add     a,-15,b
    
      ld      *ar3+,t
      mpy     *sp(4),a
      add     a,-15,b     
    ;alp_exp = norm_l(t0)
      exp     b
      st      t,*sp(6)
      norm    b
      
      sth     b,*sp(7)
      ld      b,-1,b
      sub     *sp(7),15,b
      stl     b,*sp(8) 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   
;ITERATIONS  I=2 to M  
      st      #2,*sp(9)
interations:
      ld      #0,b
   ;for(j=1; j<i; j++)
   ;   t0 = L_add(t0, Mpy_32(Rh[j], Rl[j], Ah[i-j], Al[i-j]))
      stm     #Ah,ar6
      stm     #Al,ar7
      ld      *sp(9),a
      sub     #1,a
      stlm    a,ar0
      ld      ar6+0,a
      ld      ar7+0,a
      ld      *sp(9),a
      sub     #2,a
      stlm    a,brc
      ssbx    braf
      rptb    endrep5-1
      ld      *ar2+,t
      mac     *ar6,b
      mpy     *ar7-,a
      add     a,-15,b
      ld      *ar3+,t
      mpy     *ar6-,a
      add     a,-15,b
endrep5:      
   ;t0 = L_shl(t0,4)
      ld      b,4,b
   ;t1 = L_Comp(Rh[i],Rl[i])
      ld      *ar2,16,a
      add     *ar3,1,a
   ;t0 = L_add(t0, t1) 
      add     a,b
      rsbx    tc
      xc      1,bgt
      ssbx    tc
   ;K = -t0 / Alpha
      abs     b,a
      ld      *sp(7),b
      stl     b,*sp(0)
      ld      *sp(8),b
      stl     b,*sp(1)
      call    _Div_32  
      xc      1,tc
      neg     a
    ;t2 = L_shl(t2, alp_exp)       
      ld      *sp(6),t
      norm    a
      ld      a,b
    ;L_Extract(t2, &Kh, &Kl)
      sth     a,*sp(2)
      ld      a,-1,a
      sub     *sp(2),15,a
      stl     a,*sp(3)  
    ;rc[i-1] = Kh
      sth     b,*+ar5 
    ;Test for unstable filter. If unstable keep old A(z)
      ld      *sp(2),16,a
      sub     #32750,16,a
      bc      Le_test,aleq
      mvdk    *sp(18),ar4
      stm     #old_A,ar2
      rpt     #M             ;for(j=0; j<=M; j++)
      mvdd    *ar2+,*ar4+    ;A[j] = old_A[j]
    ;rc[0] = old_rc[0] 
       mvdk    *sp(19),ar5
      stm     #old_rc,ar2
      mvdd    *ar2+,*ar5+
    ;rc[1] = old_rc[1] 
      mvdd    *ar2,*ar5
      b       Le_Exit
Le_test:  
      stm     #Ah,ar6
      stm     #Ah+1,ar2
      stm     #Al,ar7
      stm     #Al+1,ar3
      stm     #Anh+1,ar1
      stm     #Anl+1,ar4
      ld      ar6+0,a
      ld      ar7+0,a
      ld      *sp(9),a
      sub     #2,a
      stlm    a,brc
      ssbx    braf
      rptb    endrep6-1
      ld      *sp(2),t      ;t0 = Mpy_32(Kh, Kl, Ah[i-j], Al[i-j])
      mpy     *ar6,b
    
      mpy     *ar7,a
      add     a,-15,b
    
      ld      *sp(3),t
      mpy     *ar6,a
      add     a,-15,b 
      
      ld      *ar2+,16,a
      add     *ar3+,1,a
      add     a,b
      sth     b,*ar1 
      ld      b,-1,b
      sub     *ar1+,15,b
      stl     b,*ar4+
endrep6:  
      ld      *sp(2),16,b     ;t2 = L_shr(t2, 4)
      add     *sp(3),1,b
      ld      b,-4,b
      sth     b,*ar1         ;L_Extract(t2, &Anh[i], &Anl[i])
      ld      b,-1,b
      sub     *ar1,15,b
      stl     b,*ar4    
   ;t0 = Mpy_32(Kh ,Kl, Kh, Kl)
      squr    *sp(2),b   ;t0 = Mpy_32(Kh ,Kl, Kh, Kl)
      ld      *sp(2),t
      mpy     *sp(3),a
      add     a,-14,b  
      abs     b           ;t0 = L_abs(t0)
      ld      #7fffh,16,a;t0 = L_sub( (Word32)0x7fffffffL, t0 )
      or      #0ffffh,a
      sub     b,a
      sth     a,*sp(4)    ;L_Extract(t0, &hi, &lo)
      ld      a,-1,a
      sub     *sp(4),15,a
      stl     a,*sp(5) 
   ;t0 = Mpy_32(alp_h , alp_l, hi, lo)
      ld      *sp(4),t
      mpy     *sp(7),b
      mpy     *sp(8),a
      add     a,-15,b
      ld      *sp(5),t
      mpy     *sp(7),a
      add     a,-15,b
   ;j = norm_l(t0)  
      exp     b
      norm    b
   ;L_Extract(t0, &alp_h, &alp_l)
      sth     b,*sp(4)
      ld      b,-1,b
      sub     *sp(4),15,b
      stl     b,*sp(5)
   ;alp_exp = add(alp_exp, j)
      ld      t,a
      add     *sp(6),a
      stl     a,*sp(6)    
    ;A[j] = An[j]
      stm     #Ah+1,ar6
      stm     #Al+1,ar7
      stm     #Anh+1,ar1
      stm     #Anl+1,ar4
      ld      *sp(9),a       ;for(j=1; j<=i; j++)
      sub     #1,a           ;Ah[j] =Anh[j]
      stlm    a,brc          ;Al[j] =Anl[j]
      ssbx    braf
      rptb    endrep7-1
      ld      *ar1+,a
      stl     a,*ar6+
      ld      *ar4+,a
      stl     a,*ar7+
endrep7: 
      addm    #1,*sp(9)
      ld      *sp(9),a
      sub     #M,a
      bc      interations,aleq        
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                       
    ;*Err = shr(alp_h, alp_exp)  
      ld      *sp(6),b
      neg     b
      stlm    b,t
      ld      *sp(7),ts,b
      ld      b,8,b
      ld      b,8,b
      mvdk    *sp(20),ar1
      sth     b,*ar1
    ;Truncate A[i] in Q27 to Q12 with rounding
      mvdk    *sp(18),ar4
      st      #4096,*ar4+
      stm     #Ah+1,ar6
      stm     #Al+1,ar7

⌨️ 快捷键说明

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