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

📄 pitch_a.asm

📁 G.729协议压缩的语音传输程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
  sub    #80,16,a
  bc     pitch_olsecond_rep,alt
  ;;;;;;;;;;;;;;;;;;;;
  ;Test around max3
  ;;;;;;;;;;;;;;;;;;;;
  ld     *sp(11),a       ;i=T3+1
  add    #1,a
  stl    a,*sp(0)       
  ld     *sp(20),a
  sub    *sp(0),a
  stlm   a,ar5         ;ar5--&scal_sig[-(T3+1)]
  
  mvdk   *sp(20),ar4    ;ar4--scal_sig
  ld     #0,a           ;sum = 0

  mvdk   *sp(1),brc      ;for (j=0; j<L_frame; j+=2)
  ssbx   braf
  rptb   pitch_olthird1-1
  ld     *ar4+0,t
  mac    *ar5+0,a
pitch_olthird1:
  max    b                   ;L_temp = L_sub(sum, max)
  ld     *sp(11),a            ;if (L_temp > 0) { max = sum; T3 = i;   }
  nop
  xc     1,nc
  ld     *sp(0),a
  stl    a,*sp(11)  
  
  
  addm   #-2,*sp(0)     
  ld     *sp(20),a
  sub    *sp(0),a
  stlm   a,ar5         ;ar5--&scal_sig[-(T3-1)]
  
  mvdk   *sp(20),ar4    ;ar4--scal_sig
  ld     #0,a           ;sum = 0

  mvdk   *sp(1),brc      ;for (j=0; j<L_frame; j+=2)
  ssbx   braf
  rptb   pitch_olthird2-1
  ld     *ar4+0,t
  mac    *ar5+0,a
