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

📄 lpc.asm

📁 G.729协议压缩的语音传输程序,使用了ti5410
💻 ASM
📖 第 1 页 / 共 2 页
字号:
      stm     #old_A+1,ar1
      stm     #M-1,brc
      rptb    endrep8-1     ;for(i=1; i<=M; i++)
      ld      *ar6+,16,b    ;t0   = L_Comp(Ah[i], Al[i])
      add     *ar7+,1,b     ;old_A[i] = A[i] = round(L_shl(t0, 1))
      ld      b,1,b
      add     #4000h,1,b
      sth     b,*ar4+
      sth     b,*ar1+ 
endrep8:
    ;old_rc[0] = rc[0] 
      mvdk    *sp(19),ar5
      stm     #old_rc,ar2
      mvdd    *ar5+,*ar2+
    ;old_rc[1] = rc[1] 
      mvdd    *ar5,*ar2

Le_Exit:
      frame   9  
      popm    ar7
      popm    ar6    
      pshm    ar1
      popm    st1
      popm    st0
      ret 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;static Word16 Chebps_11(Word16 x, Word16 f[], Word16 n)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_Chebps_11:
      pshm    st0
      pshm    st1
      pshm    ar2
      frame   -7    ;*sp(0)--b0_h,*sp(1)--b0_l,*sp(2)--b1_h,*sp(3)--b1_l
                    ;*sp(4)--b2_h,*sp(5)--b2_l,*sp(6)--x
                    ;*sp(11)--f,*sp(12)--n
      ssbx	  sxm
      ssbx    ovm
      ssbx    frct
      
      mvdk    *sp(11),ar2    ;ar2--f
      stl     a,*sp(6)
      ld      *ar2+,b       ;ar2--f[1]
;All computation are done in Q24      
      st      #256,*sp(4)   ;b2 = 1.0 in Q24 DPF 
      st      #0,*sp(5)
      stlm    a,t
      mpy     #512,b        ;2*x in Q24
      
      mac     *ar2+,#4096,b  ;+ f[1] in Q24,ar2--f[2]
      sth     b,*sp(2)
      sub     *sp(2),16,b
      ld      b,-1,b
      stl     b,*sp(3)         ;b1 = 2*x + f[1]
      
      ld      *sp(12),a        ;for (i = 2; i<n; i++)
      sub     #3,a
      stlm    a,brc
      ssbx    braf
      rptb    ch_11-1
      
      ld      *sp(6),t        ;t0 = 2.0*x*b1
      mpy     *sp(2),b
      mpy     *sp(3),a
      add     a,-15,b
      ld      b,1,b
      
      ld      *sp(4),16,a     ;t0 = 2.0*x*b1 - b2
      add     *sp(5),1,a
      sub     a,b            
      
      add     *ar2+,13,b      ;t0 = 2.0*x*b1 - b2 + f[i]
      
      sth     b,*sp(0)        ;b0 = 2.0*x*b1 - b2 + f[i]
      sub     *sp(0),16,b
      ld      b,-1,b
      stl     b,*sp(1)
      
      ld      *sp(5),a        ;b2 = b1
      stl     a,*sp(3)
      ld      *sp(4),a
      stl     a,*sp(2)
      ld      *sp(3),a        ;b1 = b0
      stl     a,*sp(1)
      ld      *sp(2),a
      stl     a,*sp(0)
ch_11:       
      ld      *sp(6),t        ;t0 = x*b1
      mpy     *sp(2),b
      mpy     *sp(3),a
      add     a,-15,b
      
      ld      *sp(4),16,a     ;t0 = x*b1 - b2
      add     *sp(5),1,a
      sub     a,b    
      
      add     *ar2,12,b       ;t0 = x*b1 - b2 + f[i]/2  
      
      ld      b,6,b           ; Q24 to Q30 with saturation
      
      ld      b,a
      ld      a,-16,a 
                                                      
      frame   7
      popm    ar2
      popm    st1
      popm    st0
      ret 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;static Word16 Chebps_10(Word16 x, Word16 f[], Word16 n)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_Chebps_10:
      pshm    st0
      pshm    st1
      pshm    ar2
      frame   -7    ;*sp(0)--b0_h,*sp(1)--b0_l,*sp(2)--b1_h,*sp(3)--b1_l
                    ;*sp(4)--b2_h,*sp(5)--b2_l,*sp(6)--x
                    ;*sp(11)--f,*sp(12)--n
      ssbx	  sxm
      ssbx    ovm
      ssbx    frct
      
      mvdk    *sp(11),ar2    ;ar2--f
      stl     a,*sp(6)
      ld      *ar2+,b       ;ar2--f[1]
