Forum: Digitale Signalverarbeitung / DSP / Machine Learning FIR-Filter realisieren, ich bin am verzweifeln.


von André (Gast)


Lesenswert?

Hallo liebe Forengemeinde,

ich beschäftige mich jetzt bereits seit einiger Zeit mit einem 
Algorithmus auf einem AVR mit dem ich in Verbindung mit einem Gyro und 
einem Beschleunigungssensor eine exakte Lage bestimmen kann.
Das alles funktioniert schon ziemlich gut, auch die Berechnung der Lage 
ist 1a.

Nun zu meinem Problem: Ich möchte die Lage nur für eine Achse bestimmen, 
soweit so gut. Lasse ich jetzt den Lagesensor aus, sagen wir 5cm, auf 
den Tisch fallen, so erhalte ich eine sehr schnelle Lageänderung (bspw. 
0° -> 75° -> 0°), obwohl sich der Sensor nicht um die Drehachse gedreht 
hat.
Meine Idee ist also einen Tiefpassfilter zu realisieren, der solche 
Spitzen filtert. Und da nimmt das Elend seinen Lauf...
Ich habe bereits einen FIR Filter als passenden Filter identifiziert. 
Mir ist auch gelungen diesen als einen einfachen Mittelwertfilter 
bereits zu implementieren. Er funktioniert auch soweit, aber ich habe 
das Gefühl, dass der neue Kurvenverlauf noch nicht optimal ist.
Das bringt mich also zu der Notwendigkeit nun doch Filterkoeffizienten 
verwenden zu müssen. Meine letzte Vorlesung zum Thema Signale und 
Systeme ist allerdings schon über 10 Jahre her und ich hab es damals 
schon nicht wirklich verstanden...
Wie kann ich denn nun mit möglichst geringem Aufwand (wenn ich das mal 
so sagen darf) ermitteln, wie ich den Filter auslegen muss?
Also, wieviele Werte muss ich für die gewichtete Mittelwertberechnung 
vorhalten?
Wie komm ich am schnellsten an die Koeffizienten?
Und ggf. wie komm ich an die Werte, die ich ggf. in eine fertige Formel 
rein tun muss, damit ev. Koeffizienten raus kommen? Hier gibt es ja 
bspw. eine Seite, mit der man sich sogar C-Code ausgeben lassen kann, 
aber welchen Filter müsste ich denn dann nehmen und welche Werte muss 
ich denn da rein füttern?
http://www-users.cs.york.ac.uk/~fisher/mkfilter/
Ich hab ja bestenfalls eine Messreihe, die aufnehmen könnte...

Am Rande sei noch erwähnt, dass ich 200 Samples/s von den Sensoren 
abfrage.

Kann mir bei dem Problem vielleicht einer von euch helfen?
Ich liefere natürlich gern alle Werte, die ev. noch in irgendeiner Form 
benötigt werden...

Besten Dank schonmal für eure Zeit!

MFG,
André

von User (Gast)


Lesenswert?

Hallo,

du kannst ja solch einen Fehlerfall mal aufnehmen und z.B. in eine *.csv 
Datei speichern. Dann kannst du ausprobieren was ein Filter damit macht. 
Neben Matlab, Octave und Scilab kannst du auch Python mit Numpy/Scipy 
verwenden um Filter zu entwerfen und zu testen. Je nachdem wo du am 
besten zu recht kommst...

Da du keine genauen Spezifikationen hast wuerde ich es einfach mit der 
Try-Error Methode probieren, also Filter entwerfen (wie du an die 
Koefizienten kommst ist in den Dokumentationen beschrieben) und testen 
ob das Ergebnis gut ist.

Nicht vergessen auch andere Daten zu filtern und schauen ob die 
errechneten Ergebnisse noch passen...

Gruss

von Markus B. (russenbaer)


Lesenswert?

Überlege Dir was die maximale Drehgeschwindigkeit/maximale 
Winkeländerung ist die Du messen können willst.
Mit der Abtastrate von 200Hz und dieser Information kannst Du Dir Deine 
TP Grenzfrequenz ausrechnen und den TP entwerfen.
Wenn nun Dein Sensor runterfällt und die sich (fälschlicherweise) 
ergebende Frequenz liegt im Nutzband kannst Du mit einfachem Filtern eh 
nicht mehr viel tun.
Ich würde trotzdem nach dieser Methode vorgehen.

Zum Entwurf kannst Du z.B. MATLAB (fdatool) verwenden - oder andere 
Tools im Netz suchen.
Bzw. wenn Du die Grenzfrequenz hast, die Anzahl der Koeffizienten (die 
Ordnung des Filters) und den Filtertyp weisst kannst ja noch einmal im 
Forum nach Koeffizienten nachfragen ;)

von André S. (trusti)


Lesenswert?

Hallo Markus,

