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


von Paul H. (powl)


Lesenswert?

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

von Peter D. (pdiener) Benutzerseite


Lesenswert?

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:
1
int old_samples[10];
2
const int FIR_coeff[10] = {10,20,50,50,100,100,50,50,20,10};
3
int i, output_sample;
4
5
for (;;)
6
{
7
  for(i=9, i>0, i--)
8
  {
9
    old_samples[i] = old_samples[i-1];
10
  }
11
  old_samples[0] = get_new_sample_from_adc();
12
  
13
  output_sample = 0;
14
  
15
  for(i=0; i<10; i++)
16
  {
17
    output_sample += (old_samples[i] * FIR_coeff[i]);
18
  }  
19
20
  send_filtered_sample(output_sample);  //output_sample enthält die gefilterten samples
21
22
}

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

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

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

von Paul H. (powl)


Lesenswert?

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

von Paul H. (powl)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

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.

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.