Guten Morgen, ich benötige für ein anstehendes Projekt einen Bandpass Filter. Ansprüche an Steilheit etc. habe ich eigentlich nicht. Ich möchte nur die max. Amplitude in einem Bestimmten Frequenzbereich (ca. 10kHz) bestimmen. Am besten wäre es wenn ich ca. jede Millisekunde ein neues Ergebnis errechnen könnte. Als Samplingfrequenz würde ich 22kHz vorschlagen. 8 Bit würden wahrscheinlich reichen. Da ich auf dem Gebiet noch recht unerfahren bin... Was meint ihr, ist sowas auf einem AVR (z.B. mit 16MHz) möglich? IIR, FIR? viel anderes muss ich nicht mehr machen. Oder sollte ich es doch lieber analog machen? Oder mit einem digitalen Filter IC, kennt jemand eins? Wenn ja, wo gibt es gute Beispiele (in C)? Vielen Dank schonmal, ich hoffe ihr könnt mir helfen Mike
Ja, das ist ohne Probleme machbar. IIR zweiter Ordnung sollte ausreichen, die beiden Polstellen so in der Nähe des Einheitskreises platzieren, daß Du mit der Bandbreite des Bandpaß zufrieden bist. Zwei Multiplikationen reichen aus, das schafft bei 22kHz selbst der AVR. Wenn Du die Mittenfrequenz auf die halbes Abtastfrequenz legst kommt man möglicherweise mit einer Multiplikation aus. Cheers Detlef
Hallo Detlef, vielen Dank für deine Antwort. Ich habe mich etwas undeutlich ausgedrückt. Nur sicherheitshalber nochmal: Ich will z.B. einen Bandpass mit Mittenfrequenz von 10kHz haben und einer Bandbreite von ca. 1 kHz. und das mit 22kHz vielleicht auch etwas mehr samplen. Von dem 1kHz Band würde ich die max. Amplitude auswerten. Das ganze am besten jede Millisekunde oder schneller. Man hätte ja pro Hz ca. 700 CPU Takte... ist ja auch schon einiges :-) Und das sollte so klappen? Grüße, Mike
Und wieviel RAM benötigt man... bzw. muss man mit Arrays arbeiten und wird dies fließend berechnet?
>>Ich habe mich etwas undeutlich ausgedrückt. Hab ich trotzdem verstanden. In Beitrag "IIR Filter mit Matlab" hab ich mal C-Code (funktionierend !) für nen IIR zweiter Ordnung gepostet. So im Prinzip machst Du das, mit dem Unterschied, daß die Koeffizienten andere sind und Du nicht in float sondern in integer rechnest. Die b Koeffizienten lauten b0=1, b1,b2=0. Die Rückkoppelkoeffizienten berechnest Du am besten mit Matlab oder Scilab: clear be=0.90; w=pi*10/11; fa=poly(be*[exp(-i*w) exp(i*w) ]); H= abs(freqz(1,fa,11000)); H=H/max(H); plot(20*log10(H),'.-'); grid Für den Betrag be=0.90 bekommst Du ungefähr eine 3dB Bandbreite von 1kHz, die Koeffizienten lauten dann 1.7271 und 0.8100. >>Und das sollte so klappen? Yep, 720ticks für rein/raus und 2 Multiplikationen reicht. >>Und wieviel RAM benötigt man... bzw. muss man mit Arrays arbeiten und >>wird dies fließend berechnet? Nix RAM, on the fly fließend rechnen. Ohne bißchen Verständnis von digitalen Filtern wird das allerdings nix, da mal rangehen. Cheers Detlef
Danke! Ich hatte das alles im Studium. In Matlab simuliert... aber schon wieder alles vergessen ;-) Werde mich demnächst dann einarbeiten. Ohne genaue Kenntnisse ist es immer schwierig. Mike
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.