1 @*********************************************************** 2 @ Function: WT_VoiceFilter 3 @ Processor: ARM 4 @ Description: 5 @ Implements a 2-pole low-pass filter with resonanance 6 @ 7 @ Usage: 8 @ void WT_VoiceFilter( 9 @ S_FILTER CONTROL *pFilter, 10 @ S_WT_FRAME *pWTFrame); 11 @ 12 @ Copyright 2005 Sonic Network, Inc. 13 @**************************************************************** 14 @ Revision Control: 15 @ $Revision: 496 $ 16 @ $Date: 2006-12-11 14:33:26 -0800 (Mon, 11 Dec 2006) $ 17 @**************************************************************** 18 @ 19 @ where: 20 @ S_FILTER_CONTROL *pFilter 21 @ PASSED IN: r0 22 @ 23 @ S_WT_FRAME *pWTFrame 24 @ PASSED IN: r1 25 @**************************************************************** 26 27 .include "ARM_synth_constants_gnu.inc" 28 29 .arm 30 .text 31 32 33 .global WT_VoiceFilter 34 35 36 @ Register usage 37 @ -------------- 38 pFilter .req r0 39 pWTFrame .req r1 40 pBuffer .req r2 41 numSamples .req r3 42 43 z1 .req r4 44 z2 .req r5 45 b1 .req r6 46 b2 .req r7 47 K .req r8 48 49 tmp0 .req r1 @ reuse register 50 tmp1 .req r9 51 tmp2 .req r10 52 53 54 @SaveRegs RLIST {r4-r10, lr} 55 @RestoreRegs RLIST {r4-r10, pc} 56 57 58 .func WT_VoiceFilter 59 WT_VoiceFilter: 60 61 STMFD sp!, {r4-r10, lr} 62 63 @ 64 @ Setup passed parameters in their destination registers 65 @---------------------------------------------------------------- 66 67 LDR pBuffer, [pWTFrame, #m_pAudioBuffer] 68 LDR numSamples, [pWTFrame, #m_numSamples] 69 70 @load state variables from pFilter structure 71 LDRSH z1, [pFilter, #m_z1] 72 LDRSH z2, [pFilter, #m_z2] 73 74 @load coefficients from pWTFrame structure 75 LDR K, [pWTFrame, #m_k] 76 LDR b1, [pWTFrame, #m_b1] 77 LDR b2, [pWTFrame, #m_b2] 78 79 RSB b1, b1, #0 @ b1 = -b1 80 RSB b2, b2, #0 @ b2 = -b2 81 MOV b2, b2, ASR #1 @ b2 = b2 >> 1 82 MOV K, K, ASR #1 @ K = K >> 1 83 84 @ 85 @ Start processing 86 @---------------------------------------------------------------- 87 88 LDRSH tmp0, [pBuffer] @ fetch sample 89 90 FilterLoop: 91 SMULBB tmp2, z1, b1 @ tmp2 = z1 * -b1 92 SMLABB tmp2, z2, b2, tmp2 @ tmp2 = (-b1 * z1) + (-b2 * z2) 93 94 MOV z2, z1 @ delay line 95 96 SMLABB tmp0, tmp0, K, tmp2 @ tmp1 = (K * x[n]) + (-b1 * z1) + (-b2 * z2) 97 98 LDRSH tmp1, [pBuffer, #NEXT_OUTPUT_PCM] @ fetch next sample 99 100 MOV z1, tmp0, ASR #14 @ shift result to low word 101 STRH z1, [pBuffer], #NEXT_OUTPUT_PCM @ write back to buffer 102 103 SMULBB tmp2, z1, b1 @ tmp2 = z1 * -b1 104 105 SUBS numSamples, numSamples, #2 @ unroll loop once 106 107 SMLABB tmp2, z2, b2, tmp2 @ tmp2 = (-b1 * z1) + (-b2 * z2) 108 109 SMLABB tmp1, tmp1, K, tmp2 @ tmp1 = (K * x[n]) + (-b1 * z1) + (-b2 * z2) 110 111 MOV z2, z1 @ delay line 112 113 MOV z1, tmp1, ASR #14 @ shift result to low word 114 115 LDRGTSH tmp0, [pBuffer, #NEXT_OUTPUT_PCM] @ fetch next sample 116 117 STRH z1, [pBuffer], #NEXT_OUTPUT_PCM @ write back to buffer 118 119 BGT FilterLoop 120 @ save z terms 121 @---------------------------------------------------------------- 122 123 STRH z1, [pFilter, #m_z1] 124 STRH z2, [pFilter, #m_z2] 125 126 @ Return to calling function 127 @---------------------------------------------------------------- 128 129 LDMFD sp!,{r4-r10, lr} 130 BX lr 131 132 .endfunc 133 .end 134 135