📄 tdurbin.asm
字号:
.version 50
.mmregs
.DEF P10,P10_1,TEMP,CORFLAG,STACK,DIVISOR,SIGNFLAG,ALPHA,BETA,ACCBUF
.GLOBAL COR,RC,TMP,SIGNAL,FLEN,HFLEN_1,HFLEN,P10_2
.OPTION X
.BSS ALPHA,2
.BSS BETA,2
.BSS LPC,10
.bss RC,10
.BSS COR,11*2 ;COR[11] long type
.BSS TMP,10
.BSS TEMP,1
.BSS CORFLAG,1
.BSS STACK,2
.BSS DIVISOR,1
.BSS SIGNFLAG,1
.bss ACCBUF,2
.bss SIGNAL,240
;----------
FLEN .SET 240
HFLEN .SET 120 ;FLEN/2
HFLEN_1 .SET 120-1
P10 .SET 10
P10_1 .SET 9
P10_2 .SET P10-2
;-----------
.data
.DEF TDURBIN,TCOR,S0,LPC
TCOR .long 1442262
.long 1117903, 627731, 397508, 134118, -237767, -413527, -415729, -399529, -272490, -66647
;----------
.text
CALL C50_INIT
call DURBIN
here: NOP
B here
DURBIN
SPM 0
LDP #CORFLAG
LACC #0
SACL CORFLAG ;CORFLAG=0
LACC #3
SAMM INDX ;INDX=3
LAR AR0,#LPC
LAR AR1,#COR+1
LAR AR2,#RC
LACC #P10_1
SAMM BRCR
;---test for c0>fabs(c[i])-----------
MAR *,AR1 ;AR1->high 16 bits
LACC *-,16
OR *0+
SACB
RPTB DURBIN_1A-1
LACC *-,16
OR *0+
ABS
CRGT ;IF C0<=C THEN C=1
BCND DURBIN_1,C
DURBIN_1A
B DURBIN_2
DURBIN_1
LAMM PMST
AND #0FFFEH ;CLR BRAF(block repeat active flag)
SAMM PMST
LACC #1
SACL CORFLAG ;CORFLAG=1
RET
;------------
;****** alpha = c0; *a = rc[0] = -*c / c0; beta = *c ---******
DURBIN_2
LAR AR1,#COR+1
MAR *,AR1
LACC *-,16
OR *0+
SACL ALPHA ;alpha=c0=C[0];
SACH ALPHA+1
EXAR
LACC *-,16 ; beta=*c=C[1],AR1=c[1]=C[2]
OR *0+
SACL BETA
SACH BETA+1
EXAR ;ACC=c0,ACCB=c[1],
;LONGDIV=ACCB/ACC
NEG
CALL LONGDIV
MAR *,AR2 ;ar0->pc ,ar2->rc
SACL *,0,AR0 ; *a=rc[0]=-C[1]/C[0]
SFR
SFR
SACL *,0,AR0 ;LPC: 3.13
;--------- for (i = 1; i < n; i++)----------
;----------alpha = alpha + beta * rc[i - 1];
;----------beta = *(c+i);
;---------AR1->*(c+1)-------------------------------
LAR AR7,#P10_2
;//alpha = alpha + beta * rc[i - 1],AR2(->RC) +1 AT HERE---------
DURBIN_3
LACC BETA+1,16
OR BETA
CALL AJUST ;AR4 store exponent, t2>>=bp
SAMM TREG0
LACC #15
SAMM TREG1
MAR *,AR2 ;AR2->RC[0]
MPY *+,AR1 ;AR2->RC[1],ARP->1
PAC
SATL ;TREG1=15, ACC>>15
;-------
SACB;
LDP #0
LAMM AR4;
BCND DURBIN_3B,NEQ;
B DURBIN_3C
DURBIN_3B;
SUB #1 ;AR4-1
SAMM AR4
LACB;
RPT AR4
SFL
SACB
DURBIN_3C
LDP #ALPHA
LACC ALPHA+1,16
OR ALPHA
ADDB
BCND DURBIN_3A,NEQ
LACC #1 ;if(alpha==0) alpha=1 //wht
DURBIN_3A
SACL ALPHA
SACH ALPHA+1 ;alpha = alpha + beta * rc[i - 1];
;--------beta = *(c+i) ARP->1
MAR *,AR1 ;AR1->C[2]
LACC *-,16
OR *
SACL BETA
SACH BETA+1
SACB
;---ACCB=BETA-----------------------------
;------for (j = 0; j <= i - 1; j++) beta = beta + *(c+j) * *(a+i-j-1);
;---------------------------------
LAMM AR0 ;AR0->STACK
PUSH
LAMM AR7
SUB #P10_2
ABS
SACL TEMP
SAMM BRCR
LACC #13
SAMM TREG1
;LDP #0
LAR AR1,#COR+3
RPTB DURBIN_4-1
MAR *,AR1
LACC *-,16
OR *0+
CALL AJUST ;ACCB NOT be modified
SAMM TREG0
MAR *,AR0 ;AR0->LPC[0] AT LAST
MPY *-
PAC
SATL ;TREG1=13, ACC>>13
LDP #ACCBUF
SACL ACCBUF
SACH ACCBUF+1
LAMM AR4
BCND DURBIN_3D,EQ
SUB #1
SAMM AR4 ;AR4-1
LACC ACCBUF+1,16
OR ACCBUF
LDP #0
RPT AR4 ;NEED DP=0
SFL
B DURBIN_3E
DURBIN_3D
LDP #ACCBUF
LACC ACCBUF ;ACC<0X7FFF
DURBIN_3E
ADDB
SACB
DURBIN_4
MAR *,AR1
ADRK #2
LDP #BETA
SACL BETA
SACH BETA+1
;----------------------------------------
;---------------------rc[i] = -beta / alpha;
;-------if(|beta|>|alpha|) corflag=1---------------------------------
ABS
SACB
LACC ALPHA+1,16
OR ALPHA
ABS
CRGT
BCND DURBIN_5,C
LACC #1 ;|RC[]|>1 CORFLAG=1
SACL CORFLAG
RET
DURBIN_5
LACC BETA+1,16
OR BETA
SACB
LACC ALPHA+1,16
OR ALPHA
NEG
CALL LONGDIV
MAR *,AR2
SACL *,0,AR0
;-------for (j = 0; j <= i - 1; j++) tmp[j] = rc[i] * *(a+i-j-1);
LAR AR6,#TMP ;TMP :3.13
SAMM TREG0
LDP #TEMP
LACC TEMP
SAMM BRCR
POP
SAMM AR0 ;AR0->*(a+i-1)
RPTB DURBIN_6-1
MPY *-,AR6
PAC
SACH *+,1,AR0
DURBIN_6
;-----for (j = 0; j <= i - 1; j++) *(a+j) = *(a+j) + tmp[j];
;-------ARP=0------------------------------
LAR AR6,#TMP
LAR AR0,#LPC
LACC TEMP
SAMM BRCR
RPTB DURBIN_7-1
LACC *,0,AR6
ADD *+,0,AR0
SACL *+
;NOP
NOP
DURBIN_7
;-------*(a+i) = rc[i];-------------------
MAR *,AR2
LACC *,0,AR0
SFR
SFR ;1.15->3.13
SACL *,0,AR7
DURBIN_8
BANZ DURBIN_3,*-
RET
; if (c0 <= 0.0)
; { for (i = 0; i < n; i++) rc[i] = 0.0;
; return; }
; alpha = c0; *a = rc[0] = -*c / c0; beta = *c;
; for (i = 1; i < n; i++)
; { alpha = alpha + beta * rc[i - 1];
; if(alpha==0)alpha=1;//wht
; beta = *(c+i);
; for (j = 0; j <= i - 1; j++) beta = beta + *(c+j) * *(a+i-j-1);
; rc[i] = -beta / alpha;
; for (j = 0; j <= i - 1; j++) tmp[j] = rc[i] * *(a+i-j-1);
; for (j = 0; j <= i - 1; j++) *(a+j) = *(a+j) + tmp[j];
; *(a+i) = rc[i];
; }
;--------------------------
.include "c50_init.asm"
.include "getcor.asm"
.include "longdiv.asm"
.INCLUDE "AJUST.ASM"
; .INCLUDE "DURBIN.ASM"
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -