📄 lpc.asm
字号:
SFTA A, 15
MPYA *pRCoef
LD B, -16, A ; to be bit-exact with C code
LD A, 2, A
SQURA *pRCoef, A ; A = k ** 2
ABS A
LD #07fffh, 16, B
OR #0ffffh, B ; B = 0x7fffffff
SUB A, B
; LD B, A ; A = 1 - K ** 2
LD B, -1, B
LD B, 1, B
DST B, *+pRCoef
; MAR *pAlpha+
LD #0, B
LD #0, A
MAC *pRCoef+, *pAlpha, A
MACSU *pRCoef-, *pAlpha+, B
LD B, -16, B
LD B, -1, B
LD B, 1, B
ADD B, A
LD #0, B
MACSU *pAlpha-, *pRCoef, B
LD B, -16, B
LD B, -1, B
LD B, 1, B
ADD A, B
LD #31, A
EXP B
AND ST1, A ; A = ASM
NORM B
ADD T, A
DST B, *pAlpha
LD AL, ASM
; S = 0
; for(j=1; j<=i-1; j++)
; S += R[j] * A[i - j]
; S += R[i]
LD #8, A
MVMM pLPC2Q27, pLPC1Q27
SUB AR_Counter, A
MAR *pLPC1Q27+ ; pLPC1Q27 -> A[i - 1]_lo
STLM A, BRC
STM #Addr_CorrCoef1 + 2, pAutoCorr ; pAutoCorr -> R[1]_hi
LD #0, B
RPTB EndBlk_S - 1
LD #0, A
MACSU *pLPC1Q27-, *pAutoCorr, A ; A = A[i - j]_lo * R[j]_hi
LD A, -16, A
LD A, -1, A
LD A, 1, A
ADD A, B
MAC *pAutoCorr+, *pLPC1Q27, B ; pLPC1Q27 -> A[i - j - 1]_lo
LD #0, A
MACSU *pAutoCorr+, *pLPC1Q27-, A ; A += A[i - j]_hi * R[j]_lo
LD A, -16, A
LD A, -1, A
LD A, 1, A
ADD A, B
EndBlk_S:
SFTA B, 4
DADD *pAutoCorr, B ; S += R[i]
; K = -S / Alpha
STL B, -16, AR_Sign
CALLD DIV32B
ABS B
DST B, *pRCoef ; *pRCoef = numerator
LD AR_Sign, B
LD A, ASM, A ; normalize K
MVMM AR_LPC_Index, pLPC1Q27
XC 1, BGEQ
NEG A
LD A, -1, A
LD A, 1, A
DST A, *pRCoef
; Test for unstable filter
SUB #32750, 16, A
BC KeepGoing, ALEQ ; if unstable, keep old value
RET
; if(i == even)
; A [i >> 1] = An[i >> 1] = A[i >> 1] + K * A[i >> 1]
;
; for(j=(i-1)>>1; j>=1; j--)
; {
; A = A[j] + K * A[i - j]
; B = A[i - j] + K * A[j]
; A[j] = An[j] = A
; A[i - j] = An[i - j] = B
; }
KeepGoing:
LD #1, A
AND AR_Counter, A
MAR *pRCoef+ ; pRCoef -> K_lo
BCD iOdd, ANEQ
MVMM AR_LPC_Index, pLPC2Q27 ; pLPC2Q27 -> A[(i+1) >> 1]
DLD *pLPC1Q27-, B ; pLPC1Q27 -> A[(i-1) >> 1]
DLD *AR_LPC_Index+, B
LD #0, A
LD #0, B
MACSU *pRCoef-, *pLPC2Q27, A ; A = K_lo * A[i >> 1]_hi
LD A, -16, A
LD A, -1, A
LD A, 1, A
MAC *pRCoef, *pLPC2Q27+, A ; pRCoef -> K_lo
MACSU *pLPC2Q27-, *pRCoef+, B ; A += K_hi * A[i >> 1]_lo
LD B, -16, B
LD B, -1, B
LD B, 1, B
ADD B, A
DADD *pLPC2Q27, A ; A += A[i >> 1]
DST A, *pLPC2Q27+
iOdd:
LD #7, A
SUB AR_Counter, A
BCD NewLPCoef, ALT
LD A, -1, B
STLM B, BRC
NOP
RPTB NewLPCoef - 1
LD #0, A
LD #0, B
MACSU *pRCoef, *pLPC2Q27+, A ; A = K_lo * A[i - j]_hi
LD A, -16, A
LD A, -1, A
LD A, 1+1, A
LD A, 16-1, A
MACSU *pRCoef-, *pLPC1Q27+, B ; B = K_lo * A[j]_hi
LD B, -16, B
LD B, -1, B
LD B, 1 +1, B
LD B, 16-1, B
MACSU *pLPC2Q27-, *pRCoef, A ; A += K_hi * A[i - j]_lo
LD A, -16, A
LD A, -1, A
LD A, 1, A
MACSU *pLPC1Q27-, *pRCoef, B ; B += K_hi * A[j]_lo
LD B, -16, B
LD B, -1, B
LD B, 1, B
MAC *pRCoef , *pLPC2Q27, A
MAC *pRCoef+, *pLPC1Q27, B ; pRCoef -> K_lo
DADD *pLPC1Q27, A ; A += A[j]
DADD *pLPC2Q27, B ; B += A[i - j]
DST A, *pLPC1Q27- ; pLPC1Q27 -> A[j - 1]_hi
DST B, *pLPC2Q27+ ; pLPC2Q27 -> A[i - j + 1]_hi
NewLPCoef:
; _________ An[i]=K __________
MAR *pRCoef- ;
DLD *pRCoef, A
SFTA A, -4 ; Q31 -> Q27
;1998/11/20
LD A, -1, A
LD A, 1, A
;1998/11/20
DST A, *pLPC2Q27
BANZ UpdateLPCoef, *AR_Counter-
STM #M - 1, BRC
STM #Addr_LPCoefQ27, pLPC1Q27
LD #1, 14, B
RPTBD EndUpdateCoef - 1
STM Addr_lpc_coefQ12, pLPCQ12
DADD *pLPC1Q27+, B, A
STL A, -15, *pLPCQ12+
EndUpdateCoef:
LD #0, A
RET
;----------------------------------------------------
; DIV32B : 32 bit fractional division
; abs(NUMER)<=abs(DENOM), DENOM>0, NUMER>=0
;
; input :
; NUMER(32) = | Nhi(16) | Nlo(16) |
; DENOM(32) = | Dhi(16) | Dlo(16) |
;
; AR4 -> Nhi
; AR5 -> Dhi
;
; output :
; if ((DENOM>0) && (NUMER>0))
; A = QUOT(32)
; else A = 0
;
; Modified Registers : AR3, AR5
;----------------------------------------------------
.def DIV32B
.asg "Addr_local_buf1 + 128", L_32
.asg "AR3", pB
.asg "AR3", pL_32
.asg "AR4", pNum
.asg "AR5", pDen
DIV32B:
DLD *pDen, B
LD #0, A
RC BLEQ
;DIV16
LD #03fffh, 16, B ; approx = div_s( (Word16)0x3fff, denom_hi);
RPT #15-1
SUBC *pDen, B ; BL = approx
STLM B, T ; T = approx >= 0 since Den > 0
RSBX FRCT ; to be bit-exact with C code
;MPY32_16
MAR *pDen+ ; L_32 = Mpy_32_16(denom, approx)
MPYU *pDen-, A
LD A, -16, A
MAC *pDen, A
LD #04000h, 16, B
SUB #1, B
SUB A, B ; Q29
SSBX FRCT ; to be bit-exact with C code
STM #BL, pB
;MPY32_16
MPYU *pB+, A
LD A, -16, A
MAC *pB-, A ; A = L_32
LD A, 1, A ; Q28 -> Q29, to be bit-exact with C code
STM #L_32, pL_32
DST A, *pL_32
MAR *pL_32+
;MPY32
LD #0, A
LD #0, B
MACSU *pL_32-, *pNum+, A
LD A, -16, A
LD A, -1, A ; to be bit-exact with C code
Ld A, 1, A
MACSU *pNum-, *pL_32 , B
LD B, -16, B
LD B, -1, B ; to be bit-exact with C code
Ld B, 1, B
ADD B , A
RETD
MAC *pL_32, *pNum, A
LD A, 2, A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -