Forum: Digitale Signalverarbeitung / DSP / Machine Learning Geschwindigkeit durch FIR Filter bestimmen?


von geschwindigkeit (Gast)


Lesenswert?

Hi Leute, hab' ne kleine Frage.

Ich habe einen Vektor mit Positionswerten eines Motors. Daraus möchte 
ich die Geschwindigkeit bestimmmen. Die Werte sind in äquidistanten 
Abständen abgetastet worden.

Das ganze soll in matlab geschehen.

Ich kann per Differenzenquotienten die Geschwindigkeit ermitteln: 
v(n)=(q(n+1)-q(n))/T

Jetzt möchte ich das aber ohne Schleife implementieren und hab' an FIR 
Filter gedacht. Mit filter([1 -1]./T,1,q) kannn ich die Daten filtern. 
Es kommt exakt der selbe Plot heraus, nur um eine Arrayposition 
verschoben. Logisch, wenn ich mir den FIR Filter aufschreibe kommt 
folgendes: v(n)=(q-q(n-1))/T

Das kann man "integrieren" und erkennt, dass v eine Positionin früher 
(quasi in der Zukunft) kommt.

Dann habe ich aber gelesen, dass dieser Filter eben die Geschwindigkeit 
sein soll. Was stimmt denn nun?

Und noch was: Ist filter([1 1 1 1 1]./5,1,q) ein "echter" moving average 
Filter? Eigentlich fehlen doch die Werte von einer Seite?

Danke + schöne Grüße

von russenbaer (Gast)


Lesenswert?

Servus,

Dein erstes Filter (v(n)=(q(n+1)-q(n))/T) ist akausal, da es auf Daten 
der Zukunft zugreift. Ist ansich kein Problem bei gespeicherten Daten, 
sollte Dir aber bewusst sein. Ob es die "richtige" Gescwindigkeitsformel 
ist mußt Du auch für Dich entscheiden, die zweite Version 
(v(n)=(q-q(n-1))/T) schaut für mich vernünftiger aus.

Jedes Filter hat eine Gruppenlaufzeit, das bedeutet in Umgangssprache 
wie lange eine Frequenzgruppe durch das Filter braucht. Bei 
gespeicherten Daten könntest Du das Ausgangssignal verschieben, auch 
akausal (d.h. in die Zukunft) wenn Du das für Deine Auswertung brauchst 
(wenn es das ist was Du mit "integrieren " meinst).

Rick Lyon hat auf DSPrelated einen guten Artikel über Differenzatoren 
(das ist das was Du brauchst) geschrieben:

http://www.dsprelated.com/showarticle/35.php

Meinem Verständnis nach ist jedes FIR Filter ein "moving averager" und 
jedes IIR ein "autoregressive filter", wobei ich denke dass das Filter 
"filter([1 1 1 1 1]./5,1,q)" nicht das ist was Du brauchst.

Wenn u Zugang zu MATLAB oder OCTAVE hast kannst Du Dir die Frequenzgänge 
bzw. die Gruppenlaufzeit mit den Funktionen
freqz bzw. grpdelay
zeichnen lassen.

lg
russenbaer

von geschwindigkeit (Gast)


Lesenswert?

Hey, danke für die Antwort!

Dass das erste Filter antikausal ist ist mir bewusst. Nur ist das halt 
irgendwie die Geschwindigkeit, wie sie sich mir am plausibelsten 
erscheint ;)

Den Link werde ich nun durcharbeiten, danke dafür.

Das moving average Filter war gedacht, um später die abgetasteten Werte 
zu glätten.

Es ist allerdings so, dass der Motorwinkel nur ca 3 Mal pro Umdrehung 
abgetastet wird. Vermutlich sollte ich daher vorher die Werte geeignet 
interpolieren, hast du da auch noch einen Tip für mich?


Danke + schöne Grüße

von Przemek B. (przemek_b)


Lesenswert?

Hi
I hab gesehen einmal, dass ein Kerl dieses Problem mit Kalman filter 
ausgelost hat. Das sah sehr gut aus. Im Gegensatz zu simple "moving 
average" Ansatz, Kalman filter ermoglicht kein Verspatung. Das wird 
durch ein "Vorausberechnung" erreicht. Wenn du willst, ich kann 
vielleicht das heraussuchen und dir schicken.

Ich muss mich enschuldigen fur mein schlechtes Deutsch.

von geschwindigkeit (Gast)


Lesenswert?

Ist kein Problem, habe dich verstanden ;)

Wenn es dir keine Umstände macht, wäre das natürlich cool. Aber einen 
Kalman bekomme ich auch selbst noch hin denke ich.

Ich habe mir die Frequenzgänge meines Filters (Geschwindigkeit) 
angesehen und verstanden, dass dieser eher Hochpass als 
Tiefpasscharakteristik besitzt. Dadurch wird ein evtl vorhandener Ripple 
natürlich verstärkt.

Aber ich kann ja jetzt nicht einen beliebigen Tiefpass (z.B. einen 
Kalman mit schönem Frequenzgang) darauf loslassen, dann erhalte ich doch 
nicht mehr die Geschwindigkeit?

Danke für eure Antworten!

von Przemek B. (przemek_b)


Lesenswert?

Hi!
1) Was du eigentlich brauchst von Kalman ist die Formel auf Seite 19. 
Das ist leider auf Polnisch. Ich kann dir damit helfen wenn du Probleme 
hast

2) Ja, mit Filterkoefizienten soll man aufpassen, ansonsten hat das 
keinen physicalishen Grund.
Du kannst erst eine Reihe von v(n) aufbauen. Dann sollst du diese Reihe 
durch ein Filter verarbeiten. Es soll gut arbeiten und es besteht keine 
Bange dass die Ergebnisse keinen Sinn haben.

(Sorry fur mein schlechtes Deutsch)

von Karl (Gast)


Lesenswert?

Kanonen und Spatzen: "help diff"

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.