Forum: Mikrocontroller und Digitale Elektronik Einfaches Tiefpassfilter


von Dominik (Gast)


Lesenswert?

Für ein paar Versuche bin ich auf der Suche nach einer einfachen 
Implementierung für ein Tiefpassfilter in C.
Ich messe mit einem ATmega168 256 Werte (8Bit) eines Signals mit etwa 
500Hz Grenzfrequenz, die Abtastrate ist 10KHz.
Die Filterkoeffizienten habe ich bereits mit Matlab berechnet und dort 
auch ausprobiert (natürlich Integer...)
Ich möchte nun also das Array mit den 512 Werten Filtern und dann an den 
PC schicken. Mein Problem ist die Filterimplementierung.
Hat jemand ein einfaches Beispiel?

von Oliver R. (oliverr)


Lesenswert?

1
// Tiefpassfilter erster Ordnung. vin= Eingang, vg=geglätteter Ausgang
2
// Die Berechnung sollte mit int16 durchgeührt werden
3
// also den Eingangswert entsprechend hochschieben 
4
// als divisor immer nur 2hochx nehmen, damit der prozessor nur schieben muss
5
6
vin = vadc << 8 ;
7
vg += (vin-vg) /32 ;

Grüße
or

von Dominik (Gast)


Lesenswert?

danke, werde ich mal ausprobieren.
Wie kann ich ein Filter höherer (z.B. 6. Ordnung) implementieren und auf 
ein Array anwenden?

von Helmut L. (helmi1)


Lesenswert?

Dominik schrieb:
> Wie kann ich ein Filter höherer (z.B. 6. Ordnung) implementieren und auf
> ein Array anwenden?

In dem du es in Teilfilter 2. Ordnung aufsplitest .

von Dominik (Gast)


Lesenswert?

Und wie macht man das bitte?

von Helmut L. (helmi1)


Lesenswert?

Du dimensonierst erst mal ein Analoges Filter mit dem gewünschten 
Frequenzgang. Die werden meistens in Teilfilter 2.Ordnung dimensoniert.
Die dann berechneten Parameter werden dann mittels Bilineare 
Transformation in den z-Bereich transformiert. Un dschon hast du deine 
Koeffizenten der IIR-Teilfilter. Deine Daten werden dann durch die 3 
Teilfilter hintereinander gefiltert.

von Dominik (Gast)


Lesenswert?

@Helmut Lenzen:
Wer lesen kann (meinen ersten Post...), ist klar im Vorteil:
"Die Filterkoeffizienten habe ich bereits mit Matlab berechnet und dort
auch ausprobiert (natürlich Integer...)"

Kennt also bitte jemand der sich die Foreneinträge auch wirklich 
durchliest und nicht nur seinen Mist dazuschreibt, auch wenn er keinen 
Sinn ergibt, eine einfache IMPLEMENTIERUNG eines Tiefpassfilters höherer 
Ordnung wenn man die Koeffizienten schon hat?

von Michael N. (much)


Lesenswert?

Dominik schrieb:
> Kennt also bitte jemand der sich die Foreneinträge auch wirklich
> durchliest und nicht nur seinen Mist dazuschreibt, auch wenn er keinen
> Sinn ergibt, eine einfache IMPLEMENTIERUNG eines Tiefpassfilters höherer
> Ordnung wenn man die Koeffizienten schon hat?

So wie ich das gelernt habe können analoge Filter (ich nehm mal an du 
hast ein analoges Filter designt. Genauere Informationen haben wir ja 
nicht) nicht so einfach wie du dir das vorstellst in diskrete Filter 
umgemüntzt werden. Du solltest dein System also im q-Bereich (Stichwort: 
Tustin-Transformation) nach den selben Prinzipien wie im s-Bereich neu 
designen und daraus dann durch Überführung in den z-Bereich die 
Implementierung als digitales Filter berechnen.

PS: Ich kann überhaupt nicht verstehen wiso du dich über die Posts von 
"helmil" so aufregst. Man versucht dir ja nur zu helfen!

von Helmut L. (helmi1)


Lesenswert?

Dominik schrieb:
> Wer lesen kann (meinen ersten Post...), ist klar im Vorteil:
> "Die Filterkoeffizienten habe ich bereits mit Matlab berechnet und dort
> auch ausprobiert (natürlich Integer...)"

Du hattes mich nach dem allgemeinen Vorgehen bei der Dimensionierung von 
Digitalen Filtern gefragt. Und ich habe dir das Verfahren erklaert wie 
es in der Literatur beschrieben ist um von einem Analogen Filter zu 
einem gleichwertigen Digitalen Filter zu kommen. Und da wird zuerst ein 
Analoges Filter designt. (Damit mein ich jetzt nicht die Widerstaende 
und Kondensatoren zu berechnen sondern die allgemeine 
Uebertragungsfunktion)
Und diese Analogen Koeffizenten werden dann mittels Bilinearer 
Transformation in den z-Bereich uebersetzt. Diese Transformation ist 
auch wie Michael auch sagte als Tustin-Transformation bekannt. Aus 
dieser Digitalen Uebertragungsfunktion wird dann mittels 
z-Transformation die Differenzengleichung erzeugt. Man zerlegt Filter 
hoehere Ordnung vorteilsweise in Teilfilter 2. Ordnung um keine zu hohe 
Spreizung der Koeffizenten zu bekommen was zu Rechenungenaugikeiten 
fuehrt.
Dasselbe gilt ja in aenlicher Form fuer Analoge Filter.

