Dig. Bandpass auf AVR

Gast #804426
Lesenswert?

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
#804532
Lesenswert?

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
Gast #804587
Lesenswert?

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
#804632
Lesenswert?

>>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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren