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