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

📄 dtmfasm.s54

📁 Express DSP compliant C55x DTMF detector software is proposed in two versions: one with a 5 ms frame
💻 S54
📖 第 1 页 / 共 2 页
字号:
		mar		*+ar5(#(-DTMF_HI_DFT_SZ))
		rptz	b, #DTMF_HI_DFT_SZ-1
			mac		*ar3+0%, *ar5+, b
		mar		*+ar3(#(-DTMF_HI_DFT_SZ*2))
		
		rpt		#DTMF_HI_DFT_SZ-1
			mac		*ar2+0%, *ar5+, b
		mar		*+ar2(#(-DTMF_HI_DFT_SZ*2))
		mar		*+ar5(#(-DTMF_HI_DFT_SZ))

		rpt		#DTMF_HI_DFT_SZ-1
			mas		*ar3+0%, *ar5+, a
		mar		*+ar3(#(-DTMF_HI_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_hi_main	
	ret
;-------------------------------------------------------------------------
	.global _dtmf_lo_dft_dev
_dtmf_lo_dft_dev
;-------------------------------------------------------------------------
;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.asLoDevEn));	psOut

    ld		#__apsLoDev, a
    mvdk	*sp(1), ar0
    add 	*ar0(#(DTMF_tSc.sLoFreqNo)), a
    stlm	a, ar0
    nop
    nop
    mvdk	*ar0, ar5
   
    stm		#0, bk
    stm		#2, ar0
	stm		#4-1, brc
	rptb	L_dtmf_dft_lo_dev - 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_dev	
	ret

;-------------------------------------------------------------------------
	.global _dtmf_hi_dft_dev
_dtmf_hi_dft_dev
;-------------------------------------------------------------------------
;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.asHiDevEn));	psOut

    ld		#__apsHiDev, a
    mvdk	*sp(1), ar0
    add 	*ar0(#(DTMF_tSc.sHiFreqNo)), a
    stlm	a, ar0
    nop
    nop
    mvdk	*ar0, ar5
   
    stm		#0, bk
    stm		#2, ar0
	stm		#4-1, brc
	rptb	L_dtmf_dft_hi_dev - 1
		rptz	a, #DTMF_HI_DFT_SZ-1
			mac		*ar2+0%, *ar5+, a
		mar		*+ar2(#(-DTMF_HI_DFT_SZ*2))
		mar		*+ar5(#(-DTMF_HI_DFT_SZ))
		rptz	b, #DTMF_HI_DFT_SZ-1
			mac		*ar3+0%, *ar5+, b
		mar		*+ar3(#(-DTMF_HI_DFT_SZ*2))
		
		rpt		#DTMF_HI_DFT_SZ-1
			mac		*ar2+0%, *ar5+, b
		mar		*+ar2(#(-DTMF_HI_DFT_SZ*2))
		mar		*+ar5(#(-DTMF_HI_DFT_SZ))

		rpt		#DTMF_HI_DFT_SZ-1
			mas		*ar3+0%, *ar5+, a
		mar		*+ar3(#(-DTMF_HI_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_hi_dev	
	ret

;-------------------------------------------------------------------------
	.global _dtmf_lo_freq
_dtmf_lo_freq
;-------------------------------------------------------------------------
;DTMF_tDb *pDb,
;DTMF_tSc *pSc
;
	ssbx	sxm
	mvdk	*sp(1), ar4						; ar4 = pSc
	mvdk	*ar4(#(DTMF_tSc.sLoFreqNo)), ar0; ar0 = sLoFreqNo
	mvdk	*sp(1), ar2						; ar4 = pSc
	mar	    *+ar2(#(DTMF_tSc.asLoDevEn))		; ar2 = psDev
	stm 	#__aasLoDevFlt, ar3
	mar 	*ar3+0
	mar 	*ar3+0							; ar3 = psDevFlt


	ld 		*ar2(#3), 16, a
	sub		*ar2(#0), 16, a
	add 	*ar2(#2), 16, a
	sub 	*ar2(#1), 16, a
	mpya 	*ar3+
	ld 		b, -16, a
	ld 		#170*5, b
	min		a
	ld 		#-170*5, b
	max		a
	stl 	a, *ar4(#(DTMF_tSc.sLoFreqDev))
;
	squr 	*ar4(#(DTMF_tSc.sLoFreqDev)), a     ; a = dev^2
    stlm    a, t                        ; t = LO(a)
    nop
    mpyu    *ar3, b                     ; b = uns(LO(a))*coef; because coef>0 always
    ld      b, -16, b
    maca    *ar3                        ; b+= HI(a)*coeff
    
    mar		*ar4+0
    add 	*ar4(#(DTMF_tSc.asLoMainEn)), b
    mar		*ar4-0
    stl 	b, *ar4(#(DTMF_tSc.sLoMaxFreqEn))
    ret

;-------------------------------------------------------------------------
	.global _dtmf_hi_freq
_dtmf_hi_freq
;-------------------------------------------------------------------------
;DTMF_tDb *pDb,
;DTMF_tSc *pSc
;
	ssbx	sxm
	mvdk	*sp(1), ar4						; ar4 = pSc
	mvdk	*ar4(#(DTMF_tSc.sHiFreqNo)), ar0; ar0 = sHiFreqNo
	mvdk	*sp(1), ar2						; ar4 = pSc
	mar	    *+ar2(#(DTMF_tSc.asHiDevEn))	; ar2 = psDev
	stm 	#__aasHiDevFlt, ar3
	mar 	*ar3+0
	mar 	*ar3+0							; ar3 = psDevFlt


	ld 		*ar2(#3), 16, a
	sub		*ar2(#0), 16, a
	add 	*ar2(#2), 16, a
	sub 	*ar2(#1), 16, a
	mpya 	*ar3+
	ld 		b, -16, a
	ld 		#170*5, b
	min		a
	ld 		#-170*5, b
	max		a
	stl 	a, *ar4(#(DTMF_tSc.sHiFreqDev))
;
	squr 	*ar4(#(DTMF_tSc.sHiFreqDev)), a     ; a = dev^2
    stlm    a, t                        ; t = LO(a)
    nop
    mpyu    *ar3, b                     ; b = uns(LO(a))*coef; because coef>0 always
    ld      b, -16, b
    maca    *ar3                        ; b+= HI(a)*coeff
    
    mar		*ar4+0
    add 	*ar4(#(DTMF_tSc.asHiMainEn)), b
    mar		*ar4-0
    stl 	b, *ar4(#(DTMF_tSc.sHiMaxFreqEn))
    ret

;-------------------------------------------------------------------------
	.global _dtmf_lo_sort
_dtmf_lo_sort
;-------------------------------------------------------------------------
; DTMF_tDb *pDb,
; DTMF_tSc *pSc
;
; local vars
;	ar2 = pSc   
;   ar3 = psIn
;   ar4 = curr idx
;   ar0 = idx of max
;
	ssbx	sxm
	mvdk	*sp(1), ar2
	mvdk	*sp(1), ar3
	mar		*+ar3(#(DTMF_tSc.asLoMainEn))

    stm     #0, ar4
    stm     #0, ar0
    ld      *ar3+, a
	stm		#4-2, brc
	rptb	L1_dtmf_sort_lo	- 1
        ld      *ar3+, b
        max     a                   ; if b > a, c = 1
        mar     *ar4+
        nop
        xc      1, c
            mvmm    ar4, ar0
L1_dtmf_sort_lo
	mvkd	ar0, *ar2(#(DTMF_tSc.sLoFreqNo))
;	
    mar     *+ar3(#-4)
    stm		#0, ar4
    ld      #-32767, a
    stm     #4-1, brc
    rptb	L2_dtmf_sort_lo - 1
    	cmpr	0, ar4 
        ld      *ar3+, b
        mar 	*ar4+
        xc      1, ntc                   ; if (curr != max)
            max     a
L2_dtmf_sort_lo
	stl		a, *ar2(#(DTMF_tSc.sLoNextEn))
	ret

;-------------------------------------------------------------------------
	.global _dtmf_hi_sort
_dtmf_hi_sort
;-------------------------------------------------------------------------
; DTMF_tDb *pDb,
; DTMF_tSc *pSc
;
; local vars
;	ar2 = pSc   
;   ar3 = psIn
;   ar4 = curr idx
;   ar0 = idx of max
;
	ssbx	sxm
	mvdk	*sp(1), ar2
	mvdk	*sp(1), ar3
	mar		*+ar3(#(DTMF_tSc.asHiMainEn))

    stm     #0, ar4
    stm     #0, ar0
    ld      *ar3+, a
	stm		#4-2, brc
	rptb	L1_dtmf_sort_hi	- 1
        ld      *ar3+, b
        max     a                   ; if b > a, c = 1
        mar     *ar4+
        nop
        xc      1, c
            mvmm    ar4, ar0
L1_dtmf_sort_hi
	mvkd	ar0, *ar2(#(DTMF_tSc.sHiFreqNo))
;	
    mar     *+ar3(#-4)
    stm		#0, ar4
    ld      #-32767, a
    stm     #4-1, brc
    rptb	L2_dtmf_sort_hi - 1
    	cmpr	0, ar4 
        ld      *ar3+, b
        mar 	*ar4+
        xc      1, ntc                   ; if (curr != max)
            max     a
L2_dtmf_sort_hi
	stl		a, *ar2(#(DTMF_tSc.sHiNextEn))
	ret
;-------------------------------------------------------------------------
	.global _dtmf_frame_en
_dtmf_frame_en
;-------------------------------------------------------------------------
; DTMF_tDb *pDb,
; DTMF_tSc *pSc
;
	ssbx	sxm
	mvdk	*sp(1), ar3
	mar		*+ar3(#(DTMF_tSc.as2kData))
	
	rptz	a, #IDTMF_FR_SZ-1
		squra	*ar3+, a
	mvdk	*sp(1), ar2
	dst		a, *ar2(#(DTMF_tSc.slFrameEn))
	ret
;-------------------------------------------------------------------------
	.global _dtmf_move_data_out
_dtmf_move_data_out
;-------------------------------------------------------------------------
; DTMF_tDb *pDb, 
; DTMF_tSc *pSc
	stlm	a, ar3
	ssbx	sxm
	nop
	mvdk	*sp(1), ar2
	dld		*ar2(#(DTMF_tSc.slFrameEn)), a
	dadd	*ar3(#(DTMF_tDb.v.slFrameEn)), a
	ld 		a, -3, a
	en2log	0
	stl		a, *ar3(#(DTMF_tDb.v.sZFrameEn))
	dld		*ar2(#(DTMF_tSc.slFrameEn)), a
	dst		a, *ar3(#(DTMF_tDb.v.slFrameEn))
	
	mvmm	ar2, ar4
	mvmm	ar3, ar5
	mar		*+ar4(#(DTMF_tSc.as2kData + IDTMF_FR_SZ))
	mar		*+ar5(#(DTMF_tDb.as2kDataSav))
	rpt		#DTMF_2KFLT_SZ-1
		mvdd	*ar4+, *ar5+

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

	mvmm	ar2, ar4
	mvmm	ar3, ar5
	mar		*+ar4(#(DTMF_tSc.asLoData + DTMF_DFR_SZ*2))
	mar		*+ar5(#(DTMF_tDb.asLoDataSav))
	rpt		#DTMF_LOSD_SZ-1
		mvdd	*ar4+, *ar5+

	mvmm	ar2, ar4
	mvmm	ar3, ar5
	mar		*+ar4(#(DTMF_tSc.asHiData + DTMF_DFR_SZ*2))
	mar		*+ar5(#(DTMF_tDb.asHiDataSav))
	rpt		#DTMF_HISD_SZ-1
		mvdd	*ar4+, *ar5+

	ret


	

⌨️ 快捷键说明

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