;All computation are done in Q24      
      st      #128,*sp(4)   ;b2 = 1.0 in Q23 DPF 
      st      #0,*sp(5)
      stlm    a,t
      mpy     #256,b        ;2*x in Q23
      
      mac     *ar2+,#4096,b  ;+ f[1] in Q23,ar2--f[2]
      sth     b,*sp(2)
      sub     *sp(2),16,b
      ld      b,-1,b
      stl     b,*sp(3)         ;b1 = 2*x + f[1]
      
      ld      *sp(12),a
      sub     #3,a
      stlm    a,brc
      ssbx    braf
      rptb    ch_10-1
      
      ld      *sp(6),t        ;t0 = 2.0*x*b1
      mpy     *sp(2),b
      mpy     *sp(3),a
      add     a,-15,b
      ld      b,1,b
      
      ld      *sp(4),16,a     ;t0 = 2.0*x*b1 - b2
      add     *sp(5),1,a
      sub     a,b            
      
      add     *ar2+,13,b      ;t0 = 2.0*x*b1 - b2 + f[i]
      
      sth     b,*sp(0)        ;b0 = 2.0*x*b1 - b2 + f[i]
      sub     *sp(0),16,b
      ld      b,-1,b
      stl     b,*sp(1)
      
      ld      *sp(5),a        ;b2 = b1
      stl     a,*sp(3)
      ld      *sp(4),a
      stl     a,*sp(2)
      ld      *sp(3),a        ;b1 = b0
      stl     a,*sp(1)
      ld      *sp(2),a
      stl     a,*sp(0)
ch_10:       
      ld      *sp(6),t        ;t0 = x*b1
      mpy     *sp(2),b
      mpy     *sp(3),a
      add     a,-15,b
      
      ld      *sp(4),16,a     ;t0 = x*b1 - b2
      add     *sp(5),1,a
      sub     a,b    
      
      add     *ar2,12,b       ;t0 = x*b1 - b2 + f[i]/2  
      
      ld      b,7,b           ; Q23 to Q30 with saturation
      
      ld      b,a
      ld      a,-16,a 
                                                      
      frame   7
      popm    ar2
      popm    st1
      popm    st0
      ret       
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Az_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) */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_Az_lsp:
      pshm    st0
      pshm    st1
      pshm    ar1
      pshm    ar6
      pshm    ar7
      frame   -20   ;*sp(2)--j,*sp(3)--nf,*sp(4)--ip
                    ;*sp(5)--xlow,*sp(6)--ylow,*sp(7)--xhigh
                    ;*sp(8)--yhigh,*sp(9)--xmid,*sp(10)--ymid
                    ;*sp(11)--xint,*sp(12)--x,*sp(13)--y
                    ;*sp(14)--sign,*sp(15)--exp,*sp(16)--coef
                    ;*sp(17)--ovf_coef,*sp(18)--pChebps,
                    ;*sp(19)--a
                    ;*sp(26)--lsp,*sp(27)--old_lsp 
      rsbx    ova
      rsbx    ovb
      ssbx	  sxm
      ssbx    ovm
      ssbx    frct
      
      stl     a,*sp(19)
      stlm    a,ar2               ;ar2--a
      stlm    a,ar1
      mvdk    *sp(26),ar3         ;ar3--lsp
      mvdk    *sp(27),ar4         ;ar4--old_lsp
      stm     #grid,ar5           ;ar5--grid
      stm     #f1,ar6             ;ar6--f1
      stm     #f2,ar7             ;ar7--f2
     
      st      #_Chebps_11,*sp(18) ;pChebps = Chebps_11
      
      st      #2048,*ar6       ;f1[0] = 1.0 is in Q11
      st      #2048,*ar7       ;f2[0] = 1.0 is in Q11
      
      rsbx    ovb              ;for (i = 0; i< NC; i++)
      stm     #M,ar0
      ld      *ar1+0,b
      ld      *ar2+,b
      stm     #NC-1,brc
      rptb    Az_repend1-1
      
      ld      *ar2,15,b   ;x = (a[i+1] + a[M-i]) >> 1
      add     *ar1,15,b   ;-> From Q12 to Q11
      
      sub     *ar6+,16,b   ;f1[i+1] = a[i+1] + a[M-i] - f1[i]
      sth     b,*ar6
      
      ld      *ar2+,15,b   ;x = (a[i+1] - a[M-i]) >> 1
      sub     *ar1-,15,b   ;-> From Q12 to Q11
      
      add     *ar7+,16,b   ;f2[i+1] = a[i+1] - a[M-i] + f2[i]
      sth     b,*ar7