pitch_olthird2:
  max    b                   ;L_temp = L_sub(sum, max)
  ld     *sp(11),a            ;if (L_temp > 0) { max = sum; T3 = i;   }
  nop
  xc     1,nc
  ld     *sp(0),a
  stl    a,*sp(11)    
  
  ;;;;;;;;;;;;;;;;;;;;;;;;
  ;compute energy of maximum
  ;;;;;;;;;;;;;;;;;;;;;;;;
  
  sth    b,*sp(5)           ;L_Extract(max, &max_h, &max_l)
  sub    *sp(5),16,b
  ld     b,-1,b
  stl    b,*sp(6)
  ;compute energy of maximum
  ld     *sp(20),a
  sub    *sp(11),a
  stlm   a,ar4       ;p = &scal_sig[-T3]
  
  
  ld     #1,b        ;sum = 1
  
  rpt   *sp(1)         ;for(i=0; i<L_frame; i+=2, p+=2)
  squra  *ar4+0,b
  ;max3 = max/sqrt(energy)
  ;This result will always be on 16 bits 
  ld    b,a
  call  Inv_sqrt    ;sum = Inv_sqrt(sum), result in Q30
  sth   a,*sp(7)     ;L_Extract(sum, &ener_h, &ener_l)
  sub   *sp(7),16,a
  ld    a,-1,a
  stl   a,*sp(8)
  
  ld    *sp(5),t     ;sum  = Mpy_32(max_h, max_l, ener_h, ener_l)
  mpy   *sp(7),b
    
  mpy     *sp(8),a
  add     a,-15,b
    
  ld      *sp(6),t
  mpy     *sp(7),a
  add     a,-15,b
  
  stl     b,*sp(4)   ;max3 = extract_l(sum)  
  ;;;;;;;;;;;;;;;;;;;
  ;Test for multiple
  ;;;;;;;;;;;;;;;;;;;
  ;if( abs(T2*2 - T3) < 5)
  ;max2 += max3 * 0.25
  ld      *sp(10),16,a
  ld      a,1,a
  sub     *sp(11),16,a
  abs     a
  sub     #5,16,a
  ld      *sp(3),16,b
  nop
  xc      2,alt
  add     *sp(4),14,b
  sth     b,*sp(3)
  ;if( abs(T2*3 - T3) < 7)
  ; max2 += max3 * 0.25
  ld      *sp(10),16,a
  ld      a,1,a
  sub     *sp(11),16,a
  add     *sp(10),16,a
  abs     a
  sub     #7,16,a
  ld      *sp(3),16,b
  nop
  xc      2,alt
  add     *sp(4),14,b
  sth     b,*sp(3)
  ;if( abs(T1*2 - T2) < 5)
  ;max1 += max2 * 0.20
  ld      *sp(9),16,a
  ld      a,1,a
  sub     *sp(10),16,a
  abs     a
  sub     #5,16,a
  ld      *sp(2),16,b
  stm     #6554,t
  xc      2,alt
  mac     *sp(3),b
  sth     b,*sp(2)  
  ;if( abs(T1*3 - T2) < 7)
  ;max1 += max2 * 0.20
  ld      *sp(9),16,a
  ld      a,1,a
  sub     *sp(10),16,a
  add     *sp(9),16,a
  abs     a
  sub     #7,16,a
  ld      *sp(2),16,b
  stm      #6554,t
  xc      2,alt
  mac     *sp(3),b
  sth     b,*sp(2)  
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;Compare the 3 sections maxima
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ld      *sp(2),16,b
  ld      *sp(3),16,a
  max     b
  ld      *sp(9),a
  nop
  xc      1,nc
  ld      *sp(10),a

  sub     *sp(4),16,b
  nop
  nop
  xc      1,blt
  ld      *sp(11),a
  
                ;return T1
   frame   22
   
   popm  ar7
   popm  ar6
   popm  ar5
   popm  ar4
   popm  ar3
   popm  ar2
   popm  ar1
   popm  ar0
   popm  st1
   popm  st0
   
      ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Word32 Dot_Product(      /* (o)   :Result of scalar product. */
;       Word16   x[],     /* (i)   :First vector.             */
;       Word16   y[],     /* (i)   :Second vector.            */
;       Word16   lg       /* (i)   :Number of point.          */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Dot_Product:
    pshm  ar2
    pshm  ar3   
                ;*sp(3)--y,*sp(4)--lg
    
    stm   #Dn,ar2  ;ar2--x--Dn
    mvdk  *sp(3),ar3   ;ar2--y
    
    ld    #0,b
    addm  #-1,*sp(4)
    rpt   *sp(4)
    mac   *ar2+,*ar3+,b
    ld    b,a

    popm  ar3
    popm  ar2
    ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Fast version of the pitch close loop
;Word16 Pitch_fr3_fast(/* (o)     : pitch period.                          */
;  Word16 exc[],       /* (i)     : excitation buffer                      */
;  Word16 xn[],        /* (i)     : target vector                          */
;  Word16 h[],         /* (i) Q12 : impulse response of filters.           */
;  Word16 L_subfr,     /* (i)     : Length of subframe                     */
;  Word16 t0_min,      /* (i)     : minimum value in the searched range.   */
;  Word16 t0_max,      /* (i)     : maximum value in the searched range.   */
;  Word16 i_subfr,     /* (i)     : indicator for first subframe.          */
;  Word16 *pit_frac    /* (o)     : chosen fraction.                       */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Pitch_fr3_fast:
   pshm   st0
   pshm   st1
   pshm   ar2
   frame  -12   ;*sp(0)--arg1,*sp(1)--arg2,*sp(2)--arg3,*sp(3)--t,*sp(4)--t0
                ;*sp(5)(6)--max,*sp(7)(8)--corr,*sp(9)(10)--L_temp,*sp(11)--arg0
                ;*sp(16)--xn,*sp(17)--h,*sp(18)--L_subfr,*sp(19)--t0_min
                ;*sp(20)--t0_max,*sp(21)--i_subfr,*sp(22)--pit_frac
   ssbx  ovm
   ssbx  sxm
   ssbx  frct
   
   stl   a,*sp(11)
   
   ld    *sp(16),b
   stl   b,*sp(0)
   stm   #Dn,*sp(1)
   ld    *sp(17),a
   call  Cor_h_X
   
   ld    #8000h,16,b  ;max = MIN_32
   dst   b,*sp(5)
   ld    *sp(19),b    ;t0 = t0_min
   stl   b,*sp(4)
   
   stl   b,*sp(3)     ;t=
   ld    *sp(11),b
   sub   *sp(19),b
   stl   b,*sp(0)     ;arg1
   ld    *sp(18),b
   stl   b,*sp(1)     ;arg2
   ld    *sp(20),b
   sub   *sp(19),b
   stlm  b,brc
   ssbx  braf
   rptb  pitch_fr3_rep1-1  ;for(t=t0_min; t<=t0_max; t++)
   
   call  Dot_Product      ;corr = Dot_Product(Dn, &exc[-t], L_subfr)  
   dld    *sp(5),b
   max   b
   dst   b,*sp(5)
   ld    *sp(4),a
   xc    1,nc
   ld    *sp(3),a
   stl   a,*sp(4)
   addm  #1,*sp(3)
   addm  #-1,*sp(0)
pitch_fr3_rep1:
 ;;;;;;;;;;;;;;;;;;;;;;
 ;Test fractions
 ;;;;;;;;;;;;;;;;;;;;;;
 ;Fraction 0
   ld    *sp(4),a
   stl   a,*sp(0)
   stm   #0,*sp(1)
   ld    *sp(18),a
   stl   a,*sp(2)
   ld    *sp(11),a
   call  Pred_lt_3
   
   ld    *sp(11),a
   stl   a,*sp(0)
   ld    *sp(18),a
   stl   a,*sp(1)
   call  Dot_Product
   dst   a,*sp(5)
     
   
   frame  12
   popm   ar2
   popm   st1
   popm   st0
   ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      .end               

⌨️ 快捷键说明

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