17df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@***********************************************************
27df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Function:    WT_VoiceFilter
37df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Processor:   ARM
47df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Description:
57df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Implements a 2-pole low-pass filter with resonanance
67df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
77df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Usage:
87df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	void WT_VoiceFilter(
97df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@		S_FILTER CONTROL *pFilter,
107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@		S_WT_FRAME *pWTFrame);
117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Copyright 2005 Sonic Network, Inc.
137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@****************************************************************
147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Revision Control:
157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@   $Revision: 496 $
167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@   $Date: 2006-12-11 14:33:26 -0800 (Mon, 11 Dec 2006) $
177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@****************************************************************
187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@   where:
207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	S_FILTER_CONTROL *pFilter
217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	PASSED IN: r0
227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	S_WT_FRAME *pWTFrame
247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	PASSED IN: r1
257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@****************************************************************
267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.include	"ARM_synth_constants_gnu.inc"
287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.arm
307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.text
317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.global	WT_VoiceFilter
347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Register usage
377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ --------------
387df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectpFilter	.req	r0
397df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectpWTFrame	.req	r1
407df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectpBuffer	.req	r2
417df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectnumSamples	.req	r3
427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
437df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectz1	.req	r4
447df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectz2	.req	r5
457df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectb1	.req	r6
467df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectb2	.req	r7
477df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectK	.req	r8
487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
497df30109963092559d3760c0661a020f9daf1030The Android Open Source Projecttmp0	.req	r1	@ reuse register
507df30109963092559d3760c0661a020f9daf1030The Android Open Source Projecttmp1	.req	r9
517df30109963092559d3760c0661a020f9daf1030The Android Open Source Projecttmp2	.req	r10
527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@SaveRegs	RLIST	{r4-r10, lr}
557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@RestoreRegs	RLIST	{r4-r10, pc}
567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.func	WT_VoiceFilter
597df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectWT_VoiceFilter:
607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	STMFD	sp!, {r4-r10, lr}
627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Setup passed parameters in their destination registers
657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@----------------------------------------------------------------
667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		pBuffer, [pWTFrame, #m_pAudioBuffer]
687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		numSamples, [pWTFrame, #m_numSamples]
697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	@load state variables from pFilter structure
717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDRSH	z1, [pFilter, #m_z1]
727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDRSH	z2, [pFilter, #m_z2]
737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	@load coefficients from pWTFrame structure
757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		K, [pWTFrame, #m_k]
767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		b1, [pWTFrame, #m_b1]
777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		b2, [pWTFrame, #m_b2]
787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	RSB	b1, b1, #0						@ b1 = -b1
807df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	RSB	b2, b2, #0						@ b2 = -b2
817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOV	b2, b2, ASR #1					@ b2 = b2 >> 1
827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOV	K, K, ASR #1					@ K = K >> 1
837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
847df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Start processing
867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@----------------------------------------------------------------
877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDRSH	tmp0, [pBuffer]					@ fetch sample
897df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
907df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectFilterLoop:
917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SMULBB	tmp2, z1, b1					@ tmp2 = z1 * -b1
927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SMLABB	tmp2, z2, b2, tmp2				@ tmp2 = (-b1 * z1) + (-b2 * z2)
937df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOV		z2, z1							@ delay line
957df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SMLABB	tmp0, tmp0, K, tmp2				@ tmp1 = (K * x[n]) + (-b1 * z1) + (-b2 * z2)
977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDRSH	tmp1, [pBuffer, #NEXT_OUTPUT_PCM]	@ fetch next sample
997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOV		z1, tmp0, ASR #14				@ shift result to low word
1017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	STRH	z1, [pBuffer], #NEXT_OUTPUT_PCM	@ write back to buffer
1027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SMULBB	tmp2, z1, b1					@ tmp2 = z1 * -b1
1047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SUBS	numSamples, numSamples, #2		@ unroll loop once
1067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SMLABB	tmp2, z2, b2, tmp2				@ tmp2 = (-b1 * z1) + (-b2 * z2)
1087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SMLABB	tmp1, tmp1, K, tmp2				@ tmp1 = (K * x[n]) + (-b1 * z1) + (-b2 * z2)
1107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOV		z2, z1							@ delay line
1127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOV		z1, tmp1, ASR #14				@ shift result to low word
1147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDRGTSH	tmp0, [pBuffer, #NEXT_OUTPUT_PCM]	@ fetch next sample
1167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	STRH	z1, [pBuffer], #NEXT_OUTPUT_PCM	@ write back to buffer
1187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	BGT		FilterLoop
1207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ save z terms
1217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@----------------------------------------------------------------
1227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	STRH	z1, [pFilter, #m_z1]
1247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	STRH	z2, [pFilter, #m_z2]
1257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Return to calling function
1277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@----------------------------------------------------------------
1287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDMFD	sp!,{r4-r10, lr}
1307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	BX		lr
1317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.endfunc
1337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.end
1347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
135