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é
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
Ü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 ;)
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é
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.
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.
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é
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.
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
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)