www.pudn.com > g729Decoder.rar > RESIDU.asm


;========================================================================== 
;  File Name 
;  ---------- 
;  RESIDU.ASM 
; 
;  Brief Description of the Code: 
;  ------------------------------ 
;  Compute the LPC residual  by filtering the input speech through A(z). 
; 
;  Ref 
;  ------ 
;  FILTER.C (Residu) 
;========================================================================== 
        .mmregs 
        .include  ../include/const.h 
        .include  ../include/tab_ld8a.h 
        .include  ../include/ld8amem.h 
 
        .text 
        .def      Residu 
        .def      Residu2 
 
;----------------------------------------------------------------------- 
;  Residu 
;----------------------------------------------------------------------- 
;  void Residu( 
;    Word16 a[],    /* (i) Q12 : prediction coefficients                     */ 
;    Word16 x[],    /* (i)     : speech (values x[-m..-1] are needed         */ 
;    Word16 y[],    /* (o)     : residual signal                             */ 
;    Word16 lg      /* (i)     : size of filtering                           */ 
;  ) 
;----------------------------------------------------------------------- 
;  y(n)  = x(n) + ä a[i] * x(n-i)     ; i = 1 -> M 
;----------------------------------------------------------------------- 
;   Pointers : ptr_ai -> a    , use circular buffer of M 
; 
;              ptr_yn -> y 
;              ptr_xn -> x 
; 
; 
;   Input Registers : BRC = lg - 1 
;----------------------------------------------------------------------- 
 
 
        .asg    "AR2", pAiQ12 
        .asg    "AR3", pXn 
        .asg    "AR4", pYn 
 
Residu: 
        STM     #1, AR0 
 
        LD      #1, 12, B              ; rounding 
 
        RPTBD   EndResidu - 1 
        STM     #M, BK 
        LD      #0, A 
 
                ADD     *pXn-, 13, B, A 
                RPT     #M - 1 
                        MAC     *pAiQ12+0%, *pXn-, A 
 
                LD      A, 3, A 
                SAT     A 
                STL     A, -16, *pYn+ 
                MAR     *+pXn(M+2) 
EndResidu: 
        RET 
 
 
;----------------------------------------------------------------------- 
;  Residu2 
;----------------------------------------------------------------------- 
;  void Residu( 
;    Word16 a[],    /* (i) Q12 : prediction coefficients                     */ 
;    Word16 x[],    /* (i)     : speech (values x[-m..-1] are needed         */ 
;    Word16 y[],    /* (o)     : residual signal                             */ 
;    Word16 lg      /* (i)     : size of filtering                           */ 
;  ) 
;----------------------------------------------------------------------- 
;  y(n)  = x(n) + ä a[i] * x(n-i)     ; i = 1 -> M 
;----------------------------------------------------------------------- 
;   Pointers : ptr_ai -> a 
; 
;              ptr_yn -> y 
;              ptr_xn -> x 
; 
; 
;   Input Registers : BRC = lg - 1 
;----------------------------------------------------------------------- 
;   Note : The difference between Residu and Residu2 is that Residu use 
;          circular buffer of M for ptr_ai and Residu2 does not. 
; 
;----------------------------------------------------------------------- 
 
Residu2: 
        MVDM    ptr_ai, pAiQ12 
        MVDM    ptr_xn, pXn 
        MVDM    ptr_yn, pYn 
 
        LD      #1, 12, B              ; rounding 
 
        RPTBD   EndResidu2 - 1 
        STM     #M, AR0 
 
                ADD     *pXn-, 13, B, A 
                RPT     #M - 1 
                        MAC     *pAiQ12+, *pXn-, A 
 
                MAR     *pAiQ12-0 
                LD      A, 3, A 
                SAT     A 
                STL     A, -16, *pYn+ 
                MAR     *+pXn(M+2) 
EndResidu2: 
        RET