Die allgemeine Formel lautet:

       B0 + B1*z + B2*z^2
H(z) = ------------------
       A0 + A1*z + A2*z^2

Dabei sind dann A0,A1,A2,B0,B1.B2  deine aus der Bilineraren 
Transformation erzeugten Koeffizenten.


Beispiel:

Filter 2.Ordnung , Samplerate 8Khz,Butterworth, Grenzfrequenz 200Hz
Fliesskommaformat

Analoge Form:
              1
H(s) = -------------------
       1 + 1.414 * s + s^2

Daraus ergeben sich mit hilfe der BT:

A0 = 0.05542
A1 = 0.011085
A2 = 0.05542
B0 = 1
B1 = -1.778634
B2 = 0.800804

Die werden dann entsprechend in ein Q Format umgerechnet:
in Q30 Format z.B. mit 1073741824L multipliziert.


Der 'C' code zum Filter:

long  Q30Lowpass(long Q30Val)
{
  Q30X2 = Q30X1;
  Q30X1 = Q30X0;
  Q30X0 = Q30Val;
  Q30Y2 = Q30Y1;
  Q30Y1 = Q30Y0;


  Q30Y0 =  Q30Mult(Q30X0,Q30LA0);
  Q30Y0 += Q30Mult(Q30X1,Q30LA1);
  Q30Y0 += Q30Mult(Q30X2,Q30LA2);
  Q30Y0 -= Q30Mult(Q30Y1,Q30LB1);
  Q30Y0 -= Q30Mult(Q30Y2,Q30LB2);

    return(Q30Y0);
}

Q30Mult ist eine Fixkommamultiplizierungsroutine.

Und fertig ist dein Digitales Filter. Und Dominik auch so hinbekommen?



Dominik schrieb:
> Kennt also bitte jemand der sich die Foreneinträge auch wirklich
> durchliest und nicht nur seinen Mist dazuschreibt, auch wenn er keinen
> Sinn ergibt,

Ob das Sinn ergibt oder Mist ist, was ich schreibe kannst du als 
nichtwissender in Sachen Digitaler Filter nicht beurteilen. Denn nach 
diesem Verfahren habe ich schon sehr viele Digitale Filter 
dimmensioniert.

von Dominik (Gast)


Lesenswert?

Ich bin (theoretisch) nicht unwissend. Wie bereits geschrieben habe ich 
die Koeffizienten (natürlich für Digitalfilter, darum gehts ja...) 
bereits erfolgreich berechnet, skaliert und auch getestet. Mit möglichst 
minimaler Koeffizientenspreizung etc. Ja, das ist nicht so schwer und 
geht auch ohne Z-Transformation wenn man matlab bedienen kann...
Was mir fehlt ist eine ordentliche Implementierung in C damit ich die 
Koeffizienten auch auf meine Messwerte auf dem Mikrocontroller anwenden 
kann.
Und in diesem Fall ist es wirklich Mist, wenn jemand eine bereits 
geklärte Frage neu zu beantworten versucht und nicht auf das Problem 
eingeht.

von Harald W. (wilhelms)


Lesenswert?

Dominik schrieb:

> Für ein paar Versuche bin ich auf der Suche nach einer einfachen
> Implementierung für ein Tiefpassfilter in C.

Hast Du Dich denn schon für einen Filtertyp entschieden?
(Butterworth, Chebyshev, Bessel, Gauss und noch einige andere)
Bevor man sich mit der Implementierung von mehrstufigen Filtern
befasst, muss man schon einige Grundlagen der Filtertechnik
kennen. Zum Glüch gibts da viele passende Seiten im INet.
Ein Einstig ist, wie fast immer Wikipedia...
Gruss
Harald

von Helmut L. (helmi1)


Lesenswert?

Dominik schrieb:
> Und in diesem Fall ist es wirklich Mist, wenn jemand eine bereits
> geklärte Frage neu zu beantworten versucht und nicht auf das Problem
> eingeht.

Von Mist zu schreiben und dann eine solche Frage zu stellen

Dominik schrieb:
> Wie kann ich ein Filter höherer (z.B. 6. Ordnung) implementieren und auf
> ein Array anwenden?

laesst nicht gerade Durchblick erkennen und in dem Fall muss man weiter 
ausholen.

Und in Matlab wird es doch wohl eine Funktion geben die dir das Filter 
in Teilfilter 2. Ordnung zerlegt. Der Rest ist dann 10 Zeilen 'C' Code. 
Und warum das so gemacht wird habe ich dir ja versucht zu erklaeren und 
der Code steht oben. Einfach 3 x hintereinander aufrufen (mit anderen 
Koffs.) und schon steht das Filter 6. Ordnung.

