PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : sin oder -sin in einer verrauschten Kurve finden



BiGF00T
21.04.2006, 10:55
Wie kann ich es anstellen, einen Sinus aus Messwerten zu erkennen?
Natürlich kann ich die Kurve zuvor glätten, sodass das Rauschen reduziert wird.
Der Sinus kann leider aber unterschiedliche Periodendauern haben und auch verschiedene Amplituden.
Meine Idee ist nun, alle Werte erstmal wegzuschreiben (linked list / array, egal erstmal), dann zu schauen, ob ich einen Nulldurchgang (oder nahe 0) habe, danach einen Hoch- oder Tiefpunkt erreiche, gefolgt von einem Nulldurchgang und danach wieder einen Tief- oder Hochpunkt gefolgt von einem Nulldurchgang.
(Ich will nur eine Periode erkennen) Dann meinen Sinus so strecken, dass er reinpasst und die Amplitude so hoch machen, wie die Maximal/Minimalwerte waren und dann die Fläche dazwischen berechnen...
Hört sich aber ungemein komplex an und die Fläche dazwischen wird wahrscheinlich nie wirklich 0 werden. Gibt es eine gute Methode, um einen speziellen Kurvenverlauf halbwegs zuverlässig zu finden? Weil es könnte ja auch sein, dass die Kurve so aussieht
http://images3.pictiger.com/thumbs/fa/2fca30dc70cd1c1675232d9e289a08fa.th.jpg (http://server3.pictiger.com/img/242467/picture-hosting/.php)
Dann müsste ich vielleicht noch auf Wendepunkte untersuchen?!
Ohje... :(
Bitte sagt mir, dass es eine bessere total unkomplizierte Methode gibt, auf die ich bisher nur noch nicht gestoßen bin :)
Und gibt es eine Seite, auf der anhand von Pseudocode (oder C) erklärt wird, wie man Kurvensachen wie Nullstellen, Wendepunkte, Hoch- und Tiefpunkte usw findet?
EDIT:
Wobei, wenn ich Glück hätte, würde das hier ja garnicht zählen, weil es mehrere Hoch- bzw. Tiefpunkte hat? (Oh mann, Mathe 1 is schon zu lange her... )
EDIT2:
Also wenn man das hier mal als Beispiel nehmen würde:
http://images5.pictiger.com/thumbs/2a/9e19a68b56005d2a041a363b4cc9912a.th.jpg (http://server5.pictiger.com/img/247969/picture-hosting/-home-pizza-desktop-graph-2.php)
Dann würde, wenn man wirklich die Hoch- und Tiefpunktnummer durchziehen könnte, ein möglicher Kandidat eines Sinus' rauskommen, den man dann mit einem Eigenbausinus vergleichen würde, wobei dann eine geringe Abweichung rauskommen würde.
Leider will ich auch so Sachen erkennen wie:
http://images5.pictiger.com/thumbs/8c/40aea1e9064ec2a5fa12efc6409a758c.th.jpg (http://server5.pictiger.com/img/247974/picture-hosting/.php)
was ja schon erheblichere Abweichungen zum normalen Sinus hat... Vielleicht müsste man dann nur noch mit der Toleranz spielen..... hmmmm... *Kopfrauch*
EDIT3:
Also ein Hochpunkt wäre es wohl, wenn ich in den Daten auf eine Nullsteigung treffe und die Steigung zuvor positiv war, ein Tiefpunkt, wenn ich davor eine negative Steigung hatte (bzw es könnte auch einfach ein Wechsel zw. pos/neg sein ohne 0 dazwischen (sonst vielleicht auch Sattelpunkt))
Ok, eine Nullstelle sollte nicht wirklich schwer zu finden sein... Davor war der Wert > 0, danach <0 oder andersrum....
Bei näherem Nachdenken hört es sich gar nicht mehr soooo schwer an...
Nur könnten bei dem vielen Rauschen auch leider irgendwo zwischendrin Steigungswechsel auftreten, die ich garnicht haben will... :|

Manf
21.04.2006, 12:29
Die Fourier Transformation ist eine Methode, die angibt welche Frequenz mit welchem Leistungsanteil in einem Signal vertreten ist.

http://de.wikipedia.org/wiki/Fourier-Transformation

BiGF00T
21.04.2006, 12:50
Hab mir das vor ner Weile schonmal auf http://mathworld.wolfram.com angeschaut gehabt und ich weiss aber nicht, wie ich sowas in Programmcode verwandeln sollte... Irgendwer hat mir auch schonmal sowas geraten...
Ok, ich bin nicht mehr (oder war noch nie?) sehr gut in Mathe,
ist das hier


for (u=0; u < M; u++)
for (v=0; v < N; v++)
{
real = 0.0;
imag = 0.0;

for (x=0; x < M; x++)
for (y=0; y < N; y++)
{
real += f[x][y] * cos(-2.0 * PI * (u*x/(double)M + v*y/(double)N));
imag += f[x][y] * sin(-2.0 * PI * (u*x/(double)M + v*y/(double)N));
};

amplitude [u][v] = sqrt(real*real + imag*imag);
}

code stolen from http://www-lehre.informatik.uni-osnabrueck.de/~mm/skript/4_3_Fourier_Transformation.html

was ich suche?

Bzw was hilft das mir bei meiner Analyse?
Ich will nicht spezielle Frequenzen finden, sondern nur alles, was Sinusförmig ist. Hilft mir die Fourieranalyse dabei weiter? Die Periodendauer des Sinus' ist dabei (fast) unwichtig. Wichtig ist, dass die Kurve einen ungefähren Sinusverlauf hat und dass ober und unterhalb der x-Achse ungefähr die gleiche Fläche is, wie oberhalb.
Wenn ich die Fourieranalyse durchführe, bekomme ich als Ergebnis dann "Frequenz X hatte den maximalen Anteil an der Leistung des Signals". Kann ich daraus dann schliessen, dass der Verlauf Sinusförmig war?

EDIT: Oh wow, ich muss ja nicht mal URL-Tags benutzen, um die URL clickable zu bekommen :)

21.04.2006, 13:48
Naja, wenn man einen Sinus in den Frequenzbereich transformiert, erhält man zwei Peaks symmetrisch zum Ursprung bei -f und +f
(die negativen Frequenzen kann man natürlich getrost ignorieren, es interessiert also nur der Peak bei +f)
Je verrauschter das Signal ist, desto breiter werden diese Peaks.


Ich denke damit sollte sich dein Sinus relativ leicht identifizieren lassen.

Felix G
21.04.2006, 13:49
Mist, hab vergessen mich einzuloggen...

also dat war grad von mir ;)

BiGF00T
21.04.2006, 14:02
Ok, ich weiss nicht, wie das im Frequenzbereich genau aussehen wird...
Mal angenommen
http://images4.pictiger.com/thumbs/c9/23aef214447e394e6b2d6ac39edcb6c9.th.gif (http://server4.pictiger.com/img/244552/picture-hosting/.php)
würde zu
http://images5.pictiger.com/thumbs/99/c8f1f70f4fbb461292554e8b41b2ea99.th.gif (http://server5.pictiger.com/img/248145/picture-hosting/.php)

was würde dann aus etwas werden, das keine Ähnlichkeit mit einem Sinus hat wie z.B.:
http://images5.pictiger.com/thumbs/02/07fdc8628f81f5a389d838c500078e02.th.gif (http://server5.pictiger.com/img/248150/picture-hosting/.php)
-->
http://images3.pictiger.com/thumbs/17/d57e47fe7f88bcf9e2e4687e8686a717.th.gif (http://server3.pictiger.com/img/242664/picture-hosting/.php)

Vielleicht ne blöde Frage, aber wenn ich dann sehen würde, dass ich nen Peak in + und - Richtung habe, dann ist das für mich ein Sinus?
Wenn ich einen breiten Peak sehe, dann könnte es auch eine Kurve sein, die gar kein wirklicher Sinus mehr ist? Weil eine Kurve, die wirklich hammersextrem++²³ verrauscht ist und wo manche Werte total daneben gehen, könnte die ja schon wieder so krass sein, dass sie nichts mehr mit einem Sinus gemein hat, oder?

Felix G
21.04.2006, 14:22
Es sieht ein bischen anders aus...

