Dig. Bandpass auf AVR

Gast #804426
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
Gast
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
>>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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.