www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Digitales Tiefpassfilter fg=60Hz mit AVR (Achtung Anfänger)


Autor: Paul Hamacher (powl)
Datum:

Hi,

Ich möchte einen AVR als digitales Tiefpassfilter und zur Ansteuerung
einer Bargraph-Leve-Anzeige verwenden. Die Grenzfrequenz beläuft sich
auf 60Hz. Bis zur Grenfrequenz soll es so gut wie keine Abschwächung des
Signals geben. Danach soll es möglichst steil fallen mit 24 bis 48dB
Steilheit pro Oktave. Mehr nehme ich natürlich auch immer gerne an ;-)

Eins vorweg: Ich habe mich vorher noch nie mit digitaler
Signalverarbeitung beschäftigt, meine mathematischen Kenntnisse belaufen
sich auf die eines guten Schülers der 13. Klasse, mehr nicht. Wenn ich
nun per Google nach solchen digitalen Filtern suche lande ich meistens
bei Uni-Vorlesungen als PDF oder bei vergleichbaren Seiten. Dort wird
mit fachbegriffen und komplizierten mathematischen Formeln nur so um
sich geschmissen. Bisher habe ich aber noch keine Seite entdeckt wo man
als Anfänger an die Thematik und die Theorie erstmal ohne Formelsalat
herangeführt wird, wo einem erstmal die Grundlagen vermittelt werden.
Die ganzen Formeln sind zwar schön und sicher nützlich aber nicht
solange nicht gesagt wird, was man da eigentlich berechnen möchte.
Irgendjemand hat sich doch den ganzen Krempel mal ausgedacht, hat sich
bestimmte Theorien im Kopf ausgemahlt und das erst dann in
mathematischen Formeln ausgedrückt. Diese Theorie suche ich, die Formeln
dürfen hinterher meinetwegen kommen, vielleicht versteh ich dann auch
was sie bedeuten, wenn ich erstmal weiß wozu sie gedacht sind.

Für soetwas würde ich natürlich auch gerne Geld ausgeben wenn ich dafür
was vernünftiges bekomme. Sowas wie "DSP für Dummies" wäre in meinem
Fall sogar angebracht.

Hat da jemand Quellen für mich bzw. kann mir jemand mal das Grundprinzip
von so einem Filter erklären?

lg PoWl
Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Hallo Paul,

ich würde bei deiner Anwendung auf einem 8bit AVR einen FIR (= Finite
Impulse Response) Filter ausprobieren. Dieser beruht darauf, dass man
sich einen Schleppspeicher an samples anlegt, der dann in jedem
Zeitschritt zu einem neuen, gefilterten Ausgangssample umgerechnet wird.
In dem Schleppspeicher stehen am Anfang das aktuelle sample, dann das
sample von einem Zeitschritt vorher , dann das von zwei Schritten vorher
und so weiter. Man braucht um so mehr alte samples im Speicher, je
steiler der Filter werden soll.

Wenn also ein neues sample vom AD Wandler kommt, schiebt man den Inhalt
des Schleppspeichers um einen Zeitschritt weiter, setzt an die jetzt
frei gewordene Stelle das neue Sample und berechnet das neue
Ausgangssample aus allen Werten des Schleppspeichers, wobei jeder Wert
mit einer bestimmten Konstanten (den Filterkoeffizienten) multipliziert
wird und die Ergebnisse zu dem neuen Sample aufaddiert werden.

Ich zeige dir hier einen einfachen FIR Filter mit 10
Verzögerungsschritten, der ist noch zu klein, um deine Aufganbe zu
lösen, aber du wirst das Prinzip verstehen:
int old_samples[10];
const int FIR_coeff[10] = {10,20,50,50,100,100,50,50,20,10};
int i, output_sample;

for (;;)
{
  for(i=9, i>0, i--)
  {
    old_samples[i] = old_samples[i-1];
  }
  old_samples[0] = get_new_sample_from_adc();
  
  output_sample = 0;
  
  for(i=0; i<10; i++)
  {
    output_sample += (old_samples[i] * FIR_coeff[i]);
  }  

  send_filtered_sample(output_sample);  //output_sample enthält die gefilterten samples

}


Normalerweise schiebt man die samples nicht so, wie ich es jetzt gezeigt
habe durch den old_samples Puffer, sondern verwendet Pointer, die Anfang
und Ende markieren und nur die Pointer werden geschoben, das spart die
Arbeit zum Umkopieren der samples. Ich habe es nur so gemacht, weil es
zum Verstehen einfacher ist.

Ich hoffe, das hilft dir schon weiter. Zusammen mit dem, was man über
FIR Filter im Web lesen kann, solltest du dein Problem damit lösen
können.

Grüße,

Peter
Autor: Abdul K. (ehydra) Benutzerseite
Datum:

Soweit waren wir mit ihm schon. Er möchte allerdings die Herleitung der
Filterstruktur und -koeffizienten auf einfache Art.

siehe vorherige Diskussion hier:
Beitrag "Re: Allgemeine Frage zu Verstärker-ICs"


Kennst du eine gute Webseite dazu?



Gruß -
Abdul
Autor: Paul Hamacher (powl)
Datum:

Danke @ Peter, das bringt mich schonmal ein ganzes Stück näher!

Auch folgende Seiten helfen mir grade weiter:
http://www.sprut.de/electronic/pic/16bit/dsp/fft/fft.htm
http://www.sprut.de/electronic/pic/16bit/dsp/fir/fir.htm
http://www.sprut.de/electronic/pic/16bit/dsp/iir/iir.htm
Autor: Paul Hamacher (powl)
Datum:

Mal noch eine Frage zu dem Thema:

Wäre es nicht auch möglich ein Analogtiefpassfilter im µC zu simulieren?
Die Eingangswerte werden abgetastet so schnell es der AVR ADC halt
schafft und dann wird ein RC- oder LC-Glied im AVR softwaremäßig
simuliert.
Autor: Gast (Gast)
Datum:

Klar geht so etwas.
Differentialgleichung des Filters aufstellen.
Darauf die Übertragungsfunktion in z-Ebene aufstellen.

Ich kenne deinen AVR nicht, ich vermute aber, der ADC wird schneller als
die verarbeitende Logik sein.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net