PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : IIR



asuro11
28.05.2009, 16:11
hallo, ich mache gerade ein porgramm mit bandpassfiltern. und zwar soll einfach eine LED leuchten wenn ein bandpass aktiv ist.
das programm sieht so aus, dass 100 eingehende werte aufgenommen und verarbeitet werden. und zwar ist die filtergleichung:

y0 = x0 – x2 – ([a2*y1] >> 16) – ([a3*y2] >> 16)

aber jetzt meine frage. wann ist denn der bandpass aktiv, also wann ist denn der frequenzbereich vom bandpass gleich dem eingangssignal?

ist das dann x0=y0???

Besserwessi
28.05.2009, 17:44
"aktiv" ist der bandpass eigentlich immer. Wenn das Eingassignal im richtigen Frequenzbereich nichts hat, kommt halt wenig bei raus, also kleine Werte für y0. Wenn die Richtige Frequenz dabei ist gibts größere Werte für y0.

asuro11
29.05.2009, 11:58
würde dass dan klappen mit x0=y0 oder würdest du eher machen if y0>??? aber was sind denn die ??? was sind denn so die werte??

pidi
29.05.2009, 12:05
Hallo Asuru11,

versuch es mal folgender maßen.

If y0 > (x0 * x) then LED = 1

Mit dem Wert x kannst Du dann die Empfindlichkeit der LED verstellen. Der Werte für x ist dabei etwas zwischen 0 und 1

LG
PIDI

asuro11
29.05.2009, 12:35
danke schön. super!!!

habe jetzt noch ein programm geschrieben um zu überprüfen ob meine Schaltung überhaupt funktioniert. und zwar nehme ich einen bandpass mit realtiv großer bandbreite und wenn dann output[n] größer als 0 ist, bedeutet es ja, dass ein Signal eingegangen ist...



#include <inttypes.h>
#include "asuro.h"

void bpfilter(int8_t *input,int8_t *output, uint16_t *length, int32_t koeff)
{

int32_t a2; /* a2 als Integervariable festlegen*/
int32_t a3; /* a3 als Integervariable festlegen*/
int32_t GAIN_FRAC; /* GAIN_FRAC als Integervariable festlegen*/
int32_t x0,x1,x2; /* x0,x1,x2 als Integervariable festlegen*/
int32_t y0,y1,y2; /* y0,y1,y2 Integervariable festlegen*/
uint16_t n; /* n Integervariable festlegen*/
uint16_t i; /* i als Integervariable festlegen*/


x1=0; /* Wert für x1 festlegen*/
x2=0; /* Wert für x2 festlegen*/
y0=0; /* Wert für y0 festlegen*/
y1=0; /* Wert für y1 festlegen*/
y2=0; /* Wert für y2 festlegen*/
x0=1; /* Wert für x0 festlegen*/
length=100; /* Wert für length festlegen = Wert der Signallänge*/
a2=3;
a3=2;
GAIN_FRAC=1;

for (n=0;n<length;n++)
{
x0=input; /* x0 als Eingang festlegen*/
y0=x0-x2-((a2*y1)>>16)-((a3*y2)>>16); /* Gleichung um y0 zu berechnen*/
x2=x1;
x1=x0;
y2=y1;
y1=y0;

output[n]=((y0*GAIN_FRAC)>>16); /* Gleichung um Ausgang zu berechnen*/

if (output[n]>0) /* wenn ein Signal erkannt wird, ist output[n] immer größer 0*/
{
DDRB|=(1<<PB1); /*Setze PB_1 auf output*/
PORTB|=(1<<PB1); /*Setze PB_1 auf 1 --> KontrollLED leuchtet*/
Sleep(100);
PORTB&=~(1<<PB1);
}
}
}


blos habe ich jetzt n error drin:

c:/winavr-20080610/bin/../lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/crtm8.o:(.init9+0x0): undefined reference to `main'


was ist falsch??