[an error occurred while processing this directive]
|
struct IIR2_filter{
signed int filterNodes[4];
signed int filterCoefficients[5];
};
extern signed int IIR2( struct IIR2_filter *thisFilter, signed int newSample);
//-------------------------------------------------------
//Filter nodes offset relative to filter struct address
#define X21 0*4
#define X22 1*4
#define Y21 2*4
#define Y22 3*4
//Filter coefficient offset relative to filter struct address
#define B20 4*4
#define B21 5*4
#define B22 6*4
#define A21 7*4
#define A22 8*4
IIR2:
stmfd sp!, {r2-r5, lr}
//B2*x[n-2]
ldr r4,[r0,#B22]
ldr r5,[r0,#X22]
smull r2,r3,r4,r5
//B1*x[n-1]
ldr r4,[r0,#B21]
ldr r5,[r0,#X21]
str r5,[r0,#X22]
smlal r2,r3,r4,r5
//B0*x[n]
ldr r4,[r0,#B20]
mov r5,r1 //load new sample
str r5,[r0,#X21]
smlal r2,r3,r4,r5
//A2*y[n-2]
ldr r4,[r0,#A22]
ldr r5,[r0,#Y22]
smlal r2,r3,r4,r5
//A1*y[n-1]
ldr r4,[r0,#A21]
ldr r5,[r0,#Y21]
str r5,[r0,#Y22]
smlal r2,r3,r4,r5
mov r5,r2,LSR #30
orr r5,r5,r3,LSL #2
//store result
str r5,[r0,#Y21]
mov r0,r5
ldmfd sp!, {r2-r5, lr}
bx lr
E-mail: info@telesys.ru