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

📄 at0.asm

📁 基于Ti DSP系统进行DTMF拨号的实时检测测算代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	MPY *,AR5       ;A*E*S_OLD
	DMOV *          ;S_OLD'=S
	SACH *,4        ;S'=Xn-B*S-C*S_OLD
	LTP *+,AR4      ;ACC=A*E*S_OLD, TREG0=S'
	MPY *+,AR5      ;A*S'
	LTA *+,AR4      ;A*E*S_OLD+A*S',TREG0=S_OLD'=S
	MPY *+,AR5      ;A*D*S
	APAC            ;A*S'+A*D*S+A*E*S_OLD

	LT *+,AR4       ;TREG0=S
	MPY *+,AR5      ;-B*S
	LTA *,AR4       ;Xn-B*S, TREG0=S_OLD
	MPY *+,AR5      ;-C*S_OLD
	LTA *-,AR4      ;Xn-B*S-C*S_OLD, TREG0=S_OLD
	MPY *,AR5       ;A*E*S_OLD
	DMOV *          ;S_OLD'=S
	SACH *,4        ;S'=Xn-B*S-C*S_OLD
	LTP *+,AR4      ;ACC=A*E*S_OLD, TREG0=S'
	MPY *+,AR5      ;A*S'
	LTA *+,AR4      ;A*E*S_OLD+A*S',TREG0=S_OLD'=S
	MPY *+,AR5      ;A*D*S
	APAC            ;A*S'+A*D*S+A*E*S_OLD

	LT *+,AR4       ;TREG0=S
	MPY *+,AR5      ;-B*S
	LTA *,AR4       ;Xn-B*S, TREG0=S_OLD
	MPY *+,AR5      ;-C*S_OLD
	LTA *-,AR4      ;Xn-B*S-C*S_OLD, TREG0=S_OLD
	MPY *,AR5       ;A*E*S_OLD
	DMOV *          ;S_OLD'=S
	SACH *,4        ;S'=Xn-B*S-C*S_OLD
	LTP *+,AR4      ;ACC=A*E*S_OLD, TREG0=S'
	MPY *+,AR5      ;-A*S'
	LTS *+,AR4      ;A*E*S_OLD+A*S',TREG0=S_OLD'=S
	MPY *+,AR5      ;A*D*S
	APAC            ;A*S'+A*D*S+A*E*S_OLD

	SACH SAMPLE_L,4

	LACC SMPL,8     ;/16
	LT *+,AR4       ;TREG0=S
	MPY *+,AR5      ;-B*S
	LTA *,AR4       ;Xn-B*S, TREG0=S_OLD
	MPY *+,AR5      ;-C*S_OLD
	LTA *-,AR4      ;Xn-B*S-C*S_OLD, TREG0=S_OLD
	MPY *,AR5       ;A*E*S_OLD
	DMOV *          ;S_OLD'=S
	SACH *,4        ;S'=Xn-B*S-C*S_OLD
	LTP *+,AR4      ;ACC=A*E*S_OLD, TREG0=S'
	MPY *+,AR5      ;A*S'
	LTA *+,AR4      ;A*E*S_OLD+A*S',TREG0=S_OLD'=S
	MPY *+,AR5      ;A*D*S
	APAC            ;A*S'+A*D*S+A*E*S_OLD

	LT *+,AR4       ;TREG0=S
	MPY *+,AR5      ;-B*S
	LTA *,AR4       ;Xn-B*S, TREG0=S_OLD
	MPY *+,AR5      ;-C*S_OLD
	LTA *-,AR4      ;Xn-B*S-C*S_OLD, TREG0=S_OLD
	MPY *,AR5       ;A*E*S_OLD
	DMOV *          ;S_OLD'=S
	SACH *,4        ;S'=Xn-B*S-C*S_OLD
	LTP *+,AR4      ;ACC=A*E*S_OLD, TREG0=S'
	MPY *+,AR5      ;A*S'
	LTA *+,AR4      ;A*E*S_OLD+A*S',TREG0=S_OLD'=S
	MPY *+,AR6      ;A*D*S
	APAC            ;A*S'+A*D*S+A*E*S_OLD

	SACH SAMPLE_H,4
			;HIGHPASS FILTER COMPLETED

	LAR AR4,#CTONE
	LACC SMPL,8
	SACH SMPL,4
	LT *+,AR4
	MPY *+,AR6
	APAC
	SUB *-,12
	DMOV *
	SACH *0+,4

	LACL #3
	SAMM BRCR
	RPTB L1-1
	LACC SAMPLE_L,12         ;FORMULA:
	LT *+,AR4                ;Y(n+1)=X(n+1)+2*COS(WiT)*Y(n)-Y(n-1)
	MPY *+,AR6
	APAC
	SUB *-,12
	DMOV *
	SACH *0+,4               ;LOW GROUP
