Forum: Digitale Signalverarbeitung / DSP / Machine Learning Dig. Bandpass auf AVR


von Mike (Gast)


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

von Detlef _. (detlef_a)


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

von Mike (Gast)


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

von Mike (Gast)


Lesenswert?

Und wieviel RAM benötigt man... bzw. muss man mit Arrays arbeiten und 
wird dies fließend berechnet?

von Detlef _. (detlef_a)


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

von Mike (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.