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