Az_repend1:    
      bc      Az_bnov,bnov
      
      st      #_Chebps_10,*sp(18) ;pChebps = Chebps_10
      
      stm     #f1,ar6
      stm     #f2,ar7
      mvdk    *sp(19),ar1
      mvdk    *sp(19),ar2
      
      st      #1024,*ar6       ;f1[0] = 1.0 is in Q10
      st      #1024,*ar7       ;f2[0] = 1.0 is in Q10
      

      ld      *ar1+0,b
      ld      *ar2+,b
      stm     #NC-1,brc
      rptb    Az_bnov-1
      
      ld      *ar2,14,b   ;x = (a[i+1] + a[M-i]) >> 1
      add     *ar1,14,b   ;-> From Q11 to Q10
      
      sub     *ar6+,16,b   ;f1[i+1] = a[i+1] + a[M-i] - f1[i]
      sth     b,*ar6
      
      ld      *ar2+,14,b   ;x = (a[i+1] - a[M-i]) >> 1
      sub     *ar1-,14,b   ;-> From Q11 to Q10
      
      add     *ar7+,16,b   ;f2[i+1] = a[i+1] - a[M-i] + f2[i]
      sth     b,*ar7
Az_bnov:  
    ;find the LSPs using the Chebichev pol. evaluation
      st      #0,*sp(3)    ;nf=0
      st      #0,*sp(4)    ;ip=0
      st      #f1,*sp(16)  ;coef = f1
      
      ld      *ar5+,a       ;xlow = grid[0]
      stl     a,*sp(5)     
      st      #f1,*sp(0)   ;ylow = (*pChebps)(xlow, coef, NC)
      st      #NC,*sp(1)
      ld      *sp(18),b
      cala    b
      stl     a,*sp(6)
      
      st      #0,*sp(2)    ;j = 0
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;while ( (nf < M) && (j < GRID_POINTS) )
Az_while:  
      addm    #1,*sp(2)    ;j =add(j,1)
      ld      *sp(5),b     ;xhigh = xlow
      stl     b,*sp(7)
      ld      *sp(6),b     ;yhigh = ylow
      stl     b,*sp(8)  
      ld      *ar5+,a       ;xlow  = grid[j]
      stl     a,*sp(5)
      ld      *sp(16),b    ;ylow  = (*pChebps)(xlow,coef,NC)
      stl     b,*sp(0)
      ld      *sp(18),b
      cala    b
      stl     a,*sp(6)
      stlm    a,t          ;L_temp = L_mult(ylow ,yhigh)
      mpy     *sp(8),b    
      bc      Az_ninter,bgt
    ;for (i = 0; i < 2; i++)
      stm     #1,brc
      rptb    Az_repend2-1
      ld      *sp(5),-1,a     ;xmid = (xlow + xhigh)/2
      add     *sp(7),-1,a
      stl     a,*sp(9)
      ld      *sp(18),b      ;ymid = (*pChebps)(xmid,coef,NC)
      cala    b
      stl     a,*sp(10)
      stlm    a,t            ;L_temp = L_mult(ylow,ymid)
      mpy     *sp(6),b

      bc      Az_p,bgt     ;if ( L_temp <= (Word32)0)
      ld      *sp(10),a    ;yhigh = ymid
      stl     a,*sp(8)
      ld      *sp(9),a     ;xhigh = xmid
      stl     a,*sp(7)
      b       Az_n