ich hab mal ein bischen gegoogelt und auf der Homepage der Uni-Heidelberg dieses Bild gefunden:
http://klimt.iwr.uni-heidelberg.de/PublicFG/ProjectB/CFT/dipluschimpf/img181.gif
(die k-Achse ist in dem Fall die für die Frequenz)

da sieht man sehr schön wie unterschiedliche Kurvenformen im Frequenzbereich ausschauen


edit: wenn ich wieder zuhause bin kann ich ja mal ein paar Kurven durch Matlab jagen, damit etwas deutlicher wird welchen Einfluss das Rauschen hat

BiGF00T
21.04.2006, 14:32
Oh, ich kann mich dunkel an die Bilder erinnern. Die hab ich auch noch in irgendeinem Skript zu Hause...
Wenn ich jetzt also Daten in mein Array speichere, dann nach ... kA... bissle Zeit eben... meine Fourieranalyse drauf loslass, Würde das Ding dann auch sowas finden wie z.B.
http://images4.pictiger.com/thumbs/30/bcea3aff92edd67ff4d113baf18c1130.th.gif (http://server4.pictiger.com/img/244593/picture-hosting/.php)
(oh mann, wie ich es hasse mit gimp so ein teil hinzuschludern...)

oder müsste ich zur korrekten Erkennung die Transformation dann nur von Anfang bis zum Ende des Sinus' durchführen?
Weil dann wäre mein nächstes Problem, wie merke ich, dass ein Sinus angefangen oder geendet hat?
Sollte ich einfach immer 3 Nullstellen abwarten und dann mal von der 1. bis zur 3. prüfen?

EDIT: was ich vielleicht noch hätte sagen sollen: das Ding ist nicht periodisch! Der sinus, den ich erkennen will, kann zwischen tausenden von hässlichen sonstigen Werten stecken. Ich will aber erkennen, das da ein Sinus vorbeikam.
Ich schreibe immer Werte in irgendwas rein (Ringpuffer?) und will wissen, wann ich einen Sinus (bzw. etwas sinusähnliches) gespeichert habe. Die Dauer des Sinus ist nicht von Bedeutung. Lediglich, dass es ein kompletter Sinus (oder sinusähnlich) war. Also eine komplette Periode.

21.04.2006, 14:47
Das könnte schon kritisch werden...

denn ein Sinus sieht im Frequenzbereich anders aus wenn es nur ein "burst" ist (und darum handelt es sich ja wenn ich das richtig interpretiere).


Wenn es wirklich möglich sein soll eine einzige Periode zu erkennen, die dazu noch extremst verrauscht sein kann...
Also da würde ich mir keine allzu großen Hoffnungen machen.



ich werde es aber später mal simulieren, vielleicht kann man ja doch mit viel Phantasie was erkennen

BiGF00T
21.04.2006, 14:58
Das könnte schon kritisch werden...


hatte ich schon befürchtet...
Ja, es ist nur Null -> HP -> Null -> TP -> Null



Wenn es wirklich möglich sein soll eine einzige Periode zu erkennen, die dazu noch extremst verrauscht sein kann...
Also da würde ich mir keine allzu großen Hoffnungen machen.


Naja, also soooo verrauscht wird es nicht werden. Es kann nur sein, dass die Werte rundrum sehr komisch sind. Der eigentliche Sinus wird wahrscheinlich bis auf einen Zitterer ziemlich normal sein. Nur wenn ich dazwischen schon voll den Müll habe, dann wird es schwer sein, den Bereich zu finden, in dem ich prüfen will, ob ein Sinus vorhanden ist.

Felix G
21.04.2006, 18:03
Was ist denn über dieses Signal bekannt?
Frequenzbereich der Bursts? deren minimale und maximale Länge?


PS:
bisher habe ich es leider nicht geschafft Matlab zum laufen zu bringen, daher konnte ich das noch nicht simulieren.
(schon lange her daß ich es benutzt habe, und inzwischen muss ich da wohl irgendwas zerschossen haben)

werds mal neu installieren, dann sollte es ja eigentlich wieder gehen

BiGF00T
21.04.2006, 18:18
Was ist denn über dieses Signal bekannt?
Frequenzbereich der Bursts? deren minimale und maximale Länge?


Urks, Matlab... Damit hab ich auch schon ewig nix gemacht und würde sowas niemals hinbekommen glaub ich...
Also die Periodendauer
1s < T < 5s (kann überall dazwischen liegen und soll alles gefunden werden...)

Was meinst du mit Frequenzbereich? *schäm*

Muss mal schauen, ob ich dir irgendwie nen screenshot organisieren kann von ner Beispielkurve. Vielen Dank schonmal für die Geduld und die Hilfe. Bin echt voll die Niete in Mathe :|

Fritzli
21.04.2006, 18:42
Hallo

Für die Fourieranalyse benötigt man im Idealfall, wie schon erwähnt, eine ganzahlige Anzahl Perioden. Da das aber in der Praxis so gut wie nie machbar/messbar ist macht man sog. "Windowing". D.h. man sampelt das Signal eine bestimmte Zeit lang und speichert es. Danach multipliziert man diesen verlauf mit einer Fensterfunktion. Das kann ein Rechteck sein (dann bringts allerdings nichts) oder z.B. eine Halbperiode eines Sinus sein (=Hamming-Window) etc.

http://de.wikipedia.org/wiki/Fensterfunktion

Das ganze bringt natürlich dann gewisse Artefakte ins Spektrum, aber damit muss (und kann) man leben.

Gruess
Fritzli

vajk
21.04.2006, 19:19
nun. hüstel, mal mein verstaubtes MatheWissen auskram .. da war was von LaPlace-Transformation http://de.wikipedia.org/wiki/Laplace-Transformation .. Splines und Co ...
Du könntest die Eingangssignale durch Splines kurviger machen .. und dann die nummerische Version der Fourie-Geschichte a la http://de.wikipedia.org/wiki/Laplace-Transformation und als Steigerung noch die FFT http://de.wikipedia.org/wiki/Schnelle_Fourier-Transformation dazu hernehmen ... hope it helps

Fritzli
21.04.2006, 19:25
http://de.wikipedia.org/wiki/Laplace-Transformation .. Splines und Co ...
Du könntest die Eingangssignale durch Splines kurviger machen .. und dann die nummerische Version der Fourie-Geschichte a la http://de.wikipedia.org/wiki/Laplace-Transformation

Hä?!

Wo liegt denn der Zsuammenhang zwsichen Spline-Interpolation und Laplace-Transformation?


Gruess
Fritzli

vajk
21.04.2006, 19:33
Also so aus der Erinnerung ... die Meßwerte via Splines in Kurve verwandeln und dann FFT ... oder so .. mein Studium ist 20 Jahre her, weiß nimmer genau ... Hintergrund ist ja wohl die nummerische Auswertung .. da hilft die theoretische Fourier nicht zur Umstezung .. (aber alles ohne Gewähr) .. zu lange her, nie mehr was mit zu tun gehabt ...

SprinterSB
22.04.2006, 07:22
Was willst du denn aus dem Signal rauslesen?

Nur eine Grundfrequenz?
Oder sollen auch "Obertöne" drinne sein?
Soll die Analyse zeitabhängig sein?

Eine Möglichkeit wurde schon genannt, die FFT. I.w ist das eine Fourier-Analyse aud diskreten Messpunkten. Die Zeitanhängigkeit bekommt man über die Auszahl eines Intervalls, was weitere Artefakte zu Tage fördert.

Wenn du weisst, wie das Signal aussehen soll, zB f(x)=b*sin(ax), und dich Oberwellen nicht interessieren und du sie als Rauschen betrachtest, könntest du einen best Fit versuchen:

Du bildest die Summe
https://www.roboternetz.de/wissen/images/math/39f4687558704341dd849a086c3c7118.png

und variierst a und b so, daß die Summe S minimal wird. Das ist einfach zu proggen, aber zeitaufwändig. Und es bietet die Falle, daß du dich in einem lokalen Minimum von S(a,b) fängst.

FFT macht im Endeffekt das gleicht, allerdings für alle Frequenzen und Phasen. (Diskretisieren des Fourrier-Integrals zur Summe).

