Professional Documents
Culture Documents
c
//IIR filter
//using direct form
//normalized to unity gain, and with a(1)=1
// a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb)
// - a(2)*y(n-1) - ... - a(na+1)*y(n-na)
#include <mega32.h>
#include <stdio.h>
#include <stdlib.h>
LD R20,Y ;load b
LDD R21,Y+1
pop r21
pop r20
#endasm
end
;mac operation
muls r23, r21 ; (signed)ah * (signed)bh
add r31, r0
mul r22, r20 ; al * bl
add r24, r0
adc r30, r1
adc r31, r27
mulsu r23, r20 ; (signed)ah * bl
add r30, r0
adc r31, r1
mulsu r21, r22 ; (signed)bh * al
add r30, r0
adc r31, r1
;end mac operation
pop r21
pop r20
#endasm
end
//========================================================
//second order IIR -- "Direct Form II Transposed"
// y(n) = b(1)*x(n) + b(2)*x(n-1) + b(3)*x(n-2)
// - a(2)*y(n-1) - a(3)*y(n-2)
//assumes a(1)=1
// a's and b's need to be global, in RAM and set to fixed point values
// also input and output history values
//example:
// #pragma regalloc-
// int b1,b2,b3,a2,a3, xn_1, xn_2, yn_1, yn_2 ;
// #pragma regalloc+
// b1=0x0010;
// a1=float2fix(-(value from matlab))
//
// The following ASM code is equivalent to:
// yy=0; yy = macfix(b1,xx,yy);
// yy = macfix(b2,xn_1,yy);
// yy = macfix(b3,xn_2,yy);
// yy = macfix(-a2,yn_1,yy);
// yy = macfix(-a3,yn_2,yy);
// //update the state variables
// xn_2 = xn_1;
// xn_1 = xx;
// yn_2 = yn_1;
// yn_1 = yy;
// return yy;
#endasm
end
#pragma warn+
//========================================================
void main(void)
begin
//serial setop for debugging using printf, etc.
UCSRB = 0x18 ;
UBRRL = 103 ;
putsf("\r\nStarting...\r\n");
prod = 0x0a00;
while(1)
begin
printf("enter a float:") ;
scanf("%s",fInString); fIn = atof(fInString);
printf("%f",fIn);
fInFix = float2fix(fIn);
printf(" fixed rep:%04x\r\n",fInFix);
end
//============================================
TCCR1B = 1 ;
TCNT1 = 0;
junk = macfix(fInFix, cInFix, prod) ;
TCCR1B = 0;
printf("macfix cycles=%d\n\r",TCNT1) ;
//============================================
TCCR1B = 1 ;
TCNT1 = 0;
junk = IIR2(xn) ;
TCCR1B = 0;
printf("IIR cycles=%d\n\r",TCNT1) ;
//============================================
end
end