danke für die Tipps! Natürlich auch an Gast.
Darf ich das mit den Koeffizienten als ein Angebot verstehen?
Mit Matlab ist das so ne Sache, ich hab natürlich schon auf vielen 
Seiten gelesen, dass man damit die Filter super berechnen können soll.
Meine Erinnerungen (sind auch schon 10 Jahre alt) an Matlab sind 
allerdings so, dass ich glaube, ich brauch erstmal ein halbes Jahr um 
das Programm korrekt bedienen zu können. Irre ich da? Da war doch ne 
eigene Sprache für erforderliche...
Ich muss mir mal ausdenken, wie ich an die Grenzfrequenz komme...
Meld mich dann nochmal.

Vielen Dank schon mal und natürlich bin ich auch für weitere Hilfe 
dankbar!

MFG,
André

von Paul B. (Gast)


Lesenswert?

Die Koeffizienten richten sich nach der Art des Filters. Für ein 
einfaches monotones Bandfilter, zb. einem Tiefpass ist das analytisch 
darstellbar und kann ausgerechnet werden. Dazu eigent sich nebst MATLAB 
z.B. FIRTool.exe (guhgel) von MEDIATRONICS. Das ist auf einigen freeware 
servern noch drauf.

Allerdings taugen diese einfachen monotonen Filter für die meisten 
Anwendungen nicht.

von Dieter F. (Gast)


Lesenswert?

In dem Bereich verwendet man wohl oft/meist den Kalman-Filter. Da gibt 
es massig Doku und Beispielprogramme ...

von Martin M. (martinm_de)


Lesenswert?

Wenn Du  solche Spitzen rausfiltern willst, warum  nicht  die Spitze 
mit einem Hochpass detektieren und dann alle Messwerte um die Spitze 
herum auf Null setzen?

Die Werte  die  aus dem Sensor herauskommen wenn er auf den Tisch knallt 
werden dann eh Schrott  sein.

Also  einfach warten biss sich  die Werte "beruhigt" haben und dann 
weitermachen.

von André S. (trusti)


Lesenswert?

Vielen Dank für eure Hilfe.

@Markus: Ich habe dir eine PM geschickt, ich hoffe die ist angekommen, 
denn ich hatte da einen Anhang ran gehängt.

@Frank: Das FIR Tool werd ich mir bei Gelegenheit mal anschauen, aber 
wie du ja schreibst, sind die damit ermittelten Filter nicht doll!?

@Dieter: Einen Kalmanfilter habe ich bereits in der Vergangenheit 
angetestet. Hat gut funktioniert, aber ich habe mich dann letztlich auch 
aus Performancegründen für einen Komplementärfilter entschieden. Nicht 
zuletzt auch deswegen weil ich in meinen Tests keinen besonders großen 
Vorteil des Kalmanfilters gegenüber des Komplementärfilters feststellen 
konnte.

@Martin: Die Idee finde ich interessant, aber wo liegt der 
aufwandsmäßige Unterschied einen Hochpass zu bauen oder einen Tiefpass? 
Und weiter stelle ich mir die Frage, was wenn mein Sensor nicht auf dem 
Nullpunkt ist (sagen wir 30°)? Dann wäre es ja ziemlich unglücklich den 
Winkel bei einer Spitze auf 0 zu setzen.

MFG,
André

: Bearbeitet durch User
von Paul B. (Gast)


Lesenswert?

André Synonym schrieb:
> @Frank: Das FIR Tool werd ich mir bei Gelegenheit mal anschauen, aber
> wie du ja schreibst, sind die damit ermittelten Filter nicht doll!?
Die Koeffizienten stimmen schon, das TPF wird korrekt gebaut. Meine 
Aussage bezieht sich aber darauf, dass ein einfaches TPF für die 
Anwendungen nicht tauglich ist. Oft braucht es "verbogene Filterkurven". 
Ein so richtig universelles Tool, das das leistet habe ich auch noch 
nicht aufgefunden.

von Eric (Gast)


Lesenswert?

Verbogene Filterkurven ???


Mit Matlab kannst du den Frequenzgang vorgeben. Oder bei IIR Filter 
kannst auch einfach Die Pol und Nullstellen angeben -> da hast dein 
gewünschten Frequenzgang. Den kannst auch wieder über Impulsantwort in 
FIR-Filter umwandeln

Matlab ist Stand der Technik für Filterberechnung. Wer berechnet die 
Koeffizienten noch selber -> erstens nicht trivial Zweitens -> Dauert 
viel zu lange

von Thosch (Gast)


Lesenswert?

Martin Maschmann schrieb:
> Wenn Du  solche Spitzen rausfiltern willst, warum  nicht  die Spitze
> mit einem Hochpass detektieren und dann alle Messwerte um die Spitze
> herum auf Null setzen?

André Synonym schrieb:
> Und weiter stelle ich mir die Frage, was wenn mein Sensor nicht auf dem
> Nullpunkt ist (sagen wir 30°)? Dann wäre es ja ziemlich unglücklich den
> Winkel bei einer Spitze auf 0 zu setzen.

Das geht gnadenlos schief!
Zum Ausfiltern von einzelnen Ausreißern bietet sich ein Medianfilter an.
Ggf. könnte man die Methoden kombinieren, d.h. ein Hochpaßfilter zum 
Detektieren von Ausreißern und als Setzwert dann nicht 0 nehmen, sondern 
den Median-Wert aus einem längeren Medianfilter. (gleitende 
Median-Bildung)

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.