Und darum halt ich es jetzt wie der alte Fritz hier „Macht Euch Euren 
Dregg alleene!“

von Dominik (Gast)


Lesenswert?

Wie bereits geschrieben: Der Filter ist berechnet und in matlab 
getestet, ich habe also bereits alle Koeffizienten für mein digitales 
Butterworth-Tiefpassfilter ich suche "nur" nach einer brauchbaren 
Funktion in C mit der ich den Filter auf meine Rohdaten anwenden kann.

von Roy (Gast)


Lesenswert?

Jaja, die Matlab Cracks.
Da du ja ohne Z-Transformation an deine Koeffizienten gekommen bist, 
verwendest du aller Wahrscheinlichkeit nach den Filter Designer (FDA 
Tool).
Ich nehme auch an, dass du dir schon Gedanken über Quantisierungseffekte 
(Grenzzyklen, Rundungsrauschen) gemacht hast. Speziell IIR Filter 
reagieren da mitunter sehr intolerant - die Schlingel.
Wie oben schon erwähnt wurde, könntest du dein resultierendes Filter in 
Sektionen 2ter Ordnung aufteilen (Second Order Sections). Dies wird 
sogar in der Praxis so gemacht! Hier hast du noch die Qual der Wahl 
zwischen diversen Strukturen (Direktstruktur I/II, transponierte, etc) 
welche dir Vor- und Nachteile bescheren.
Da du Matlab nach eigenen Angaben bedienen kannst wirst du auch die 
Koeffizienten der Biquads berechnen können und es resultiert eine 
einfache Funktion filter(...) in C. Die gewählte Struktur bestimmt dir 
dann die Implementation.

von Dominik (Gast)


Lesenswert?

Klingt alles sehr interessant. Die grundlegende Frage bleibt aber: Ich 
habe Koeffizienten und möchte die auf meine Messwerte im Array anwenden, 
sodass ich am Ende ein Array mit tiefpassgefilterten Messwerten habe.

von Christian G. (christian_g83)


Lesenswert?

Dominik schrieb:

> ich suche "nur" nach einer brauchbaren
> Funktion in C

Vielleicht hift Dir das hier ja:

http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html

Dort kann man ein paar Eckdaten eingeben und erhält dann ein Stückchen 
Quelltext, das den entsprechenden Filter implementiert.

Christian

von Martin (Gast)


Lesenswert?

Also als Jemand der weniger Vorwissen hat und über die Google Suche an 
diesen Forumsbeitrag gerät, kommt zunächst beim Lesen der eigentlichen 
Fragestellung Freude auf, eine nützliche Quelle gefunden zu haben. Je 
mehr man ließt, desto weniger informativ wird alles. Kann es sein, dass 
es nicht darum geht, jemandem die Frage nach einer einfachen 
Implementierung zu beantworten, sondern nur zu zeigen was für ein toller 
Hecht man ist? Ihr seid alle die Größten! Ich verteile Fleißmärkchen an 
euch alle! Manchmal schäme ich mich Ingenieur geworden zu sein...

von Ralf G. (ralg)


Lesenswert?

Helmut Lenzen schrieb:
> Und darum halt ich es jetzt wie der alte Fritz hier „Macht Euch Euren
> Dregg alleene!“

http://de.wikipedia.org/wiki/Friedrich_August_III._%28Sachsen%29#Als_K.C3.B6nig_.281904_bis_1918.29
;-)

von Helmut L. (helmi1)


Lesenswert?

@ Martin (Gast)

Es ist hier alles gesagt worden wie man ein Filter implementiert. Wenn 
Dominik aber lernresistent ist und alle Antworten ignoriert und meint es 
trotzdem besser zu wissen ist ihm nicht zu helfen.

Hätte er sich meinen Post
Beitrag "Re: Einfaches Tiefpassfilter"
mal genauer angeschauen hätte er festellen müssen das dort schon Code in 
C vorhanden ist für ein Tiefpassfilter 2. Ordnung. Diesen Programmteil 
hätte lediglich 3 mal aufrufen müssen mit anderen Koffs. und schon hätte 
er seinen Tiefpass 6. Ordnung. Stattdessen wurde ich von ihm beschimpft 
als ob ich nicht lesen könnte.

Martin schrieb:
> Kann es sein, dass
> es nicht darum geht, jemandem die Frage nach einer einfachen
> Implementierung zu beantworten, sondern nur zu zeigen was für ein toller
> Hecht man ist?

Ganz im Gegenteil aber lesen muss er schon selbst. Und ganz trivial ist 
das Thema digitale Filter nun auch nicht. Das haben ausser mir ihm 
andere auch gesagt. Mit nur Matlab bedienen zu können kann man keine 
digitalen Filter verstehen. Dazu gehört immer noch ein gutes Buch.

Martin schrieb:
> Ihr seid alle die Größten! Ich verteile Fleißmärkchen an
> euch alle! Manchmal schäme ich mich Ingenieur geworden zu sein...

Und wenn du schon solche Sprüche abläst dann bitte kannst du ja mal eine 
erklärung über digitale Filter für Dummys hier schreiben.

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.