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

📄 dtmfasm.s54

📁 Express DSP compliant C55x DTMF detector software is proposed in two versions: one with a 5 ms frame
💻 S54
📖 第 1 页 / 共 2 页
字号:
*-------------------------------------------------------------------------*
*                                                                         *
*   THIS IS AN UNPUBLISHED WORK CONTAINING CONFIDENTIAL AND PROPRIETARY   *
*   INFORMATION.  IF PUBLICATION OCCURS, THE FOLLOWING NOTICE APPLIES:    *
*      "COPYRIGHT 2001 MIKET DSP SOLUTIONS, ALL RIGHTS RESERVED"          *
*                                                                         *
*-------------------------------------------------------------------------*
    .mmregs
    .include "dtmfi.h54"

    .sect	".dtmfd"
__apsLoDev		.word	_dtmf_a697,  _dtmf_a770,  _dtmf_a852,  _dtmf_a941
__apsHiDev		.word   _dtmf_a1209, _dtmf_a1336, _dtmf_a1477, _dtmf_a1633
__aasLoDevFlt	.word 23220, 77,    18493, 90,    14473, 112, 11353, 139
__aasHiDevFlt	.word 16916, 100,   12640, 115,   9888,  139, 7614,  175
	.sect 	".dtmfp"
_dtmf_as2k		.word 1230,  -2060, 3472, -6516, 20712
				.word 20712, -6516, 3472, -2060, 1230

	.text

;-------------------------------------------------------------------------
en2log		.macro added
;-------------------------------------------------------------------------
	add		#1, a
	exp		a
	ld		#(0x780+added), b
	norm	a
	ld		a, -16, a
	add		a, -5, b
	mac		#-512, b, a
	.endm


;-------------------------------------------------------------------------
	.global _dtmf_en2log
_dtmf_en2log
;-------------------------------------------------------------------------
;	S32 slEn 	= a
;
; function returns
;	a  =  energy in log 
;
	ssbx	sxm
	add		#1, a
	exp		a
	ld		#0x780, b
	norm	a
	ld		a, -16, a
	add		a, -5, b
	mac		#-512, b, a
	ret


;-------------------------------------------------------------------------
	.global _dtmf_move_data_in