Weitere Möglichkeit sind Wavelets. Während bei der Fourrier-Trans die Zeitinformation verloren geht, ist diese in einer Wawelet-Trafo enthalten. Die Zeitabhängigkeit über Abschneiden des Intervalls zu erhalten, liefert wie gesagt Artefakte.

BiGF00T
22.04.2006, 10:39
Morgääähn...
Ui, harter Tobak am Morgen... Danke für die Antworten, auch wenn mein Hirn noch nicht ganz hochgefahren is.
Best fit hört sich gut an, widerspricht aber meinem Echtzeitanspruch ein wenig. Das ganze soll während die Daten reinkommen (vielleicht alle 20ms ein neuer Wert) berechnet werden. Weiss nicht, wie lange es braucht, sowas mit Variieren zu finden.
Hmmm... Diese Window-Geschichte hab ich nicht so genau verstanden...
Angenommen, ich habe eine Kurve, die ich will, jetzt in meinem Speicher drin (z.B. 200 Werte). Die ersten 30 Werte sind random irgendwelche Werte, danach kommt etwas sinusförmiges (100 Werte lang) und danach wieder 20 Werte Mist und danach ein unvollständiger Sinus, der nicht komplett durchgeht...
Sollte ich jetzt Fourier drauf loslassen, mache ich das dann auf die kompletten 200 Werte und bekomm dann raus, das darin ein Sinus vorhanden war? (Wieviel Mana braucht der Zauber?)
Wenn ich dieses Hamming Window benutzen würde, würde ich diese Fensterfunktion dann genau 200 Werte breit machen, oder sollte die so groß sein wie das, was man finden will (was bei variabler Breite des zu findenden Dings schlecht wäre)?
Nochmal zu dem Grundfrequenz / Obertöne ding:
Es kommt Müll, dann eine Periode Sinus oder minus Sinus und ich will das erkennen. Es reicht mir zu wissen, dass in meinem Puffer momentan gerade irgendwo ein Sinus liegt. Es ist nicht soo wichtig zu wissen wo genau er sich befindet. Leider ist der Sinus nicht immer schön (verrauscht) wobei man natürlich irgendwann sagen muss, ab einer bestimmten Verrauschtheit erkenn ich halt einfach nicht mehr, sonst bekommt man irgendwann bestimmt haufenweise Falschmeldungen.
Nachdem diese Periode Sinus durch ist, folgt im Normalfall kein weiterer Sinus mehr unmittelbar danach. Den nächsten, der in den Speicher gelesen wird, will ich dann eben wieder erkennen können. Weiss nicht, ob vielleicht doch das mit dem best Fit Dingsbums doch am wenigsten rechenintensiv.
Wenn es keine unglaublich coole mathematische Magie gibt, die auf unerklärliche Weise mein Problem lösen kann, dann werde ich es mal mit best Fit probieren, obwohl das wahrscheinlich dann ne Weile dauern kann wenn man eine Kurve hat, wo nie im Leben was Sinusähnliches drin ist und man ewig rumfitted... (Ok, da kann man bestimmt optimieren)

SprinterSB
22.04.2006, 12:59
Wenn es keine unglaublich coole mathematische Magie gibt, die auf unerklärliche Weise mein Problem lösen kann, ...
Klar gibt es diese mathematische Magie, und sie ist nichma unerklärlich oder unverständlich. Ein paar Integralchen und schon steht's da. Was an Magie gebraucht wird, ist wohl eher ein vertretbares numerisches Verfahren.


Angenommen, ich habe eine Kurve, die ich will, jetzt in meinem Speicher drin (z.B. 200 Werte). Die ersten 30 Werte sind random irgendwelche Werte, danach kommt etwas sinusförmiges (100 Werte lang) und danach wieder 20 Werte Mist und danach ein unvollständiger Sinus, der nicht komplett durchgeht...
Zum Fitten brauchst du Annahmen darüber, wie dein Signal aussieht. Der Fit wird umso besser, je genauer du das Intervall eingrenzen kannst, und je besser du die Funktion ansetzen kannst.

Wenn da ansetzen kannst
f(x;a,b) = a*sin(b*x)
dann ist das viel besser, als wenn du nur weisst
f(x;a,b,c) = a*sin(b*x+c).


Nochmal zu dem Grundfrequenz / Obertöne ding:
Es kommt Müll, dann eine Periode Sinus oder minus Sinus und ich will das erkennen. Es reicht mir zu wissen, dass in meinem Puffer momentan gerade irgendwo ein Sinus liegt. Es ist nicht soo wichtig zu wissen wo genau er sich befindet. Leider ist der Sinus nicht immer schön (verrauscht) wobei man natürlich irgendwann sagen muss, ab einer bestimmten Verrauschtheit erkenn ich halt einfach nicht mehr, sonst bekommt man irgendwann bestimmt haufenweise Falschmeldungen.
Nachdem diese Periode Sinus durch ist, folgt im Normalfall kein weiterer Sinus mehr unmittelbar danach.
Vielleicht besteht unklarheit darüber, was Oberwellen sind...?

Wenn du *eine* Periode reinsten Sinus' nimmst (ansonsten überall 0) und machst eine F-Analyse auf diese Funktion, dann bekommst du ein ganzes Frequenzzsektrum, das bei der Frequenz deines Sinus ein flaches Maximun hat. Die Zeitinformation ist aus dem F-Spektrum komplett "verschwunden", sie ist im F-Spektrum und P-Spektrum verstreut und versteckt.

Wenn du das gleiche f mit einem t-Fenster abfährst, dann ist das F-Spektrum natürlich 0, wenn f im Fenster auch 0 ist. Sobald f anfängt sich zu ändern, siehst du das im F-Spektrum, aber solange du nicht *mehrere* Perioden des Sinus in deinem Fenster hast, wirst du kaum die Frequenz deines 1-Perioden-Sinus im F-Spektrum wiederfinden -- schon gar nicht als halbwegs scharfen Peak.

Ein Fit sollte recht einfach zu proggen sein (gegenüber FFT). Viel vertust du dir dabei ja nicht, es mal damit zu versuchen. Evtl mit Beihilfe, indem du nach dem Nulldurchgang deines Sinus fahndest. Evtl hilft es auch, das Ding erst mal zu Integrieren.

Anstatt die Werte m_i schau dir mal die Werte
M_i = \sum_{k=0}^i m_k
an. Da das Integral übers Rauschen im Mittel Null ist und der Sinus deutlich geringere Frequenz hat, bringt das evtl eine bessere Grundlage für weitere Verarbeitung.

Wenn Fitten zu lange dauert, kannst immer noch FFT versuchen.

Wo kommt das Signal eigentlich her? Veilleicht gib's an anderer Stelle die Möglichkeit, an die nötige Info zu kommen?