L1:

	LACL #3
	SAMM BRCR
	RPTB L2-1
	LACC SAMPLE_H,12
	LT *+,AR4
	MPY *+,AR6
	APAC
	SUB *-,12
	DMOV *
	SACH *0+,4               ;HIGH GROUP
L2:
	CLRC SXM

	LARP AR7
	LACL *+
	ADD *-,16
	ZPR
	SQRA SMPL
	APAC
	SACL *+
	SACH *+

	LACL *+
	ADD *-,16
	ZPR
	SQRA SAMPLE_L
	APAC
	SACL *+
	SACH *+                  ;LOW GROUP

	LACL *+
	ADD *-,16
	ZPR
	SQRA SAMPLE_H
	APAC
	SACL *+
	SACH *+                  ;HIGH GROUP

RETURN: LACC RCV_SLOT
	ADD #1
	SACL RCV_SLOT
	SUB #16
	BCND STEP2,LT
	SACL RCV_SLOT

	CPL #0,DCSN_SIGN
	BCND BYPASS,TC
	LAR AR5,#S        ;IF RCV_SLOT RETURNS TO 0, RELOAD AR5,AR6 AND AR7.
	LAR AR6,#Y
	LAR AR7,#ENERGY

BYPASS: LACC COUNTER
	ADD RECU_SIGN     ;IF RECU_SIGN IS SET,
			  ;COUNTER IS INCREASED BY ONE EVERY 32 SLOTS.
	DMOV DCSN_SIGN    ;RECU_SIGN=DCSN_SIGN.
	SACL COUNTER
	SUB #LENGTH
	BCND STEP2,LT
	SACL COUNTER
	SACL DCSN_SIGN    ;IF(COUNTER>=LENGTH),ZERO DCSN_SIGN & RECU_SIGN.
	SACL RECU_SIGN

STEP2:  LAR AR3,AR3TEMP   ;LOAD AR3 AND AR4 BEFORE RETURNING FROM ISR.
	LAR AR4,AR4TEMP

	RETE

;****************************************************************************
CLR:    ZAP                     ;CLR ROUTINE
	LARP AR5                ;ZERO S,Y AND ENERGY OF CORRESPONDING SLOT.
	RPT #9
	SACL *+
	LARP AR6
	RPT #17
	SACL *+
	LARP AR7
	RPT #5
	SACL *+
	B RETURN
;****************************************************************************
DCSN:   SPLK #0,DS

LOOP1_START:
	LACC DS,1
	ADD OE_FLAG
	SACL DCSN_SLOT

	LACC DS,2
	ADD DS,1
	ADD #ENERGY
	SAMM AR7

	LACC DS,4
	ADD DS,1
	ADD #Y
	SAMM AR6

	LARP AR7
	LACL #7
	SAMM TREG1

	SPLK #0,MARK

	LACL *+
	ADD *+,16,AR4
	SATL
	SACL TE
	SUB #THRES
	BCND KEEP1,LT
	SUB #ST
	BCND KEEP1,GT

	LAR AR4,#CTONE

	LT *+,AR6       ;ENV=Y(n)*Y(n)+Y(n-1)*Y(n-1)-2*COS(wT)*Y(n)*Y(n-1).
	MPY *+
	LTP *-
	SACH TEMPX,4    ;TEMPX=Y(n)*COS(wT).
	MPY TEMPX
	LACL #0
	SQRS *+         ;ACC=2*COS(wT)*Y(n)*Y(n-1).
	SQRA *+,AR7
	APAC
	LT TE
	MPY WEIGHT
	SPAC
	BCND KEEP,LT
	SPLK #1,MARK

KEEP:   LACC DCSN_SLOT
	ADD  MARK,8
	SACL TEMPX
	OUT TEMPX,51H

