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

📄 cpda.s54

📁 CP detector (CPD) only reports the onset and removal of a tone. The analysis of timing (if required)
💻 S54
字号:
*-------------------------------------------------------------------------*
*                                                                         *
*   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 "cpdi.h54"

	.global _CPD_aBpI
	.global _CPD_aBpQ;
	.global _CPD_aPg;
	.global _CPD_aPhase;
	
	.sect ".ftext"
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				_cpd_en2log
	.sym _cpd_en2log, _cpd_en2log, 32, 2, 0
;-------------------------------------------------------------------------
_cpd_en2log
;	S32 slEn 	= a
;	S16 sCorr	= sp(1)
;
	ssbx	sxm
	add		#1, a
	exp		a
	ld		#0x780, b
	norm	a
	ld		a, -16, a
	add		a, -5, b
	mac		#-512, b, a
	add		*sp(1), a
	ret
;-------------------------------------------------------------------------
	.global _cpd_move_data_in
	.sym _cpd_move_data_in, _cpd_move_data_in, 32, 2, 0
_cpd_move_data_in
;-------------------------------------------------------------------------*/
;	CPD_tDb *pDb 	= a
;	CPD_tSc *pSc	= sp(1)
; 	S16 *psIn		= sp(2)
	stlm 	a, ar2
	ssbx	sxm
	nop
	mvdk	*ar2(#(CPD_tDb.pCfg)), ar3
	ld 		*ar3(#(ICPD_tCfg.sNormShift)), asm
	
	mvmm	ar2, ar4
	mvdk	*sp(1), ar5
	mar 	*+ar4(#(CPD_tDb.asBpDataSav))
	mar 	*+ar5(#(CPD_tSc.asBpData))
	rpt		#CPD_BP_SSZ-1
		mvdd	*ar4+, *ar5+
		
	mvdk	*sp(2), ar4
	.if 0	
	ld 		*ar4+, 16, b
	rpt		#ICPD_FR_SZ-2
		st 	b, *ar5+ || ld *ar4+, b
	sth		b, asm, *ar5+		
	.else
	stm		#ICPD_FR_SZ-1, brc
	rptb	Lmovein-1
		ld 		*ar4+, 16, b
		sth		b, asm, *ar5+
Lmovein	
	.endif

	mvmm	ar2, ar4
	mvdk	*sp(1), ar5
	mar		*+ar4(#(CPD_tDb.asPgIDataSav))
	mar		*+ar5(#(CPD_tSc.asPgIData))
	rpt		#CPD_PG_SSZ-1
		mvdd 	*ar4+, *ar5+
			
	mvmm	ar2, ar4
	mvdk	*sp(1), ar5
	mar		*+ar4(#(CPD_tDb.asPgQDataSav))
	mar		*+ar5(#(CPD_tSc.asPgQData))
	rpt		#CPD_PG_SSZ-1
		mvdd 	*ar4+, *ar5+
	ret
;-------------------------------------------------------------------------*/
	.global _cpd_filter_bp
	.sym _cpd_filter_bp, _cpd_filter_bp, 32, 2, 0
_cpd_filter_bp
;-------------------------------------------------------------------------*/
;	CPD_tSc *pSc 	= a
;	
	stlm 	a, ar2
	ssbx	sxm
	nop
;	
; I --------------------------	
;
; in	
	mvmm	ar2, ar3
	mar 	*+ar3(#(CPD_tSc.asBpData))
; coef	
	stm		#_CPD_aBpI, ar4
; out	
	mvmm	ar2, ar5
	mar 	*+ar5(#(CPD_tSc.asPgIData + CPD_PG_SSZ))
; misc
	ld 		#0, a
	stm		#1-CPD_BP_FSZ, ar0
	stm		#0, bk
	stm		#(ICPD_FR_SZ/CPD_BP_DR-1), brc
; loop	
	rptb	L11-1
		rptz	b, #CPD_BP_FSZ-2
			mac		*ar3+, *ar4+, b
		macr	*ar3+0%, *ar4+0%, b
		sth		b, *ar5
		squra	*ar5+, a
		mar		*+ar3(#CPD_BP_DR)
L11	
;
; Q --------------------------	
;
; in	
	mvmm	ar2, ar3
	mar 	*+ar3(#(CPD_tSc.asBpData))
; coef	
	stm		#_CPD_aBpQ, ar4
; out	
	mvmm	ar2, ar5
	mar 	*+ar5(#(CPD_tSc.asPgQData + CPD_PG_SSZ))
; misc
;	stm		#1-CPD_BP_FSZ, ar0
;	stm		#0, bk
	stm		#(ICPD_FR_SZ/CPD_BP_DR-1), brc
; loop	
	rptb	L12-1
		rptz	b, #CPD_BP_FSZ-2
			mac		*ar3+, *ar4+, b
		macr	*ar3+0%, *ar4+0%, b
		sth		b, *ar5
		squra 	*ar5+, a
		mar		*+ar3(#CPD_BP_DR)
L12	
;
; energy -------------------
;	
;	dst		a, *ar2(#(CPD_tSc.slBpEn))
	sth		a, *ar2(#(CPD_tSc.slBpEn))
	stl		a, *ar2(#(CPD_tSc.slBpEn+1))
	en2log	CPD_EN_BP
	stl		a, *ar2(#(CPD_tSc.sBpEn))
	
	ret
		
;-------------------------------------------------------------------------*/
	.global	_cpd_sum_sub
	.sym _cpd_sum_sub, _cpd_sum_sub, 32, 2, 0
_cpd_sum_sub
;-------------------------------------------------------------------------*/
;	CPD_tSc *pSc	= a
;
	stlm 	a, ar2
	ssbx	sxm
	nop
	mvmm	ar2, ar3
	mvmm	ar2, ar4
	mvmm	ar2, ar5
	mar		*+ar2(#(CPD_tSc.asPgIData))
	mar		*+ar3(#(CPD_tSc.asPgIData+(CPD_PG_FSZ-1)))
	mar		*+ar4(#(CPD_tSc.asPgISum))
	mar		*+ar5(#(CPD_tSc.asPgIDif))
	
	stm		#CPD_PG_HSZ-1, brc
	rptb	L21-1
		add 	*ar2, *ar3, b
		sth		b, *ar4+
		sub		*ar2+, *ar3-, b
		sth		b, *ar5+
L21		
	stlm 	a, ar2
	nop
	nop
	mvmm	ar2, ar3
	mvmm	ar2, ar4
	mvmm	ar2, ar5
	mar		*+ar2(#(CPD_tSc.asPgQData))
	mar		*+ar3(#(CPD_tSc.asPgQData+(CPD_PG_FSZ-1)))
	mar		*+ar4(#(CPD_tSc.asPgQSum))
	mar		*+ar5(#(CPD_tSc.asPgQDif))
	
	stm		#CPD_PG_HSZ-1, brc
	rptb	L22-1
		add 	*ar2, *ar3, b
		sth		b, *ar4+
		sub		*ar2+, *ar3-, b
		sth		b, *ar5+
L22
	ret

;-------------------------------------------------------------------------*/
	.global _cpd_filter_pg
	.sym _cpd_filter_pg, _cpd_filter_pg, 32, 2, 0
_cpd_filter_pg
;-------------------------------------------------------------------------*/
;	CPD_tSc *pSc	= a
;
	stlm	a, ar2
	ssbx	sxm
	pshm	ar1
	mvmm	ar2, ar3
	mvmm	ar2, ar4
	mvmm	ar2, ar5
	mar		*+ar3(#(CPD_tSc.asPgISum))
	mar		*+ar4(#(CPD_tSc.asPgQSum))
	mar		*+ar5(#(CPD_tSc.aOut))
	stm		#_CPD_aPg, ar2
	stm		#1-2*CPD_PG_HSZ, ar0
	stm		#0, bk
	stm		#CPD_FREQS-1, ar1
L31	
	stm		#CPD_PG_HSZ-2, brc
	rptbd	L32-1
	mpy		*ar3+, *ar2, a
	mpy		*ar4+, *ar2+, b
		mac		*ar3+, *ar2, a
		mac		*ar4+, *ar2+, b
L32
	stm		#CPD_PG_HSZ-2, brc
	rptb	L33-1
		mas		*ar4+, *ar2, a
		mac		*ar3+, *ar2+, b
L33
	masr	*ar4+0%, *ar2, a
	macr	*ar3+0%, *ar2+, b
	sth		a, *ar5+
	sth		b, *ar5
	squr	a, a
	squra	*ar5+, a
	dst		a, *ar5
	banzd	L31, *ar1-	
	mar		*+ar5(#(CPD_tOut_Sz-2))
	
	popm	ar1
	ret
	
;-------------------------------------------------------------------------*/
	.global _cpd_sort_freqs
	.sym _cpd_sort_freqs, _cpd_sort_freqs, 32, 2, 0
_cpd_sort_freqs
;-------------------------------------------------------------------------*/
;	CPD_tSc *pSc 	= a
;
	stlm	a, ar2
	ssbx	sxm
	nop
	mvmm	ar2, ar3
	mvmm	ar2, ar4
	mar 	*+ar3(#(CPD_tSc.aOut+CPD_tOut.slEn))
	mar 	*+ar4(#(CPD_tSc.aslEnSort))
	stm		#(CPD_tOut_Sz), ar0
	stm		#CPD_FREQS-1, brc
	rptb	L41-1
		dld		*ar3+0, b
;		sth 	b, *ar4+
;		stl 	b, *ar4+
		dst 	b, *ar4+
L41	
	nop
	nop
	mar 	*+ar4(#(-CPD_FREQS*2))

	dld		*ar4+, a
	stm 	#0, ar3	
	stm 	#0, ar0
	stm		#CPD_FREQS-2, brc
	rptb	L42-1
		dld 	*ar4+, b
		max		a
		mar 	*ar3+
		nop
		xc		1, c
			mvmm	ar3, ar0	
L42
	mvkd	ar0, *ar2(#(CPD_tSc.sMaxIdx))
	en2log	CPD_EN_PG
	stl		a, *ar2(#(CPD_tSc.sMaxEn))
	mar 	*+ar4(#(-CPD_FREQS*2))
	mvmm	ar4, ar5
	mar		*ar5+0
	mar 	*ar5+0
	ld 		#0, a
	dst 	a, *ar5

	dld		*ar4+, a
	stm 	#0, ar3	
	stm 	#0, ar0
	stm		#CPD_FREQS-2, brc
	rptb	L43-1
		dld 	*ar4+, b
		max		a
		mar 	*ar3+
		nop
		xc		1, c
			mvmm	ar3, ar0	
L43
	mvkd	ar0, *ar2(#(CPD_tSc.sNextIdx))
	en2log	CPD_EN_PG
	stl		a, *ar2(#(CPD_tSc.sNextEn))
	mar 	*+ar4(#(-CPD_FREQS*2))
	mvmm	ar4, ar5
	mar		*ar5+0
	mar 	*ar5+0
	ld 		#0, a
	dst 	a, *ar5

	dld		*ar4+, a
	stm 	#0, ar3	
	stm 	#0, ar0
	stm		#CPD_FREQS-2, brc
	rptb	L44-1
		dld 	*ar4+, b
		max		a
		mar 	*ar3+
		nop
		xc		1, c
			mvmm	ar3, ar0	
L44
	mvkd	ar0, *ar2(#(CPD_tSc.sRestIdx))
	en2log	CPD_EN_PG
	stl		a, *ar2(#(CPD_tSc.sRestEn))

	ret
	.if 0	
;-------------------------------------------------------------------------*/
	.global _cpd_get_err
	.sym _cpd_get_err, _cpd_get_err, 32, 2, 0
_cpd_get_err
;-------------------------------------------------------------------------*/
;	S32 slEn = a
;	S32 *slErr = sp(1)
;
	ssbx	sxm
	mvdk	*sp(1), ar2
	dld 	*ar2, b
	abs		b
	bit		*ar2, (15-15)				; tc = sign
	min 	b
	add 	#1, a
	exp 	a
	nop
	norm 	a
	norm 	b
	ld 		b, -1, b
	sth 	a, *sp(1)
	rpt		#16-1
		subc	*sp(1), b
	stl 	b, *sp(1)
	mpy 	*sp(1), #-5450, a
	xc		1, tc
		neg		a
	ld 		a, -15, a
	ret
	.endif
;-------------------------------------------------------------------------*/
	.global _cpd_get_elem_data
	.sym _cpd_get_elem_data, _cpd_get_elem_data, 32, 2, 0
_cpd_get_elem_data
;-------------------------------------------------------------------------*/
;	CPD_tDb *pDb	= a
;	CPD_tSc *pSc	= sp(1)
; 	CPD_tElem *pElem = sp(2)
; 	S16 sIdx		= sp(3)
	stlm	a, ar2
	ssbx	sxm
	ssbx	frct
	mvdk	*sp(3), ar0
; set ar5 = pPhase
	stm		#_CPD_aPhase, ar5
	mar		*ar5+0
	mar		*ar5+0
; set ar2 = psC0 / psS0
	mar		*+ar2(#(CPD_tDb.aOutSav))
	mar		*ar2+0
	mar 	*ar2+0
; set ar3 = psC1 / psS1 / pslEn 
	mvdk	*sp(1), ar3
	mar		*+ar3(#(CPD_tSc.aOut))
	mar		*ar3+0
	mar 	*ar3+0
	mar		*ar3+0
	mar 	*ar3+0
; set ar4 = pElem
	mvdk	*sp(2), ar4
; calculate Cpred / Spred	
	mpy		*ar2+, *ar5, a
	mpy		*ar2, *ar5+, b
	macr	*ar2-, *ar5, a
	masr	*ar2, *ar5, b
	sth		a, *ar4+
	sth		b, *ar4-
; calculate log(distance)
	rsbx	frct
	sub		*ar4+, *ar3+, a
	squr	a, b
	sub		*ar4+, *ar3, a
	squr	a, a
	add 	b, a
	en2log	CPD_EN_PG
	stl		a, *ar4-
	mar 	*ar4-
; calculate slErr	
	mpy 	*ar3-, *ar4+, b
	mas		*ar3+, *ar4+, b
	mar 	*ar4+
	mar 	*ar3+
; calculate sErr
	dld		*ar3, a
	xc		1, blt
		ssbx	tc
	abs		b, b
	sub		a, b			; b = |err| - en, shall be < 0
	bc 		L51, bgeq
		add 	a, b
		add 	#1, a
		exp		a
		nop
		norm	a
		norm	b
		sth 	a, *ar4
		and		#0xffff,16,b
		ld 		b,-1,b
		rpt		#(16-1)
			subc	*ar4, b
	.if 1
		stl		b, *ar4
		mpy		*ar4, #-5450, b
		ld    	b, -15, b
		xc		1, tc
			neg		b
		stl		b, *ar4
	.else
		xc		1, tc
			neg		b
		stl		b, *ar4
	
	.endif
		ret
L51
	st		#-5450, *ar4
	xc		2, tc
		st 	#5450, *ar4
	ret		

;-------------------------------------------------------------------------*/
	.global _cpd_move_data_out
	.sym _cpd_move_data_out, _cpd_move_data_out, 32, 2, 0
_cpd_move_data_out
;-------------------------------------------------------------------------*/
;	CPD_tDb *pDb 	= a
; 	CPD_tSc *pSc	= sp(1)
;
	stlm 	a, ar2
	ssbx	sxm
	nop
	mvdk	*sp(1), ar3
; save Bp data	
	mvmm	ar2, ar4
	mvmm	ar3, ar5
	mar		*+ar4(#(CPD_tDb.asBpDataSav))
	mar		*+ar5(#(CPD_tSc.asBpData+(CPD_BP_ASZ-CPD_BP_SSZ)))
	rpt		#CPD_BP_SSZ-1
		mvdd 	*ar5+, *ar4+
; save PgI data		
	mvmm	ar2, ar4
	mvmm	ar3, ar5
	mar		*+ar4(#(CPD_tDb.asPgIDataSav))
	mar		*+ar5(#(CPD_tSc.asPgIData+(CPD_PG_ASZ-CPD_PG_SSZ)))
	rpt		#CPD_PG_SSZ-1
		mvdd 	*ar5+, *ar4+
; save PgQ data		
	mvmm	ar2, ar4
	mvmm	ar3, ar5
	mar		*+ar4(#(CPD_tDb.asPgQDataSav))
	mar		*+ar5(#(CPD_tSc.asPgQData+(CPD_PG_ASZ-CPD_PG_SSZ)))
	rpt		#CPD_PG_SSZ-1
		mvdd 	*ar5+, *ar4+
; save Out: sC, sS		
	mvmm	ar2, ar4
	mvmm	ar3, ar5
	mar		*+ar4(#(CPD_tDb.aOutSav))
	mar		*+ar5(#(CPD_tSc.aOut))
	stm		#CPD_FREQS-1, brc
	stm		#CPD_tOut_Sz-1, ar0
	stm		#0, bk
	rptb	L61-1
		mvdd 	*ar5+, *ar4+
		mvdd 	*ar5+0%, *ar4+
L61		
; delay asSum and update asSum[0]
	mvmm	ar2, ar4
	mvmm	ar3, ar5
	mar		*+ar4(#(CPD_tDb.v.asSumEn+CPD_EN_SZ-2))
	mar		*+ar5(#(CPD_tSc.sSumEn))
	rpt		#CPD_EN_SZ-2
		delay 	*ar4-
	mar		*ar4+
	mvdd	*ar5, *ar4
	ret

;-------------------------------------------------------------------------
	.global				_cpd_avrg
	.sym _cpd_avrg, _cpd_avrg, 32, 2, 0
_cpd_avrg
;-------------------------------------------------------------------------
;	S16 *psVal	= a
;	S16	sNew	= sp(1)
;	S16 sCoeff	= sp(2)
;
	stlm	a, ar4
	ssbx	sxm
	ssbx	frct
	ld		*sp(1), 16, a
	sub		*ar4, 16, a
	ld		*ar4, 16, b
	macar	*sp(2)
	sth		b, *ar4
	rsbx	frct
	ret

⌨️ 快捷键说明

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