Az_p: 
      ld      *sp(10),a    ;ylow = ymid
      stl     a,*sp(6)
      ld      *sp(9),a     ;xlow = xmid
      stl     a,*sp(5)          
Az_n: 
      nop
Az_repend2:  
      ld      *sp(7),16,b    ;x   = sub(xhigh, xlow)
      sub     *sp(5),16,b
      sth     b,*sp(12)
      ld      *sp(8),16,b    ;y   = sub(yhigh, ylow)
      sub     *sp(6),16,b
      sth     b,*sp(13)
      bc      Az_nz,bneq     ;if(y == 0)
      ld      *sp(5),a       ;xint = xlow
      stl     a,*sp(11)
      b       Az_z
Az_nz:
      sth     b,*sp(14)      ;sign= y
      abs     b              ;y   = abs_s(y)
      exp     b              ;exp = norm_s(y)
      st      t,*sp(15)
      norm    b              ;y   = shl(y, exp)
      sth     b,*sp(13)
      ld      #3fffh,16,b    ;y   = div_s( (Word16)16383, y)
      rpt     #14
      subc    *sp(3),b
      stlm    b,t            ;t0  = L_mult(x, y)
      mpy     *sp(12),b
      ld      *sp(15),a      ;t0  = L_shr(t0, sub(20, exp) )
      sub     #20,a
      stl     a,*sp(0)
      ld      *sp(0),asm
      ld      b,asm,b
      stl     b,*sp(13)      ;y   = extract_l(t0)
      
      ld      *sp(13),16,b   ;if(sign < 0) y = negate(y)
      ld      *sp(14),16,a
      xc      1,alt
      neg     b
      sth     b,*sp(13)
      ld      *sp(6),t     ;result in Q26
      mpy     *sp(13),b     ;t0   = L_mult(ylow, y)
      ld      b,-11,b      ;result in Q15
      ld      b,8,b        ;xint = sub(xlow, extract_l(t0))
      ld      b,8,b
      ld      *sp(5),16,a
      sub     b,a
      ld      a,-16,a
      stl     a,*sp(11)
Az_z: 
      stl     a,*ar3+     ;lsp[nf] = xint
      stl     a,*sp(5)    ;xlow    = xint
      addm    #1,*sp(3)   ;nf =add(nf,1)
      ld      *sp(4),b    ;if(ip == 0)
      bc      Az_nz1,bneq
      st      #1,*sp(4)   ;ip = 1
      st      #f2,*sp(16)  ;coef = f2
      b       Az_z1
Az_nz1:  
      st      #0,*sp(4)    ;ip = 0
      st      #f1,*sp(16)  ;coef = f1 
Az_z1:
      ld      *sp(5),a     ;ylow = (*pChebps)(xlow,coef,NC)
      ld      *sp(16),b
      stl     b,*sp(0)
      ld      *sp(18),b
      cala    b
      stl     a,*sp(6)
          
Az_ninter:   
      ld      *sp(3),b        ;while ( (nf < M) && (j < GRID_POINTS) )
      sub     #M,b
      bc      Az_x_while,bgeq
      ld      *sp(2),b
      sub     #GRID_POINTS,b
      bc      Az_x_while,bgeq
      b       Az_while  
Az_x_while: 
      ld      *sp(3),b      ;if( sub(nf, M) < 0)
      sub     #M,b
      bc      Az_exit,bgeq
      mvdk    *sp(26),ar3
      mvdk    *sp(27),ar4
      rpt     #M-1
      mvdd    *ar4+,*ar3+
Az_exit:  
      frame   20
      popm    ar7
      popm    ar6
      popm    ar1
      popm    st1
      popm    st0
      ret  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      .end   
      

⌨️ 快捷键说明

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