DTMF:   LACL *+
	ADD *,16
	SATL              ;ENERGY_L/64
	SACL *+
	SUB #THRES        ;THRESHOLD USED TO ENSURE >-23dB SIGNAL LEVEL (L)
	BCND RETURN1,LT
	SUB #ST
	BCND RETURN1,GT

	LACL *+
	ADD *-,16
	SATL              ;ENERGY_H/64
	SACL *-
	SUB #THRES        ;THRESHOLD...................................(H)
	BCND RETURN1,LT
	SUB #ST
	BCND RETURN1,GT

	LAR AR4,#COS_L
	LAR AR0,#0FFFFH
	LARP AR4
	ZAP
	SACB

	SPLK #3,LOOPC   
LOOP2:  LT *+,AR6       ;ENV=Y(n)*Y(n)+Y(n-1)*Y(n-1)-2*COS(wT)*Y(n)*Y(n-1).
	MPY *+
	LTP *-
	SACH TEMPX,4    ;TEMPX=Y(n)*COS(wT).
	MPY TEMPX
	LACL #0
	SQRS *+         ;ACC=2*COS(wT)*Y(n)*Y(n-1).
	SQRA *+,AR0
	APAC
	CRGT
	MAR *+,AR4
	BCND P2,NC
	SAR AR0,GET_L  ;SEARCH FOR THE ROW INDEX WITH THE LARGEST ENV.
P2:
	LACL LOOPC
	SUB #1
	SACL LOOPC
	BCND LOOP2,GEQ

	LACC #WEIGHT_L   ;ENV_L*2>u*ENERGY_L/64*64*LENGTH_L
	ADD GET_L        ;WEIGHT_L=u*64*LENGTH_L/2
	SAMM AR3
	LARP AR7
	LT *+,AR3
	MPY *,AR7
	LACB
	SPAC
	BCND RETURN1,LT

	LACB            ;ENV_L>ENERGY_H*DBHL
	LT *
	MPY DBHL
	SPAC
	BCND RETURN1,LT

	LAR AR0,#0FFFFH
	LARP AR4
	ZAP
	SACB

	SPLK #3,LOOPC
LOOP3:  LT *+,AR6
	MPY *+
	LTP *-
	SACH TEMPX,4
	MPY TEMPX
	LACL #0
	SQRS *+
	SQRA *+,AR0
	APAC
	CRGT
	MAR *+,AR4
	BCND P3,NC
	SAR AR0,GET_H
P3:
	LACL LOOPC
	SUB #1
	SACL LOOPC
	BCND LOOP3,GEQ

	LACC #WEIGHT_H
	ADD GET_H
	SAMM AR3
	LARP AR7
	LT *-,AR3
	MPY *,AR7
	LACB
	SPAC
	BCND RETURN1,LT

	LACB
	LT *
	MPY DBLH
	SPAC
	BCND RETURN1,LT
			   ;PASSED ALL THRESHOLDS.
	LACC DCSN_SLOT
	SAMM TREG1
	SPLK #1,TEMPX
	LACT TEMPX
	AND SIGN
	BCND LOOP1_END,NEQ
	LACT TEMPX
	OR SIGN
	SACL SIGN        ;IF THE STATE OF THE CURRENT SLOT IS ON,DO NOTHING;
			 ;ELSE STORE THE DETECTED NUMBER INTO "SEQ" BUFFER.
	LACC GET_L,2
	ADD GET_H
	ADD #DIGIT
	SAMM AR3
	LARP AR3
	NOP
	LACC *
	ADD DCSN_SLOT,4
	LAR AR2,SEQUENCE_END
	LARP AR2
	SACL *+
	SAR AR2,SEQUENCE_END  ;UPDATE END POINTER
	B LOOP1_END

RETURN1:LACC DCSN_SLOT
	SAMM TREG1
	SPLK #1,TEMPX
	LACT TEMPX
	CMPL
	AND SIGN
	SACL SIGN             ;CHANGE THE STATE TO "OFF".

LOOP1_END:
	LACL DS
	ADD #1
	SACL DS
	SUB #8
	BCND LOOP1_START,LT

	XPL  #1,OE_FLAG       ;ALTER OE_FLAG.
	SPLK #1,DCSN_SIGN     ;SET DCSN_SIGN.
	LARP AR2

	RET

KEEP1:  LARP AR6
	MAR *0+,AR7
	B KEEP
	      
	.label CONTENT_END
	.end

⌨️ 快捷键说明

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