phaidros
22.04.2006, 13:37
Wie wäre es mit Autokorrelation? (http://de.wikipedia.org/wiki/Autokorrelation)
Du vergleichst das Originalsignal und das selbe um einen bestimmten Betrag verschobene Signal und errrechnest die Summe. Wenn dabei deine beiden Sinus-Halbwellen übereinanderliegen, sollten die Differenzen nahe 0 sein. Man muss natürlich möglichst viele Verschiebebeträge ausprobieren, sollte aber bei genügend Rechenleistung machbar sein. GPS funktioniert so ähnlich.

SprinterSB
22.04.2006, 14:23
Wie wäre es mit Autokorrelation?
Autokorrelation (http://de.wikipedia.org/wiki/Autokorrelation) ist vielleicht auch einen Versuch wert, allerdings nicht durch Verschieben des Signals, sondern duch vertikale Spiegelung. Es ist ja nur 1 Periode des Signals. Damit könnte man zumindest den Symmetriepunkt finden oder eingrenzen.

Aussagen zur Frequenz oder Amplitude bekommt man daraus aber nicht, jedenfalls sehe ich da auf Anhieb nix...

SprinterSB
22.04.2006, 19:18
:idea: Schau die mal das längste positive Intervall (P) und das längste negative Intervall (N) an. Ist die erste Halbwelle im P und die zweite im N, dann ist die Periode etwa über dem Intervall P+N. Der Nulldurchgang des sin ist zwischen P und N. Zudem sollte ein Blick auf die Intervall-Längen eine erste Beurteilung der Datengüte liefern. Wenn es mehrere lange P- oder N-Intervall gibt, ist der sin ziemlich verrauscht und die Daten werden wohl besser verworfen, bevor man Käse rausliest...

:idea: Damit hast du 2 wichtige Eckdaten: Symmetriepunkt und Periodenlänge. Indem du die Beträge der Messwerte über die Periode integrierst (also mit den Abständen multiplizierst und zusammenzählst) Hast du das Integral deiner |f|. Das Integral des |sin| über eine Periode ist 4, somit
https://www.roboternetz.de/wissen/images/math/b0b0a8082b94311eb3fe5be12dd08654.png
Damit bekommst du also auch sehr einfach die Amplitude, bzw einen ersten Schätzwert von a für einen evtl. Fit. Nämlich:
|a| = |b|/4 * Int(|f|) und die Periode ist 2*Pi/|b|

Das ganze ist recht hausbacken und weit weniger allgemein als eine FFT, FT oder WT, aber viel einfacher zu proggen und zu durchschauen.

::Edit:: Und vergiss das mit dem Integrieren zur Signalglättung von oben. Ist wahrscheinlich ziemlicher Käse.

skillii
22.04.2006, 20:39
Hi SprinterSB,

hab da einmal eine Frage, die eher nicht gerade so zum Thema passt, aber mit welchem Programm erzeugst du solche Terme wie z.B.:
<TeX>
S(a,b) = \sum_{i=1}^n (f(x_i)-m(x_i))^2
</TeX>
Ich habe schon einmal was von Tex gehört, aber gibt es da einen ganz schlichten Viewer für solche Terme??

SprinterSB
22.04.2006, 21:04
Hi SprinterSB,

hab da einmal eine Frage, die eher gerade so zum Thema passt, aber mit welchem Programm erzeugst du solche Terme wie z.B.:
<TeX>
S(a,b) = \sum_{i=1}^n (f(x_i)-m(x_i))^2
</TeX>
Die erzeuge ich mit Brain 1.0 (http://de.wikipedia.org/wiki/Gehirn) ;-)


Ich habe schon einmal was von Tex gehört, aber gibt es da einen ganz schlichten Viewer für solche Terme??
Zum Gucken kann man vielleicht die Wiki missbrauchen... 8-[
Benutzer:SprinterSB/Formeln (https://www.roboternetz.de/wissen/index.php/Benutzer:SprinterSB/Formeln)

https://www.roboternetz.de/wissen/images/math/39f4687558704341dd849a086c3c7118.png

Es gibt auch online-Seiten, aber momentan finde ich keine. Zumindest keine für Formeln, die meisten wollen ein komplettes TeX oder LaTeX-Dokument...

SprinterSB
23.04.2006, 10:38
Hier mal ein Linke zu einem Viewer. Ist aber kein echtes TeX. Benutzt nur dessen Syntax, die Farben sind ätzend und es lässt sich nicht kopieren (Applet) aber immerhin...

http://www.esr.ruhr-uni-bochum.de/VCLab/software/HotEqn/HotEqn.html

Hier noch ein TeX-Dokument mit Formeln (ein Brief). Sieht deutlich besser aus als das Rumgemurxe mit Word und so... Auch der Text selber und der Textsatz an sich.

Hier mal ein Beispiel, zudem ganz nett zu schmökern, behaupte ich mal O:) (es geht um Komplexe Zahlen):

PDF-Dokument, mit TeX erstellt (http://people.freenet.de/gjl/pub/komplex.pdf)

skillii
23.04.2006, 13:38
Danke!
Das genügt mir schon einmal!!

ogni42
23.04.2006, 13:46
Sehr schöndes Dokument, Georg-Johan. Besonders gefallen mir die Zitate, insb. von Richard Feynman, dessen Ideen habe ich mir auch schon mal zum Zitieren "geliehen". An dem könnten sich die meisten Profs von heute mal ein Beispiel nehmen.

BiGF00T
24.04.2006, 11:02
Wow, viele Antworten und ich hab so wenig Ahnung davon. Ich denke best fit wird wirklich das sein, wonach ich gehen sollte. Alles andere scheint mir sehr rechenintensiv zu werden. Selbst best fit kann schon sehr ausarten, wenn man es nur krass genug betreibt. Am besten wird wohl sein, ich orientiere mich wie schon erwähnt an den Nullstellen und versuche so eine möglichst geschickte Ausgangsposition für meinen Fit zu erhalten.
Zu der Frage, woher die Werte kommen:
Die Werte sind Lenkwinkel, von denen ich wissen wollte, ob man irgendwie einen "Spurwechsel" erkennen kann, d.h. also wenn das Teil von geradeausfahren nach links oder rechts ausweicht und danach wieder in die Ursprüngliche Richtung fährt.
Danke nochmal für eure wirklich detailierten Vorschläge, ihr seid mir wahrscheinlcih alle mindestens um paarmillionen Prozent in Mathe überlegen. Ich werde es jetzt erstmal mit best fit + Nullstellen als Stütze probieren und gleichzeitig vielleicht noch die Summe der Werte von der 1. NSt bis zur 3. NSt speichern. Wenn da dann ca. 0 rauskommt, könnte es wohl ein Sinusförmiges Teil sein. Wobei dann auch noch Knicke möglich wären. Aber die bekommt man ja dann beim fitten mit nehme ich an. Einfach mal testen... Danke nochmal an alle, die so viel Geduld hatten und mir versucht haben Mathe näherzubringen.
btw, studiert ihr eigentlich alle Mathe oder sind das Grundkenntnisse, die ich irgendwann mal verschlafen oder verdrängt habe?

SprinterSB
24.04.2006, 16:40
:idea: Was wahrscheinlich auch hilft, ist einen Tiefpass über die Werte laufen zu lassen. Dein Nutzsignal ist niederfrequenter als das Rauschen. Daher eignet sich ein geeigneter Tiefpass, um Rauschen rauszufiltern.

Bezeichnungen:
F=Fourier-Trans (F-Analyse)
G= Inverse Fourier-Trans (F-Synthese)

Einen Tiefpass bekommst du so:
Im Frequenzspektrum F(f) von f werden alle Frequenzen unterdrückt, die oberhalb einer Grenzfrequenz liegen. Der Tiefpass sei T
T(F(f)) ist dann das bereinigte Spektrum, und mit G(T(F(f))) bekommst du deine rauschbereinigte Funktion. Soweit ganz easy.

Das wäre aufwändig zu berechnen, denn du brauchst G und F, was wir ja gerade vermeiden wollten (keine FFT und so).

Der Knackpunkt ist nun, daß wir den Faltungssatz nehmen können, um ein bereinigtes f zu bekommen!

F(f % G(T)) = K*F*T, wobei die Faltung f%g zweier Funktionen f und g definiert ist als

https://www.roboternetz.de/wissen/images/math/2e509e62c71a209b21d717b5749ca1b5.png

K ist eine Konstente, also nicht von Interese momentan.

Dabei müssen wir weder F oder G berechen, sondern wird wählen einfach ein Filter-T, das wir gerne hätten. Das G(T) in der obigen Faltung muss eigentlich auch nicht berechnen werden. T ist ja eine feste Funktion, welche die Frequenzen filtert. Für einen Tiefpass sieht t=G(T) aus wie eine Glockenkurve um 0. Auch des Faltungsintegral muss nicht berechnet werden; es geht in eine einfache Summe über:

https://www.roboternetz.de/wissen/images/math/be4a053d8a40da661f1227b53e32992b.png

Die Nebenbedingung stellt sicher, daß die Werte der geglättete Funktion f%t im Mittel nicht wachsen oder schrumpfen gegenüber von f.

Im einfachsten Fall nimmst du als Filter t_0 = 1 und t_i = 0 für alle i != 0
Dann ist die gefilterte Funktion gleich der Eingangsfunktion, macht also nix.

Ein anderer Filter wäre z.B
t_{-1} = 1/8
t_0 = 3/8
t_1 = 3/8
t_2 = 1/8

Damit wäre ein Wert vom mit t gefilterten f an der Stelle 3:

(f%t)_3 = (f_2 +3*f_3 + 3*f_4 + f_5 ) /8

Solche Filter gibt es natürlich unendlich viele. Sie unterscheiden sich in ihrer Grenzfrequenz und wie "hart" sie sind.

Das Glätten ist jedenfalls sehr einfach, auch wenn die Theorie dahinter etwas unvertraut ist :-)

stochri
24.04.2006, 19:12
Hallo BigFoot,
nachdem ich den Thread ein wenig durchgelesen habe, würde mich interessieren, was für ein Problem Du mit der Sinuserkennung lösen willst. Vielleicht könnte das Verständnis dafür etwas helfen, den entsprechenden Filteralgorithmus zu entwickeln.

Gruss,
stochri

SprinterSB
24.04.2006, 22:08
Zu der Frage, woher die Werte kommen:
Die Werte sind Lenkwinkel, von denen ich wissen wollte, ob man irgendwie einen "Spurwechsel" erkennen kann, d.h. also wenn das Teil von geradeausfahren nach links oder rechts ausweicht und danach wieder in die Ursprüngliche Richtung fährt.
Wenn es Lenkwinkel bei Spurwechsel sind, dann suchst du wahrscheinlich nicht nach einem Sinus (bzw. einer Periode davon). Wenn die Winkel von einem Fahrer erzeugt werden, dann kann die Kuve bestimmt sehr unterschiedlich aussehen und immer ein Spurwechsel sein. Gegen einen Sinus zu fitten liefert dann nicht unbedingt, was du erwartest oder brauchst.

Autokorrelation kann dann auch in die Hose gehen, weil das Einschlagen wahrscheinlich anders getan wird als das Einlenken nach geradeaus.

Genügt dir eine Ja/Nein-Information oder brauchst du noch Details aus dem Signal (Querbeschleunugung, Dauer, ...)

Ein Maß für die Richtung, in die gefahren wird, ist das Integral über die Lenkwinkel nach der Zeit (Linearität der Winkel vorausgesetzt. 1Sekunde mit 2° Einschlag fahren soll also den gleichen Richtungswechsel machen, wie 2 Sekunden mit 1° Einschlag).

25.04.2006, 10:09
Wenn es Lenkwinkel bei Spurwechsel sind, dann suchst du wahrscheinlich nicht nach einem Sinus (bzw. einer Periode davon). Wenn die Winkel von einem Fahrer erzeugt werden, dann kann die Kuve bestimmt sehr unterschiedlich aussehen und immer ein Spurwechsel sein. Gegen einen Sinus zu fitten liefert dann nicht unbedingt, was du erwartest oder brauchst.

Autokorrelation kann dann auch in die Hose gehen, weil das Einschlagen wahrscheinlich anders getan wird als das Einlenken nach geradeaus.

Genügt dir eine Ja/Nein-Information oder brauchst du noch Details aus dem Signal (Querbeschleunugung, Dauer, ...)

Ein Maß für die Richtung, in die gefahren wird, ist das Integral über die Lenkwinkel nach der Zeit (Linearität der Winkel vorausgesetzt. 1Sekunde mit 2° Einschlag fahren soll also den gleichen Richtungswechsel machen, wie 2 Sekunden mit 1° Einschlag).

Oha, ja, sowas hatte ich mir irgendwann auch gedacht... Ein richtiger Sinus müsste es echt nicht sein. Auf alle Fälle wäre es aber etwas, das erst einen positiven Winkel hätte und dann einen negativen (oder andersrum). Bei einem Wechsel sollten dann wahrscheinlich beide Seiten irgendwie gleich sein...
Es reicht auf alle Fälle eine Ja/Nein Information. Den Rest brauche ich nicht.

@stochri: Nachdem ich mir das so ne Weile über das Wochenende nochmal überlegt hatte, kamen mir auch immer mehr Zweifel, dass das wirklich so zu lösen wäre.

Leider werden ja wahrscheinlich auch je nach Geschwindigkeit die Winkel sehr unterschiedlich ausfallen. Größere Geschwindigkeit = kleinerer Lenkwinkel... Nur wenn es zu gering wird, ist es wahrscheinlich auch nicht mehr von dem Hintergrundrauschen oder Korrekturbewegungen auf der Geraden zu unterscheiden... Ich will am Ende eigentlich nur eine Art Statistik haben, wann (wie oft würde auch reichen) so ein "Spurwechsel" stattfand.
@sprinterSB:
Ich habe von Bosch ein paar ppt Folien gefunden, die das mal über die Zeit bei Autos abbilden. Es sieht schon recht blöd aus das Zeug.
http://images5.pictiger.com/thumbs/3e/dde0f5caacb3af6c7bc14a655f17813e.th.png (http://server5.pictiger.com/img/258639/picture-hosting/.php)
Also wenn es so aussieht, wird es schon relativ krass...
Die erkennen das irgendwie mit nem Monsterbinarytree wenn ich das richtig gelesen habe... Aber sowas kommt ja nicht von ungefähr, den müsste man ja dann irgendwie erstellen (mit Beispieldaten einlernen?).

BiGF00T
25.04.2006, 10:11
mist, das war ich...

25.04.2006, 10:46
Wie wäre es mit einem Neuronalen-Netz (FF-Typ, Backprop Training) oder, wenn es um die Zeitreihen geht, ein HMM (Hidden markov Model), die werden auch zur Spracherkennung genutzt)

SprinterSB
25.04.2006, 15:59
Was F-Trafo angeht...

Kennst du http://www.falstad.com/mathphysics.html ? Absolut 8) 8) 8)!

Da gibt es viele tolle Applets, auch welche zur F-Trafo, wo man einfach mit der Maus ne Kurve zeichnen kann und schauen, wie die FT davon aussieht. Und das geht alles super fix, sogar die Simulation eines angezupften Tromelfells! Damit hättest du ne Vorstellung, was (F)FT taugt.

Evtl tut's ja auch schon, ein paar Koeffizienten einer gefensterte FT anzuschauen.

Aber alle Spurwechsel wirst du niemals nicht sehen können. Das kannst du doch nur, wenn du weisst, wie die Straße aussieht... Ebenso könnte die Straße leicht schlangenförmig sein...

ogni42
25.04.2006, 16:13
Kommentar oben war von mir (war nicht eingeloggt). IIRC hat es im PROMETHEUS Projekt der EU (Anfang der 90er) Ansätze gegeben die Bahnregelung mit NN durchzuführen, einschliesslich Überholmanövern.

Vielleicht findet man da noch Infos zu.

Bigfoot, schreib doch mal, was mit dem Ergebnis passieren soll, dann können wir etwas konkreter diskutieren.

SprinterSB
01.05.2006, 14:05
Ich hab noch was zu dem interessanten Thema.

Ich denke inzwischen, Fourier-Trafo oder ähnliches sind komplett ungeeignet um an die Informationen zu kommen, die du brauchst.

Die Information ist zwar im Spektrum drinne (FT "vergisst" nix), aber sie ist dort wohl noch schwerer zu finden als im Ausgangssignal.

Wesentlich für Richtungswechsel und Spuränderung ist das Integral über die Funktion. Indem man die Funktion f in der Umgebung von x über ein variables Zeitfenster y integriert, enthält man eine Funktion

https://www.roboternetz.de/wissen/images/math/2b89c6d7a965c95d5fc8df270d5aac80.png

In dieser I-Trafo ist einerseits das komplette f enthalten (die Trafo "vergisst" also nix), andererseits ist die Information direkt ersichtlich. F ist recht immun gegen Rauschen und überlagerte Schwingungen.

Das Bild der Trafo ist in x-Richtung die Zeit und in y-Richtung das Fenster. Unten sind die Werte für kleine Zeitfenster, oben für große.

Den Beispielfunktionen (rot) habe ich Rauschen und einen Sinus draufgegeben (schwarz). Trotzdem bleibt F fast unverändert.

Bild1: Ein Spurwechsel. Die Ausschläge nach oben/unten sind gleich groß. Über den roten/grünen Schenkeln passiert keine Änderung

Bild2: Zuerst eine kurze, starke Änderung, die aber insgesamt keine Richtungsänderung ist. Danach zwei entgegengesetzte Hubbel, von dem der zweite aber größer ist. Netto bleibt also ein Richtungswechse, erkennbar an dem rötlichen Keil über dem grünen/roten Schenkel. Ausserdem liegen die Hubbel etwas weiter auseinander, erkennbar an dem kleinen bleu/schwarzen Dreieck in der Mitte unten.

Bleu: keine Änderung
Grün: nach Minus
Rot: nach Plus

Mit einem Blick auf die Trafo sieht man sofort, was Sache ist. Die weiterer Analyse sollte dann kein Problem mehr sein.

Eine Kurvenfahrt gibt übrigens einen einfarbigen Keil ohne Ränder.

Das Applet geht unter Netscape und FireFox (http://people.freenet.de/gjl/applets/fourierview-jar.html) und braucht JRE 1.4. IExplodierer zickt mal wieder...

BiGF00T
02.05.2006, 09:21
EDIT: Wozu quote ich eigentlich das, was direkt drüber steht nochmal? Weg damit...

Ups hatte grad schon aus versehen beim Fensterwechseln auf Absenden geklickt und nen unfertigen Post gemacht... Also nochmal:
Uiuiui... Das sieht lustig aus. Ok, muss erstmal die Linux-Kiste booten um nen Mozilla zu bekommen, da ich im Geschäft bin. Eh schon spät dran, weil irgendwie alle Selbstmörder unbedingt immer morgens aufs Gleis hüpfen müssen.. Ich frage mich, ob die sich extra den Wecker stellen dafür... :|
Etwas mit Integral hatte ich auch schon überlegt. Eigentlich müsste ich ja nur das über und unter der Nulllinie zusammenzählen und ca 0 rausbekommen, oder?
Deine Version scheint aber wesentlich mehr zu können als nur zusammenzählen...
Ich habe leider gerade nur eine uralt-Version von Mozilla zur Verfügung, wo die untere f(x) Zeile komplett abgeschnitten wird. Ich kann gerade noch den oberen Rand des Eingabefelds sehen :(
Also wenn ich das mit diesem farbigen Bild richtig deute, meintest du, dass nach oben hin das Fenster größer wird und nach unten hin kleiner, richtig?
Ok, ich glaube ich komme langsam dahinter... Jetzt muss ich mir das nur noch etwas genauer anschauen und ein wenig überlegen. Aber ein wunderbarer Ansatz und wahrscheinlich nicht mal extrem rechenintensiv. Wenn ich das richtig sehe, ist ein Integral ja nichts weiter als die Fläche unter der Kurve, also reicht es bei einem normalen Zeitintervall die einzelnen "Rechteckchen" zusammenzuzählen. f(x) + f (x+1) + ... + (f+n) und wenn man Lust hat noch mit der Zeit zu multiplizieren aber das könnte man bei immer gleichem Intervall auch weglassen.
Danke, ich werde mir das heute mal genau überlegen. Bei weiteren Fragen hoffe ich, dass ihr mir weiterhin helfen könnt aber ich denke mit der vielen Hilfe bisher sollte es ausreichen zumindest mal ein wenig zu testen.
while(1) printf("DANKE ");

02.05.2006, 10:24
Bigfoot, schreib doch mal, was mit dem Ergebnis passieren soll, dann können wir etwas konkreter diskutieren.
Öhm, also was gibt es dazu groß zu sagen... Also ich bekomm Lenkwinkel und will, nachdem der Spurwechsel stattgefunden hat, allein anhand der Daten der Lenkwinkel möglichst genau sagen, ob es nun ein Spurwechsel war oder nicht. Geschwindigkeit könnte man sich noch vorstellen mit reinzunehmen, da sie einen extremen Einfluss auf die Größe des Lenkwinkels hat.
Am Ende muss nicht rauskommen, wie lange der Spurwechsel dauerte oder wie groß die maximale Auslenkung war oder so, sondern schlicht Spurwechsel: Ja/Nein. Oder vielleicht auch Spurwechsel Rechts = 5x, Links 3x. Das ist noch nicht ganz klar.
Reicht das als Info?

BiGF00T
02.05.2006, 10:25
Grmpf... Das was wieder mal ich... Hatte 2 Fenster offen und war nur in einem eingeloggt :(

ogni42
02.05.2006, 10:49
Hmm, zuerst würde ich die Daten über einen (moderaten) Tiefpass filtern.

Eine Zeitreihe der Lenkwinkelauslenkungen korrespondiert ja mit einer entsprechenden Zeitreihe für die Geschwindigkeit.

Jetzt nimmst Du zum Vergleich möglichst Vektoren (=Zeitreihen) gleicher Länge, ansonsten wird die Klassifikation etwas schwieriger. Also z.B. 101 Elemente für Lenkwinkel und Geschwindigkeit. Aus der kontinuierlich aufgenommenen Datenreihen kannst Du Dir dann die Punkte heraussuchen, bei denen der Lenkwinkel einen Extremwert hat (dafür braucht es dann den entsprechenden Tiefpass auf den Eingangsdaten, sonst bekommst Du zuviele Kandidaten). Das wäre dann der Mittelpunkt für einen solchen Vektor (mit dann jeweils 50 Elementen davor und dahinter).

Zur Klassifikation kannst Du dann die Vektoren für Winkel und Geschwindigkeit einfach hintereinander hängen. Du hast also jeweils einen langen (z.B. 202 Elemente langen) Merkmalsvektor.

Sofern Du genügend Beispiele hast (Positive = Spurwechsel und Negative = Kein Spurwechsel) kannst Du damit einen Klassifikator bauen. Als einfachstes käme ein k-Nearest Neighbour in Frage, bessere Ergebnisse wirst Du aber wahrscheinlich mit einem LVQ oder RBF Netz erzielen können (Aus meiner Erfahrung liefern RBF Netze mit LVQ als erster Schicht tendenziell die besseren Ergebnisse).

Bei allen drei Verfahren ist es sinnvoll, nicht nur zwei Klassen (Spurwechsel ja/nein) zu wählen, sondern z.B. jeweils vier, damit die Aufteilung des Merkmalsraumes feiner stattfindet. Hintergrund ist, dass mit einem solchen Klassifikator ein n-dimensionaler Merkmalsraum in n-Klassen aufgeteilt wird. Beispiel für 2-Dimensionen: Wenn Du nur zwei Klassen hast, kannst Du den 2-D Raum nur in 2 Halbebenen teilen. Nimmst Du mehr Klassen, gehen auch komplexere Polygone ( http://de.wikipedia.org/wiki/Voronoi ).

Der Umkehrschluss: "Dann nehme ich eben jeweils 100 Klassen" ist auch nicht so sinnvoll, da der Klassifikator dann:
a) sehr lange zum Training braucht
b) oftmals nicht mehr so gut generalisiert

BiGF00T
02.05.2006, 11:36
Wow, das was viel Input auf einmal...

Hmm, zuerst würde ich die Daten über einen (moderaten) Tiefpass filtern.

Also den Tiefpass brauche ich wohl nur, um die Daten ein wenig zu glätten, oder? Also reicht es vermutlich aus, einfach einen Mittelwert der jeweils letzten X Werte zu bilden oder so.


Eine Zeitreihe der Lenkwinkelauslenkungen korrespondiert ja mit einer entsprechenden Zeitreihe für die Geschwindigkeit.

Ja, das sollte so sein.


Jetzt nimmst Du zum Vergleich möglichst Vektoren (=Zeitreihen) gleicher Länge, ansonsten wird die Klassifikation etwas schwieriger. Also z.B. 101 Elemente für Lenkwinkel und Geschwindigkeit. Aus der kontinuierlich aufgenommenen Datenreihen kannst Du Dir dann die Punkte heraussuchen, bei denen der Lenkwinkel einen Extremwert hat (dafür braucht es dann den entsprechenden Tiefpass auf den Eingangsdaten, sonst bekommst Du zuviele Kandidaten). Das wäre dann der Mittelpunkt für einen solchen Vektor (mit dann jeweils 50 Elementen davor und dahinter).

Ok, das mit dem Vektor habe ich jetzt nicht genau verstanden... Ich speichere mir 101 Werte (Elemente) meines Lenkwinkels ab und suche einen Extremwert. Hier mal nen Hochpunkt. Dieser stellt dann den Mittelpunkt meines Vektors dar.
Sowas?
http://images4.pictiger.com/thumbs/85/37027ec5725b1b01793cdf5908b93385.th.png (http://server4.pictiger.com/img/272506/picture-hosting/lenkenf-rdummies.php)

Oder eher sowas?
http://images5.pictiger.com/thumbs/bb/dcfc8eb597f09024fbeb31cdd33e64bb.th.png (http://server5.pictiger.com/img/275710/picture-hosting/lenken-2.php)

Oder ganz anders?



Zur Klassifikation kannst Du dann die Vektoren für Winkel und Geschwindigkeit einfach hintereinander hängen. Du hast also jeweils einen langen (z.B. 202 Elemente langen) Merkmalsvektor.

Sofern Du genügend Beispiele hast (Positive = Spurwechsel und Negative = Kein Spurwechsel) kannst Du damit einen Klassifikator bauen. Als einfachstes käme ein k-Nearest Neighbour in Frage, bessere Ergebnisse wirst Du aber wahrscheinlich mit einem LVQ oder RBF Netz erzielen können (Aus meiner Erfahrung liefern RBF Netze mit LVQ als erster Schicht tendenziell die besseren Ergebnisse).

Bei allen drei Verfahren ist es sinnvoll, nicht nur zwei Klassen (Spurwechsel ja/nein) zu wählen, sondern z.B. jeweils vier, damit die Aufteilung des Merkmalsraumes feiner stattfindet. Hintergrund ist, dass mit einem solchen Klassifikator ein n-dimensionaler Merkmalsraum in n-Klassen aufgeteilt wird. Beispiel für 2-Dimensionen: Wenn Du nur zwei Klassen hast, kannst Du den 2-D Raum nur in 2 Halbebenen teilen. Nimmst Du mehr Klassen, gehen auch komplexere Polygone ( http://de.wikipedia.org/wiki/Voronoi ).

Der Umkehrschluss: "Dann nehme ich eben jeweils 100 Klassen" ist auch nicht so sinnvoll, da der Klassifikator dann:
a) sehr lange zum Training braucht
b) oftmals nicht mehr so gut generalisiert
Ok, das mit vielen Beispielen muss ich erst noch sehen... Ich habe einiges an Daten, aber leider sind in diesen so gut wie keine bis gar keine Spurwechsel vorhanden aber das muss ich noch sehen.
Danke schonmal für die Hilfe. Auch wenn ich noch nicht alles verstanden habe und vieles möglicherweise auch nicht richtig...

SprinterSB
02.05.2006, 11:48
Eigentlich müsste ich ja nur das über und unter der Nulllinie zusammenzählen und ca 0 rausbekommen, oder?
Ja, wenn in dem Intervall keine netto-Änderung der Richtung bzw. Transversalgeschwindigkeit passiert. Aber es kann auch eine netto-Änderung sein, stwa ein Spurwechsel in einer langgezogenen Kurve.

Prinzipiell kannst du aus den daten nur bestimme Bewegungen der Fahrzeugs lesen. Ab eine Bewegung ein Spurwechsel ist, steht aber auf nem ganz anderen Blatt. Genausogut könnte die Straße nen leichten Versatz haben, wie es bei Baustellen oft der Fall ist...


Deine Version scheint aber wesentlich mehr zu können als nur zusammenzählen...
Ich habe leider gerade nur eine uralt-Version von Mozilla zur Verfügung, wo die untere f(x) Zeile komplett abgeschnitten wird. Ich kann gerade noch den oberen Rand des Eingabefelds sehen :(
Mit den Layoutmanagern stehe ich seit je her auf Kriegsfuß. Ich hab das Applet einfach mal größer gemacht, vielleicht hilft das schon, damit das Feld nicht mehr umgebrochen wird? Ansonsten einfach ein f(x) eintippen und "Reload".


Also wenn ich das mit diesem farbigen Bild richtig deute, meintest du, dass nach oben hin das Fenster größer wird und nach unten hin kleiner, richtig?
Jepp.


[...] und wahrscheinlich nicht mal extrem rechenintensiv. Wenn ich das richtig sehe, ist ein Integral ja nichts weiter als die Fläche unter der Kurve, also reicht es bei einem normalen Zeitintervall die einzelnen "Rechteckchen" zusammenzuzählen. f(x) + f (x+1) + ... + (f+n)
Ich hatte von -n bis n integriert. Das Integral über ein Fenster zu berechnen ist recht einfach (Ich nehme nur die Simpson-Regel).

Da die Daten Lenkpositionen sind, ist das F(x,y) ein Maß für die Quergeschwindigkeit, die im Zeitintervall y um den Zeitpunkt x erzielt wird.

Der ganze ich erstaunlich unempfindlich gegen Rauschen, in den Bildern ist es kaum zu erkennen. Allerdings müsste man die Daten noch weiter verarbeiten.

Es sieht auch nicht so aus, als ob man einen Tiefpass bräuchte, bzw den Tiefpass bekommt man implizit, indem man die Fensterbreite passend (nicht zu klein) wählt. Ein Tiefpass macht in Endeffekt auch nichts anderes, als f(x) zu ersetzen durch
\int_{x-a}^{x+a} f(t)*q(t-x)*dt / \int_{-a}^a q(t)*dt

Und das Integral haben wir eh :-)

Im Ende wirst du aber an einer Auswertung, wie Ogni sie genannt hat, nicht vorbeikommen... Evtl auch mit Verfahren, wie die in der Bildverarbeitung benutzt werden, um Linien etc zu finden?

Evtl ist es auch sinnvoll, den Datensatz auf die über dem maximal betrachteten Fenster geschehene Richtungsänderung zu normieren (in dem F-Bild mitte oben), so daß an der Stelle immer eine 0 steht. Den Offset nimmt man als Geschwindigkeitsänaderung und sucht in dem "bereinigten" F nach Wechseln

BiGF00T
02.05.2006, 12:47
*Ogni42 & SprinterSB hit BiGF00T with Magical Mathematics Lvl 666 -> HIT, inflicting 10000 pts brain damage*
*BiGF00T backs off to charge his mighty Elementary School Math Lvl 0 -> MISS*
*BiGF00T dies of Math overdose*
*Ogni42 & SprinterSB loot 1xElemetary Math book, 100x Gold, 100x useless electronic device*
... :|
Da mein Intervall ja relativ groß ist (20 ms) und ein normaler Spurwechsel wohl nicht mehr als 5s (oder doch?) braucht, müsste ich dann theoretisch 250 Werte speichern und integrieren. Wenn ich dann mein Fenster theoretisch 100 Werte breit mache, bekomme ich dann ein vernünftiges Ergebnis oder muss es immer mindestens so breit sein wie die Kurve selbst (also > 250)? Wenn ich das Fenster dann breiter mache, würde sich das negativ darauf auswirken, dass ich noch ruckartige Spurwechsel (nach 2s vorbei) finden würde?
Ok, also das mit dem Eingabefeld habe ich jetzt irgendwie gefixt (paarmal reload und irgendwann hat es, ohne erkennbaren Grund, funktioniert :|)
Muss ich das Fenster für jede Analyse so wie in dem Applet von klein nach groß variieren oder reicht mir eine geschickt gewählte Fenstergröße aus?
Wenn ich dann theoretisch eine solche Analyse durchgeführt habe, bekomme ich eine Linie mit (hier im Bild) grünen und roten Bereichen, die über die Zeit verteilt sind. Sollten jetzt grün und rot genau gleich groß sein, wäre somit ein Spurwechsel gefunden. (?)
Nochmal zum Verständnis der Diagramme des Applets:
Das Fenster geht einfach entlang der t-Achse und wenn die Fläche positiv ist, erscheint das rot, wenn die Fläche unverändert ist blau und bei negativer Fläche grün. Blau ist es dann, wenn sich beide gegeneinander aufheben, oder wenn es gar keine Fläche gibt?

EDIT:
Wie groß muss ich mir eigentlich das Fenster in diesen Applet-Screenshots vorstellen? Unten im Bild ein paar Werte groß und oben dann eine halbe Diagrammlänge? Lässt sich so etwas herausfinden?

EDIT2:
Was ich auch nicht genau verstehe ist, wie ich eure beiden Methoden kombinieren sollte... Vielleicht auch, weil ich Ogni42s noch nicht genau verstehe... Wenn ich jetzt mal ein Fenster nehmen und darin deine Methode anwenden würde und als Ergebnis erhalten würde, dass ich einen roten und einen grünen Bereich habe, sagt mir das dann, dass ich einen potentiellen Kandidaten für einen Spurwechsel habe und ich muss dann die Daten des Bereichs mit Ogni42s Methode mit meinen (noch nicht vorhandenen) Referenzdaten vergleichen?

ogni42
02.05.2006, 19:21
*Ogni42 & SprinterSB hit BiGF00T with Magical Mathematics Lvl 666 -> HIT, inflicting 10000 pts brain damage*
*BiGF00T backs off to charge his mighty Elementary School Math Lvl 0 -> MISS*
*BiGF00T dies of Math overdose*
*Ogni42 & SprinterSB loot 1xElemetary Math book, 100x Gold, 100x useless electronic device*


Ja, hm, dann nehmen Sie zwei Aspirin und kommen morgen wieder :D

Auf den Extremwert bin ich folgendermaßen gekommen:
Beim Spurwechsel schlägt man das Lenkrad erst langsam, dann stärker nach (o.B.d.A.) rechts ein und reduziert danach den Lenkwinkel wieder bis auf 0.

Dementsprechend sollte der Verlauf der Lenkwinkelfunktion sowas wie ein Sinus oder eine Parabel, oder .... sein (Daher ja der Name des Threads :) )

Die Tiefpassfilterung ist deswegen nötig, da ein Mensch normalerweise immer ein kleines bisschen nach Links und Rechts lenkt (ohne die Spur zu wechseln). Um jetzt die Kandidaten für einen Spurwechsel zu finden ist es einfacher, über eine tiefpassgefilterte Funktion zu laufen, da dann weniger Kandidaten auftauchen. Die Breite des Filters kann so gewählt werden, dass Du ein gewisses Zeitintervall abdeckst (z.B. 1s).

Die Filterung kann durch Faltung im Originalraum oder Multiplikation im Fourierraum erfolgen. Willst Du Vektoren aus dem Fourierraum zur Klassifikation heran ziehen, bietet sich die Filterung dort an, da das wesentlich Rechenzeit spart. Wie Sprinter geschrieben hat, kannst Du auch ein Frequenzfenster setzen (entspricht Rechtecktiefpass). Gaussfilter hat aber den Vorteil, dass weit entfernte Datenpunkte einen geringeren Beitrag liefern als - in Deinem Fall - zeitlich nahe Punkte.

Als Filter in der Zeitreihe empfiehlt sich ein Gauss, bzw. dessen Ableitung, da Du dann bei der Faltung schon die Ableitung des Signals heraus bekommst und dann nur noch nach Nullstellen (bzw. numerisch nahe Null) (1. Ableitung) im gefilterten Signal suchen musst. Dann kommst Du ohne FFT aus, was, wenn Du auch den korrespondierenden Geschwindigkeitsvektor auswerten willst, m.E. auch Sinn macht.

Um den Klassifikator kümmern wir uns dann später. Implementierungen (so Du das denn auf dem PC testen willst) findest Du in der LTILib (C++) ( www.techinfo.rwth-aachen.de, gibt's auch bei sourceforge).

BiGF00T
03.05.2006, 09:19
Ok, also soweit sieht es jetzt dann aus, dass ich wohl ein wenig falten werde. Ich habe gestern noch ein wenig die Faltung rekapituliert und gesehen, dass die garnicht so schlimm ist. Ich weiß nicht, woher meine Ängste davor kamen. Irgendwie hatte ich daran noch schlechte Erinnerungen von früher... Leider habe ich ein wenig zu lange über alten Unterlagen gesessen, weshalb heute auch Aspirin nicht mehr stark zur Besserung meines Denkvermögens beitragen können.
Fürs Erste werde ich mich mal ein wenig verkriechen, um herauszufinden, ob ich ein paar Beispiele für Spurwechsel in meinen Testdaten finden kann. Vielleicht kann ich daran dann schon ein wenig sehen, wie gut diese Sinus-Theorie wirklich war.
Sinus kam daher, dass ja ein Fahrer, wie du ja schon bemerkt hast, zuerst in eine Richtung einschlägt, dann wieder gerade wird - das Fahrzeug steht jetzt in einem bestimmten Winkel zur Spur - und dann diesen Winkel durch Lenken in die entgegengesetzte Richtung wieder ausgleichen muss. Dies erfolgt leider wie auch schon erwähnt leider in den seltensten Fällen gleichschnell/-stark. Ob das jetzt dann wirklich noch als Sinus zu bezeichnen ist, weiß ich nicht. Als ich den Thread startete, war ich noch der Meinung es wäre so... Langsam bin ich mir nichts mehr sicher, das nicht mindestens mathematisch bewiesen ist. :|

ogni42
03.05.2006, 10:03
Da fällt mir ein, dass ein Spurwechsel ja einen Nulldurchgang beim Lenkwinkel hat. Damit reicht Dir der Wendepunkt der Funktion ( f''(x) = 0 ), der leichter zu finden ist. Mit 2. Ableitung Gauss filtern (da f*g'' = f''*g) und dann nur nach Vorzeichenwechel suchen.

Ob das dann ein Sinus ist, oder irgend etwas anders geartetes ist eigentlich egal (sofern Du das nicht über fitting lösen willst).

SprinterSB
03.05.2006, 15:31
IMHO ist es egal, ob es genau ein Sinus ist oder nicht. Ob da Dellen drin sind oder ein Halb"welle" länger dauert als die andere kann ja durchaus sein und wirs in der Praxis auch so sein. Sinus, Fourier-Trafo u.ä. wie (F)FT, STFT, (F)WT, GT etc kann man gestrost vergessen (ausser evtl für'n Tiefpass, aber das geht einfacher, wie Ogni schon gesagt hat).

Bei der Verwendung von f' muss man sehr vorsichtig sein. Wie will man das berechen?? Angezeigt, um f' zu bekommen, ist ein numerischer Ausgleich (etwa Splines über ein geglättetes und entrauschtes differenzieren). Das ist sehr aufwändig zu berechnen. f' über Differenzenquotienten zu erhalten führt warscheinlich zur Bauchlandung, weil der Diff'quot-Operator stark aufrauht. Für f'' ist's nochmal extremer.

Das INtegral zu berechnen ist sehr einfach. Da die Daten eh verrauscht sind braucht man keine feinziselierten Algorithmen höherer Ordnung. Er reicht einfach Summation. Hast du in einem Feld
F[i] = \sum_0^i f_i
dann ist
F(i,y) = F[i+y]-F[i-y]

An F zu kommen ist also kein Problem -- weder algorithmisch noch von der Laufzeit her.


Wie groß muss ich mir eigentlich das Fenster in diesen Applet-Screenshots vorstellen? Unten im Bild ein paar Werte groß und oben dann eine halbe Diagrammlänge? Lässt sich so etwas herausfinden?

Wenn du mit der Maus über den Graphen fährst erscheinen im StatusBar des Brausers die Koordinaten (evtl erst nach "aktualisieren im Brauser). Mit zoom=1 läuft x von ca -30 bis 30. Zeile 1 (unten) des F-Fensters schaut von x-1 bis x+1. Zeile 2 von x-2 bis x+2, etc. Ausserhalb des sichtbaren bereiches wird f zu 0 angenommen.

ogni42
03.05.2006, 15:48
Bei der Bestimmung der Ableitung von f hilft ja gerade die Faltung:

f' muss man nicht kennen, da bei der Tiefpassfilterung f*g'' = f''*g gilt. Es kommt also in jedem Fall die zweite Ableitung des tiefpassgefilterten Signals raus.

Sofern man g'' als zweite Ableitung der Gaussfunktion nimmt, muss man die Breite des Faltungskerns aber groß genug wählen (IIRC reicht 8+1+8 Elemente auf jeden Fall, muss ich aber ggfs. mal nachschauen).

Da die Ableitung auf dem Tiefpassgefilterten Bild erfolgt ist das Rauschen auch schon reduziert.