_dtmf_move_data_in
;-------------------------------------------------------------------------
;DTMF_tDb *pDb,		= ac0
;DTMF_tSc *pSc,		= sp(1)
;S16 *psIn			= sp(2)
;
	stlm	a, ar5
	ssbx	sxm
	nop
	mvdk	*sp(1), ar3
	mvdk	*sp(2), ar4
	mvmm	ar5, ar2
	
	st 		#0, *ar3(#(DTMF_tSc.sTestFailed));

	mar 	*+ar3(#(DTMF_tSc.as2kData));
	mar		*+ar2(#(DTMF_tDb.as2kDataSav));
	rpt 	#(DTMF_2KFLT_SZ-1)
		mvdd	*ar2+, *ar3+

	stm		#(IDTMF_FR_SZ-1), brc
	rptb	dtmf_move_data_in1-1
		ld   *ar4+, -3, a
		stl	 a, *ar3+
dtmf_move_data_in1	

	mvmm	ar5, ar2
	mvdk	*sp(1), ar3
	mar		*+ar2(#(DTMF_tDb.asBpDataSav));
	mar 	*+ar3(#(DTMF_tSc.asBpData));
	rpt 	#(DTMF_BPFLT_SZ-1)
		mvdd	*ar2+, *ar3+

	mvmm	ar5, ar2
	mvdk	*sp(1), ar3
	mar		*+ar2(#(DTMF_tDb.asLoDataSav));
	mar 	*+ar3(#(DTMF_tSc.asLoData));
	rpt 	#(DTMF_LOSD_SZ-1)
		mvdd	*ar2+, *ar3+

	.if (IDTMF_FR_SZ != 80)
	mvmm	ar5, ar2
	mvdk	*sp(1), ar3
	mar		*+ar2(#(DTMF_tDb.asHiDataSav));
	mar 	*+ar3(#(DTMF_tSc.asHiData));
	rpt 	#(DTMF_HISD_SZ-1)
		mvdd	*ar2+, *ar3+
	.endif
	
	mvmm	ar5, ar2
	mar		*+ar2(#(DTMF_tDb.v.asSumEn+4));
	rpt		#(5-1)
		delay	*ar2-
		
	ret
;-------------------------------------------------------------------------
	.global _dtmf_2k_filter
_dtmf_2k_filter
;-------------------------------------------------------------------------
;DTMF_tDb *pDb,		= ac0
;DTMF_tSc *pSc,		= sp(1)
;
	ssbx	sxm
	mvdk	*sp(1), ar2		; psPos
	mvdk	*sp(1), ar3		; psCentre
	mar		*+ar2(#(DTMF_tSc.as2kData))
	mar		*+ar3(#(DTMF_tSc.as2kData+DTMF_2KFLT_HSZ*2-1))
	mvdk	*sp(1), ar4		; psOut
	mar		*+ar4(#(DTMF_tSc.asBpData+DTMF_BPFLT_SZ))
	
	frame	#-5
	ld 		#0, a
	dst		a, *sp(0)		; ac0
	dst		a, *sp(2)		; ac3
	stm		#IDTMF_FR_SZ/2-1, brc
	stm 	#0, bk
	stm		#2, ar0
	rptb	dtmf_filter_2k1-1
		rptz	a, #(DTMF_2KFLT_HSZ*2-1)
			macp	*ar2+0%, _dtmf_as2k, a
		mar		*+ar2(#(-DTMF_2KFLT_HSZ*4+2))
		
		ld 		a, b
		add 	*ar3, 15, a
		sth 	a, *ar4+
		squr	a, a
		dadd	*sp(0), a
		dst 	a, *sp(0)
		
		ld 		b, a
		sub 	*ar3+0%, 15, a
		squr	a, a
		dadd	*sp(2), a
		dst 	a, *sp(2)
dtmf_filter_2k1	
	dld		*sp(2), a
	en2log	0
	stl 	a, *sp(2)
	
	dld 	*sp(0), a
	en2log	0
	sub		*sp(2), a
	
	nop
	nop
	nop
	frame	#5
	nop
	nop
	nop
	
	mvdk	*sp(1), ar2
	stl 	a, *ar2(#(DTMF_tSc.s2kEnDlt))
	ret
;-------------------------------------------------------------------------
	.global _dtmf_lo_filter
_dtmf_lo_filter
;-------------------------------------------------------------------------
;DTMF_tDb *pDb,		= ac0
;DTMF_tSc *pSc,		= sp(1)
;
	ssbx	sxm
	mvdk	*sp(1), ar2
	mar		*+ar2(#(DTMF_tSc.asLoData+DTMF_LOSD_SZ))
	mvdk	*sp(1), ar3
	mar		*+ar3(#(DTMF_tSc.asBpData))
	mvdk	*sp(1), ar4
	mar		*+ar4(#(DTMF_tSc.slLoBpEn))
	
	ld		#0, a
	dst		a, *ar4
	stm		#DTMF_DFR_SZ-1, brc
	rptb	L_dtmf_filter_lo - 1
		rptz	a, #DTMF_BPFLT_SZ-1
			macp	*ar3+, _dtmf_aLoBpI, a
		sth		a, *ar2+
		squr	a, b
		dadd	*ar4, b
		dst		b, *ar4
		mar		*+ar3(#(-DTMF_BPFLT_SZ))
		
		rptz	a, #DTMF_BPFLT_SZ-1
			macp	*ar3+, _dtmf_aLoBpQ, a
		sth		a, *ar2+
		squr	a, b
		dadd	*ar4, b
		dst		b, *ar4
		mar		*+ar3(#(-DTMF_BPFLT_SZ+DTMF_BPDR))
L_dtmf_filter_lo		
	dld		*ar4, a
	en2log	0
	
	mvdk	*sp(1), ar4
	mar		*+ar4(#(DTMF_tSc.sLoBpEn))
	stl		a, *ar4
	ret
;-------------------------------------------------------------------------
	.global _dtmf_hi_filter
_dtmf_hi_filter
;-------------------------------------------------------------------------
;DTMF_tDb *pDb,		= ac0
;DTMF_tSc *pSc,		= sp(1)
;
	ssbx	sxm
	mvdk	*sp(1), ar2
	mar		*+ar2(#(DTMF_tSc.asHiData+DTMF_HISD_SZ))
	mvdk	*sp(1), ar3
	mar		*+ar3(#(DTMF_tSc.asBpData))
	mvdk	*sp(1), ar4
	mar		*+ar4(#(DTMF_tSc.slHiBpEn))
	
	ld		#0, a
	dst		a, *ar4
	stm		#DTMF_DFR_SZ-1, brc
	rptb	L_dtmf_filter_hi - 1
		rptz	a, #DTMF_BPFLT_SZ-1
			macp	*ar3+, _dtmf_aHiBpI, a
		sth		a, *ar2+
		squr	a, b
		dadd	*ar4, b
		dst		b, *ar4
		mar		*+ar3(#(-DTMF_BPFLT_SZ))
		
		rptz	a, #DTMF_BPFLT_SZ-1
			macp	*ar3+, _dtmf_aHiBpQ, a
		sth		a, *ar2+
		squr	a, b
		dadd	*ar4, b
		dst		b, *ar4
		mar		*+ar3(#(-DTMF_BPFLT_SZ+DTMF_BPDR))
L_dtmf_filter_hi		
	dld		*ar4, a
	en2log	0
	
	mvdk	*sp(1), ar4
	mar		*+ar4(#(DTMF_tSc.sHiBpEn))
	stl		a, *ar4
	ret	
;-------------------------------------------------------------------------
	.global _dtmf_dial_filter
_dtmf_dial_filter
;-------------------------------------------------------------------------
;DTMF_tDb *pDb,		= ac0
;DTMF_tSc *pSc,		= sp(1)
;
	stlm	a, ar5
	ssbx	sxm
	nop
	mvdk	*sp(1), ar2
	mvdk	*sp(1), ar3
	mar		*+ar3(#(DTMF_tSc.asBpData))
	mvdk	*sp(1), ar4
	mar		*+ar4(#(DTMF_tSc.slDialEn))
	
	ld		#0, a
	dst		a, *ar4
	stm		#DTMF_DFR_SZ/2-1, brc
	rptb	L_dtmf_filter_dial - 1
		rptz	a, #DTMF_BPFLT_SZ-1
			macp	*ar3+, _dtmf_aDialI, a
		squr	a, b
		dadd	*ar4, b
		dst		b, *ar4
		mar		*+ar3(#(-DTMF_BPFLT_SZ))
		
		rptz	a, #DTMF_BPFLT_SZ-1
			macp	*ar3+, _dtmf_aDialQ, a
		squr	a, b
		dadd	*ar4, b
		dst		b, *ar4
		mar		*+ar3(#(-DTMF_BPFLT_SZ+DTMF_BPDR*2))
L_dtmf_filter_dial		
	dld		*ar4, a
	mvdk	*sp(1), ar2
	dadd 	*ar5(#(DTMF_tDb.v.slDialEn)),a;
	dadd 	*ar2(#(DTMF_tSc.slHiBpEn)),a;
	dadd 	*ar2(#(DTMF_tSc.slLoBpEn)),a;
	en2log	0
	stl		a, *ar2(#(DTMF_tSc.sSumDialEn))
	dld 	*ar4, a
	dst		a, *ar5(#(DTMF_tDb.v.slDialEn));
	ret	
	
;-------------------------------------------------------------------------
	.global _dtmf_lo_dft_main
_dtmf_lo_dft_main
;-------------------------------------------------------------------------
;DTMF_tDb *pDb,
;DTMF_tSc *pSc
;
	ssbx	sxm
	mvdk	*sp(1), ar2
	mar		*+ar2(#(DTMF_tSc.asLoData));	psI
	mvdk	*sp(1), ar3
	mar		*+ar3(#(DTMF_tSc.asLoData+1));	psQ
	mvdk	*sp(1), ar4
	mar		*+ar4(#(DTMF_tSc.asLoMainEn));	psOut

    stm		#_dtmf_aLo, ar5
    
    stm		#2, ar0
    stm		#0, bk
	stm		#4-1, brc
	rptb	L_dtmf_dft_lo_main - 1
		rptz	a, #DTMF_LO_DFT_SZ-1
			mac		*ar2+0%, *ar5+, a
		mar		*+ar2(#(-DTMF_LO_DFT_SZ*2))
		mar		*+ar5(#(-DTMF_LO_DFT_SZ))
		rptz	b, #DTMF_LO_DFT_SZ-1
			mac		*ar3+0%, *ar5+, b
		mar		*+ar3(#(-DTMF_LO_DFT_SZ*2))
		
		rpt		#DTMF_LO_DFT_SZ-1
			mac		*ar2+0%, *ar5+, b
		mar		*+ar2(#(-DTMF_LO_DFT_SZ*2))
		mar		*+ar5(#(-DTMF_LO_DFT_SZ))

		rpt		#DTMF_LO_DFT_SZ-1
			mas		*ar3+0%, *ar5+, a
		mar		*+ar3(#(-DTMF_LO_DFT_SZ*2))
		
		sth		b, *sp(1)
		squr	a, b
		squra	*sp(1), b
		ld 		b, a
		en2log	0
		stl	  	a, *ar4+
L_dtmf_dft_lo_main	
	ret

;-------------------------------------------------------------------------
	.global _dtmf_hi_dft_main
_dtmf_hi_dft_main
;-------------------------------------------------------------------------
;DTMF_tDb *pDb,
;DTMF_tSc *pSc
;
	ssbx	sxm
	mvdk	*sp(1), ar2
	mar		*+ar2(#(DTMF_tSc.asHiData));	psI
	mvdk	*sp(1), ar3
	mar		*+ar3(#(DTMF_tSc.asHiData+1));	psQ
	mvdk	*sp(1), ar4
	mar		*+ar4(#(DTMF_tSc.asHiMainEn));	psOut

    stm		#_dtmf_aHi, ar5
    
    stm		#2, ar0
    stm		#0, bk
	stm		#4-1, brc
	rptb	L_dtmf_dft_hi_main - 1
		rptz	a, #DTMF_HI_DFT_SZ-1
			mac		*ar2+0%, *ar5+, a
		mar		*+ar2(#(-DTMF_HI_DFT_SZ*2))

⌨️ 快捷键说明

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