Hallo zusammen, ich suche eine schnelle S-Funktion. Mit S-Funktion meine in eine glatte Funktion f(x), für die gilt: f(-1) = -1, f(1) = 1, f'(-1) = 0, f'(1) = 0. Mit "schnell" meine ich, dass sie möglichst wenig Rechentakte kosten sollte. Mein erster Gedanke war natürlich ein Sinus - damit habe ich es auch implementiert, und es geht auch ganz gut, allerdings ist der Rechenaufwand nicht unerheblich - bis zu 1611 Takte (float). Ich hätte gern etwas mehr Sicherheitsmarge und würde die MCU gerne häufiger schlafen legen. Der nächste naheliegende Gedanke wäre natürlich ein kubisches hermitesches Polynom. Aber bevor ich jetzt zig Sachen nacheinander ausprobiere, würden mich Erfahrungswerte interessieren. Gibt es eine Standard-Funktion, die (und deren Ableitung) sich auf einem µC besonders effizient und am besten sogar in Fixkomma berechnen lässt?
Für Sinus gibt es sehr schnelle Approximationen, wenn es nicht auf Genauigkeit ankommt. Z.B. https://gist.github.com/geraldyeo/988116 Für Mikrocontroller dann je nach Hardware in float oder fixpoint umschreiben.
Walter T. schrieb: > Hallo zusammen, > > ich suche eine schnelle S-Funktion. > > Mit S-Funktion meine in eine glatte Funktion f(x), für die gilt: f(-1) = > -1, f(1) = 1, f'(-1) = 0, f'(1) = 0. Mit "schnell" meine ich, dass sie > möglichst wenig Rechentakte kosten sollte. > > Mein erster Gedanke war natürlich ein Sinus - damit habe ich es auch > implementiert, und es geht auch ganz gut, allerdings ist der > Rechenaufwand nicht unerheblich - bis zu 1611 Takte (float). Ich hätte > gern etwas mehr Sicherheitsmarge und würde die MCU gerne häufiger > schlafen legen. Du kannst die Taylorreihe des Sinus ja nach dem 2-ten Glied (kubisch) abbrechen ;-) Oder eine LUT?
Ja, wahrscheinlich lässt sich das Polynom kaum schlagen, zumal die Ableitung ja sogar noch weniger Aufwand als die eigentliche Funktion ist.
Nachtrag: Das Polynom ist auch als Approximation für den Sinus echt nicht übel. Im Bereich -pi ... pi ist es auf 2% genau.
Beitrag #7214452 wurde von einem Moderator gelöscht.
Walter T. schrieb: > Nachtrag: Das Polynom ist auch als Approximation für den Sinus echt > nicht übel. Im Bereich -pi ... pi ist es auf 2% genau. Gegenüber der nach dem 2ten Glied abgebrochenen Taylorreihe hat das kubische Glied hier den zusätzlichen Faktor 2. Das minimiert ggf. den max. Fehler im Bereich [-pi/2,pi/2].
Moin, ich denke, dem Threadstarter ging es nicht um eine schnelle Sinus Funktion, sonder um eine "Saturation Curve". Deshalb wurde auch ein Plot der atan Kurve und nicht eines Sinus gepostet.
Walter T. schrieb: > Nachtrag: Das Polynom ist auch als Approximation für den Sinus echt > nicht übel. Im Bereich -pi ... pi ist es auf 2% genau. Du meinst sicher [-pi/2,pi/2]
Nils schrieb: > Deshalb wurde auch ein Plot der atan Kurve und nicht eines Sinus > gepostet. Nein. Der Plot der obigen Kurve ist
Sie ist extrem gutmütig, da sogar C2-stetig und trotzdem recht scharf. Nils schrieb: > "Saturation Curve". Die Anforderung ist etwas schärfer. Eine horizontale Asymptote reicht mir nicht. Wilhelm M. schrieb: > Du meinst sicher [-pi/2,pi/2] Sicher. Zum Glück wurde ich trotzdem verstanden. :-)
Ich spiegle gerne einfach x^2
https://www.wolframalpha.com/input?i2d=true&i=Piecewise%5B%7B%7BDivide%5BPower%5Bx*2%2C2%5D%2C2%5D%2C0%3C%3Dx%3C%3D0.5%7D%2C%7B1-Divide%5BPower%5B2-x*2%2C2%5D%2C2%5D%2C0.5%3C%3Dx%3C%3D1%7D%7D%5D Oben kannst du statt dem ^2 auch was beliebiges einsetzen, ich habe die restlichen Parameter entsprechend gewählt, damit das geht. Alles >0 sollte ne schöne Kurve geben. Zu deinen Anforderungen dürfte alles >2 passen. Gibt es eigentlich einen Namen, für das Ding?
Re D. schrieb: > Google mal nach Ansatzfunktionen für FEM. Definitiv nicht. Stückweise Lagrange-Polynome sind nicht dafür gedacht, effizient auf einem µC ausgewertet zu werden.
Walter T. schrieb: > Definitiv nicht. Stückweise Lagrange-Polynome sind nicht dafür gedacht, > effizient auf einem µC ausgewertet zu werden. Ach nein? Kommt natürlich darauf an was man machen will, aber so ist die Aussage einfach falsch, zumal es nicht nur Lagrange gibt.
Walter T. schrieb: > Mit S-Funktion meine in eine glatte Funktion f(x), für die gilt: f(-1) = > -1, f(1) = 1, f'(-1) = 0, f'(1) = 0. Mit "schnell" meine ich, dass sie > möglichst wenig Rechentakte kosten sollte. Als durchgehende Formel für negative und positive x ist der Vorschlag von Achim H. wohl kaum zu verbessern. Falls eine Fallunterscheidung x = negativ bzw. x = positiv zulässig ist, geht es sogar mit zwei verschobenen/gespiegelten Normalparabeln: falls x = negativ (bzw. -1 ≤ x < 0), dann y = (2+x)*x falls x = positiv (bzw. 0 ≤ x ≤ 1), dann y = (2-x)*x
Eberhard H. schrieb: > Falls eine Fallunterscheidung x = negativ bzw. x = positiv zulässig ist, > geht es sogar mit zwei verschobenen/gespiegelten Normalparabeln: Ich bin mit dem Polynom 3. Ordnung schon zufrieden, aber das klingt auch noch einmal einen Versuch wert.
Beitrag #7216859 wurde von einem Moderator gelöscht.
Abgesehen von der Rechenzeit, mag die eine oder andere Kurve je nach gewünschter Steigung im Nullpunkt von Vorteil sein. Bei den beiden Parabeln (grün, nur 1. Quadrant gezeichnet) ist es die Steigung 2, beim Polynom 3. Ordnung (rot) ist es die Steigung 1,5 und beim normierten Sinus (blau) ist es pi/2 = 1,57...
Mathematikus schrieb: > Wo haste die her? Vermutlich hat er sie einfach hergeleitet. Das ist das Polynom 3. Ordnung durch die vorgegebenen Punkte (-1|-1), (0|0) und (+1|+1), das bei (-1|-1) und (+1|+1) die gewünschte Steigung 0 hat: y = −0,5*x^3 + 1,5*x (rot) y' = -1,5*x^2 + 1,5 (grün) Als Mathematikus könntest du das eigentlich wissen.
Als Digitalo verwende ich gerne die Darstellung von 0...1, abgeleitet von einer steigenden- multipliziert mit einer fallenden Gerade. Y = 4 * x*(1-x) = 4 * (x - x*x) Daraus bildet man das skalierte Integral: Y = 3*x*x - 2*x*x*x http://www.96khz.org/oldpages/windowfunctions.htm Per vorheriger Transformation von X wird es auf die Koordinaten auf -1 ... 1 umgesetzt. Alternativ das X einsetzen und die Formel ausrechnen. Dann müsste die u.g. Formel rauskommen. Man kann das auch noch durch z.B. Quadrieren der grundlegenden Parabel weiter versteilern und das X dehene oder komprimieren, damit die X/2 (nicht) durch den 50%-Punkt geht. Walter T. schrieb: > Mein erster Gedanke war natürlich ein Sinus Das ist auch die Funktion, die die geringsten Probleme macht, weil sie keine Oberwellen hat. Es gibt nur ein Problem beim Übergang in die Geraden in deinem Diagramm. Soll das wirklich zwischen -2 und -1 flat sein? Gfs. taugt auch eine gleichförmige S über den gesamten Bereich. Dazu das x*(1-x) 3x zu einer x6 oder auch x8 quadrieren und danach integrieren.
Hier ist noch etwas Universelles aus dem Synthesizer: Fortgesetzte quadrierte Wellen nach dem o.g. Schema und das aufintegriert. Geht im FPGA in Echtzeit ohne aufwändige Formel. Für den DSP kann man es natürlich ausmultiplizieren und formell integrieren. Für die höchste Funktion im Bild braucht man eine X16. Wird ein fettes Polynom, taugt aber für alle erdenklichen Zwecke, z.B. zum Überblenden oder zur Erzeugung von geradzahligen Oberwellen.
Gibt auch irgendwo eine Erklärung, was da passiert, die man versteht, ohne alle Begriffe aus der FPGA-Welt zu kennen?
Walter T. schrieb: > Gibt auch irgendwo eine Erklärung Soweit sich dies auf meinen Beitrag bezieht: Das ist eigentlich nicht sonderlich FPGA-lastig. Die Funktion als solche ist ja einfach Mathematik. Das Thema FPGA kommt ins Spiel weil die Randbedingungen ganz bestimmte Lösungen empor bringen. Die beste aller Überblendungsfunktionen ist aus den erwähnten Gründen der fehlenden Oberwellen ein Cosinus. Da man den so einfach nicht herstellen kann, nimmt man die erste Näherung - eine Parabel. Da diese aber ungenau ist, nimmt man Teile des Quadrates, also eine X4 hinzu, weil damit die Oberwelle entfernt werden kann. Setzt man das fort, bekommt man einen beliebig genauen Sinus. Siehe Digitale Sinusfunktion In einem FPGA lässt sich herrlich parallel und sequenziell quadrieren. Daraus resultieren die obigen Kurven, die man ihrerseits auch einzeln nutzen kann, um besonders steilflankig zu überblenden. Geht man nun noch einen Schritt weiter, gelangt man beim Blick auf die steilste (die lila) in "Versuchung", zwei davon zu nehmen, sie zu versetzen und als magnetische Sättigung zu verwenden und das Ganze in seinen Synthie einzubauen. Die weiche Kurve, (die blaue) kann man nutzen, um Samples bei der Granularsynthese zu überblenden oder eine einfache Fensterfunktion aufzubauen.
Ehrlich gesagt verstehe ich immer noch nicht, was X16 ist, nur dass es jetzt auch noch X4 gibt. Sind das die Stützstellen?
Okay, ich denke, ich habe es verstanden. Du argumentierst mit der x-ten Oberwelle, weil sich das in Audio-Anwendungen direkt in einen Klirrfaktor umrechnen lässt, und weil es bei tabellarischer Auswertung keine weiteren gespeicherten Stützstellen bedeutet, sondern nur eine weitere Tabelle mit Verstärkung Bei "analytischer" Auswertung ist das einfach
Okay, ich denke, ich habe es verstanden. Du argumentierst mit der x-ten Oberwelle, weil sich das in Audio-Anwendungen direkt in einen Klirrfaktor umrechnen lässt, und weil es bei tabellarischer Auswertung keine weiteren gespeicherten Stützstellen bedeutet, sondern "nur" eine weitere Tabelle mit Verstärkungsfaktoren benötigt. Bei "analytischer" Auswertung entspricht das einfach einem höheren Polynomgrad.
Walter T. schrieb: > Ehrlich gesagt verstehe ich immer noch nicht, was X16 ist, nur dass es > jetzt auch noch X4 gibt. Sind das die Stützstellen? X hoch 4 und X hoch 16 http://www.96khz.org/oldpages/parametricsaturation.htm Diese fortgesetzen Multiplikationen sind einfach zu machen und führen bei Aufintegration auch zu einem S - allerdings einem schärferen. Walter T. schrieb: > Okay, ich denke, ich habe es verstanden. Du argumentierst mit der x-ten > Oberwelle, weil sich das in Audio-Anwendungen direkt in einen > Klirrfaktor umrechnen lässt, Nicht unbedingt. Erstmal geht es darum, bei Überblendungen möglichst wenige Artefakte zu erzeugen und das mit einer weichen Welle am Besten. Ist wie ein Fahrspurwechsel auf der Autobahn.
Bekäme man damit auch eine Art Sinus hin? Wenn ich die blaue Kurve ansehe, scheint da nicht viel zu fehlen. Lässt sich der Oberwellengehalt analytisch bestimmen?
Also mein Problem von 2022 wurde gelöst, insofern kann der Thread gerne für andere Zwecke weiter genutzt werden. Aber ja: Da die ursprüngliche Frage ein Stück eines Sinus enthält, kann natürlich auch umgekehrt jede der genannten Funktionen als mehr oder weniger gute Stück-eines-Sinus-Approximation herhalten.
Beitrag #7949862 wurde vom Autor gelöscht.
Rolf schrieb: > Lässt sich der Oberwellengehalt analytisch bestimmen? Die Funktion mit dem Sinus-Übergang kannst du aus einem Sinus und Sprungfunktionen zusammen bauen. Die Laplace-Transformation verrät dir dann, wie das Spektrum aussieht. Den Oberwellengehalt bekommst du, indem du die Oberwellen in Relation zur Grundwelle setzt.
Rolf schrieb: > Bekäme man damit auch eine Art Sinus hin? Wenn ich die blaue Kurve > ansehe, scheint da nicht viel zu fehlen. Lässt sich der Oberwellengehalt > analytisch bestimmen? Falls sich das auf die Kurve in meinem Bild bezieht, ist das eine deformierte Parabel. Deren Oberwellengehalt liegt auf ganzzahligen gerade Vielfachen der Grundwelle. Den müsste man beseitigen. Ich habe eine fortgesetzte Approximation dafür, um einen genererischen Sinus zu erzeugen. Das geht dann eben mit der Hinzunahme von immer mehr Funktionen dieser Art. Für FPGAs lohnt das, weil sie (nur!) Multiplier haben, um diese Quadrate zu erzeugen und alles andere schwieriger wäre. Für DSPs eher nicht.
Hallo, wenn etwas auf einem µC besonders schnell gehen soll, ist es doch nur eine Frage der erforderlichen Auflösung und der Größe des Speichers. Einmal initialisieren oder ins ROM mit der Tabelle und fertig!
Kay-Uwe R. schrieb: > Einmal initialisieren oder ins ROM mit der Tabelle und fertig! Wenn die Überblendung / Nutzung der Funktion immer in derselben Weise erfolgt, ja. Aber oftmals ist das Umsteuern zeitlich dynamisch. Dann braucht es Zwischenpunkte in einer Tabelle. Deren Berechnungsaufwand ist sehr schnell höher, als das direkte rechnen. Die o.g. Parabelfunktionen Beitrag "Re: Gesucht: Schnelle S-Funktion" haben im Wesentlichen nur anderhalb Oktave mehr an Steilheit, als die jeweils eingesteuerte Grundwelle bzw. ein perfekter Cosinus liefern würde, sind als ziemlich oberwellenarm.
:
Bearbeitet durch User
Hallo, eine Zwischenfrage. Ist diese S-Kurve die gleiche wie sie für die Beschleunigung und Abbremsen eines Zuges oder Bewegung eines Glases im Cocktailautomaten oder Getränkeautomat allgemein oder ruckfreie Gelenk-Roboterantriebe verwendet wird? Also das etwas sanft anfährt und sanft wieder stoppen kann. Dazwischen wird maximal mögliche Geschwindigkeit erreicht.
Nur für extrem kurze Strecken, bei denen bei maximaler Beschleunigung die maximale Geschwindigkeit nicht erreicht wird. Der Sinus kann nur entweder auf maximale Beschleunigung oder auf maximale Geschwindigkeit parametriert werden. Für maximale Beschleunigung und maximale Geschwindigkeit ergeben sich stückweise Parabeln.
:
Bearbeitet durch User
Veit D. schrieb: > Ist diese S-Kurve die gleiche wie sie für die > Beschleunigung und Abbremsen eines Zuges oder Bewegung eines Glases im > Cocktailautomaten oder Getränkeautomat allgemein oder ruckfreie > Gelenk-Roboterantriebe verwendet wird? Also das etwas sanft anfährt und > sanft wieder stoppen kann. Nein. Siehe zum Beispiel diesen Desmos-Plot: https://www.desmos.com/calculator/nzc8phxewa Der Graph steht in grün, die 1. Ableitung (also Geschwindigkeit) in violett und die 2. Ableitung (also Kraft) in rot. Weil die 2. Ableitung einen Sprung hat, ist es keine ruckfreie Kurve, weil sich die Kraft auf ein Objekt sprunghaft ändert. Um das eine Stufe glatter zu bekommen kann man mit einer stetig differenzierbaren Geschwindigkeit beginnen wie
und diese dann integrieren:
Hallo, Danke. Also das S-Shape ist eine Integration, um am Ende sowas wie hier gezeigt als Resultat zu haben? https://www.youtube.com/watch?v=qYJpl7SNoww
Veit D. schrieb: > Also das S-Shape ist eine Integration, um am Ende sowas wie hier > gezeigt als Resultat zu haben? > https://www.youtube.com/watch?v=qYJpl7SNoww Da wird leider keine Formel genannt. Das Integral von obigem v(t) ist:
Das hat immerhin eine stetige 2. Ableitung, also stetige Beschleunigung. https://www.desmos.com/calculator/fwzzbsf3dd Für die Bewegung des Bieres kann man den Ansatz machen, dass die Bewegung aus einzelnen, unabhängigen Schwingungsmoden besteht, die einer gedämpften, erzwungenen Schwingung gehorchen, also
und dann macht man eine Fourier-Analyse von F(t) mit
Für Wolfram Alpha ist das leider zu komplizert: https://www.wolframalpha.com/input?i=Fourier+transform+calculator&assumption=%7B%22F%22%2C+%22FourierTransformCalculator%22%2C+%22transformfunction%22%7D+-%3E%22Piecewise%5B%7B%7B-sin%28t%29%2C%7Ct%7C%3C%3Dpi%7D%2C+%7B0%2C%7Ct%7C%3E%3Dpi%7D%7D%5D%22&assumption=%7B%22F%22%2C+%22FourierTransformCalculator%22%2C+%22variable1%22%7D+-%3E%22t%22&assumption=%7B%22F%22%2C+%22FourierTransformCalculator%22%2C+%22variable2%22%7D+-%3E%22w%22 Aber das Integral sollte mit Papier und Bleistift lösbar sein, denn im Endeffekt läuft das Fourier-Integral auf folgende, elementar lösbare Integrale hinaus: https://www.wolframalpha.com/input?i=integral%5Bsin%28ax%29*cos%28bx%29%2Cdx%5D
Hallo, Danke. Mit der Mathematik dahinter tue ich mich schwer. Ich habe jedoch nun eine genauere Vorstellung von dem was dahinter steckt und das es nicht einfach irgendeine Parabel oder einfache Sinusfunktion ist. Das ist doch schon etwas. :-)
Veit D. schrieb: > Ist diese S-Kurve die gleiche wie sie für die > Beschleunigung und Abbremsen eines Zuges oder Bewegung eines > Glases im Cocktailautomaten oder Getränkeautomat allgemein oder > ruckfreie Gelenk-Roboterantriebe verwendet wird? Also das etwas sanft > anfährt und sanft wieder stoppen kann. Dazwischen wird maximal > mögliche Geschwindigkeit erreicht. Die obigen Beispiele hab ich mal konkret gemacht mit Desmos: ƒ (rot) ist ein Sigmoid, das an den Anschlussstellen 1× stetig diff'bar ist. g (violett) ist ein Sigmoid, das an den Anschlussstellen 2× stetig diff'bar ist. Den Frequenzgehalt der Kräfte bekommt man über die Fourier-Sinustransformierten. Die Cosinustransformien sind wegen Symmetrie Null. Wegen der Integrale dauert das Rendern des Desmos-Plots einige Sekunden. https://www.desmos.com/calculator/iqdau5z2ry Der Oberwellengehalt von f" fällt wie 1/x, derjenige von g" fällt wie 1/x². g regt also wesentlich weniger zu Schwingung an als f. Der Sigmoid-Teil agiert im Intervall [-π, π] und leitet von -1 nach +1.
Die Anschlussstellen von ƒ liegen an den Maxima bei ±π.
Die Anschlussstellen von g liegen beim 1. Nulldurchgang von sin bei ±π, die durch die Addition von x zu Wendepunkten mit waagerechter Tangente werden. Ein Maß für die Güte des Übergangs ist also, wie oft die Funktion stetig differenzierbar ist: Bei n-maliger stetiger Diff'barkeit fällt der Overwellengehalt wie 1/x^n. Für eine Metrik ist das aber nicht ausreichend, was evtl. ausreicht ist die Fläche unter der Sinustransformierten. Und da ist mir unklar, ob das eine hinreichend gute Metrik ist. Was aber auch eine Rolle spielt, ist, bei welchen Frequenzen ein transferiertes Objekt zu Schwingungen anregbar ist.
...tatsächlich ist ein Taylor-Polynom etwas besser geeignet als g(x)=x+sin(x). Dazu macht man den Ansatz
so dass p' ebenso wie g' doppelte Nullstellen in ±π hat. Um p mit g oder ƒ(x)=sin(x/2) vergleichen zu können hat man die Normierungsbedingung
also
p hat im Ursprung eine etwas kleinere Ableitung als g bei ansonsten vergleichbaren Anschlusseigenschaften. Die Ableitung im Ursprung bestimmt die Ableitung der Fourier-Sinustransformierten in 0, was wiederum Einfluss auf die Größe deren ersten Maximums nimmt. So wie bei g auch klingen die hochfrequenten Anteile ab wie 1/x².
:
Bearbeitet durch User
Falls jemand noch weitere Funktionen dieser Art sucht: https://en.wikipedia.org/wiki/Sigmoid_function Ab C99 und C++11 gibt's davon mindestens erf(x). Müsste man sich anschauen, ob die schnell genug ist. Für neuronale Netze etc. reicht häufig auch f(x) = x / (1 + abs(x)) bzw. passend skaliert/verschoben.
Hallo, vielen Dank für die Mühe(n) ;-). Ich werde irgendwann ... darauf zurückkommen. Mein Hintergedanke ganz hinten im Oberstübchen ist die sanfte Beschleunigung und Bremsen eines Modellbahnzuges (Spur TT). Bisher habe ich eine lineare Berechnung zwischen Start und Endwerten hinterlegt. Wenn alles andere gemacht ist, komme ich darauf zurück. Erstmal reicht linear damit sich etwas tut. Aber irgendwann ... :-) Deswegen die informative Frage.
Veit D. schrieb: > Modellbahnzuges In dem Fall ist des Schwingungsverhalten / Fourieranalyse natürlich komplett irrelevant. Es sei denn, du hast nen Speisewagen, in dem der Tee nicht überschwappen soll :-)
Veit D. schrieb: > Mein Hintergedanke ganz hinten im Oberstübchen ist die > sanfte Beschleunigung und Bremsen eines Modellbahnzuges Dann würde ich eher ein Leistungsgesetz als Grundlage nehmen, also v = const. * sqrt(t) solange v < v_max das sieht dann ziemlich realistisch aus.
Walter T. schrieb: > Dann würde ich eher ein Leistungsgesetz als Grundlage nehmen, also > > v = const. * sqrt(t) solange v < v_max Das startet mit einer unendlich großen Beschleunigung. Nicht sonderlich realistisch. Arc N. schrieb: > https://en.wikipedia.org/wiki/Sigmoid_function > Ab C99 und C++11 gibt's davon mindestens erf(x). Müsste man sich > anschauen, ob die schnell genug ist. Für neuronale Netze etc. reicht > häufig auch f(x) = x / (1 + abs(x)) bzw. passend skaliert/verschoben. Die dort gezeigten Funktionen wie https://en.wikipedia.org/wiki/File:Gjl-t(x).svg sind zwar S-förmig, leiten aber nicht in einem _endlichen_ Intervall von -1 nach +1. Sie erreichen ±1 erst im Limes → ±∞. Man könnte dann auf die Idee kommen eine Übergangsfunktion wie
zu verwenden um ±∞ nach ±1 zu verlagern. Die so entstehenden Funktionen sind aber i.d.R nicht mehr S-förmig, und teilweise ist das Ergebnis noch nicht einmal diff'bar in ±1, etwa bei arctan (u(x)). https://www.desmos.com/calculator/zhlkaxlexd Bislang ist auch nicht klar, was die Funktion darstellen soll. Ist es die Geschwindigkeit des Zuges? Ist es der Ort?
:
Bearbeitet durch User
Johann L. schrieb: > Das startet mit einer unendlich großen Beschleunigung. Nicht sonderlich > realistisch. Theoretisch ja. Praktisch ist das aber noch nicht einmal ein Sonderfall, weil man die zeitliche Ableitung bei t=0 ja gar nicht braucht - egal, ob man das auf Kraft/Beschleunigungsebene, Geschwindigkeitsebene oder Positionsebene implementiert.
Johann L. schrieb: > Veit D. schrieb: >> Modellbahnzuges > > In dem Fall ist des Schwingungsverhalten / Fourieranalyse natürlich > komplett irrelevant. Es sei denn, du hast nen Speisewagen, in dem der > Tee nicht überschwappen soll :-) Mit Güterwagen und offenen Bierfass könnte man testen. :-)
Veit D. schrieb: > Bisher habe ich eine lineare Berechnung zwischen Start und Endwerten > hinterlegt. Linear in der Geschwindigkeit oder was? Das ist das, worüber die Fahrgäste in der S-Bahn immer fluchen: Hohe Spitzen im Ruck (= 1. Ableitung der Beschleunigung), d.h. kräftige Änderung der Beschleunigung beim Losfahren und Anhalten.
Walter T. schrieb: > auf einem µC besonders effizient und am besten > sogar in Fixkomma berechnen lässt? Versuchs doch mal mit einer Bezier-Kurve. Sie ist einfach zu berechnen, man muß nur die 4 Bz Koordinaten festlegen. Ich hab mal eine Bz-Kurve über dein Bild gelegt. PS: das rote kannst du vergessen.
:
Bearbeitet durch User
Mein S-Funktion-Problem war irgendwann 2022 gelöst. Ich weiß nicht einmal mehr genau, wofür das überhaupt da war (es war eine wilde Zeit mit sehr vielen Baustellen und wenig Doku).
:
Bearbeitet durch User
Rudi schrieb: > Versuchs doch mal mit einer Bezier-Kurve. Das bringt nix Neues, sondern ist lediglich eine etwas andere Draufsicht: Für einen kubischen Bézier braucht man 4 Kontrollpunkte. Für einen Übergang von (-1,-1) nach (1,1) hat mal also P0=(-1,-1) und P3 = (1,1). Weil der Anschluss diff'bar sein soll hat man außerdem
1 | P1 = (a, -1) |
2 | P2 = (b, 1) |
und scheinbar zwei Freiheitsgrade bei der Wahl der Kontrollpunkte. Nun soll die Kurve EINFACH zu berechnen sein, d.h man will eine Funktion
1 | y = f(x) |
und NICHT etwa eine parametrische Kurve
1 | B(t) = (x(t), y(t)) |
in der ein Bézier üblicherweise vorliegt. Mit der Zusatzbedingung x(t)=t verschwinden die scheinbaren Freiheitsgrade, und man erhält:
1 | a = -b = -1/3 |
Ergebnis ist also ein schnödes kubisches Polynom
das man auch direkt und ohne den ganzen Bézier-Zauber erhalten kann. Ein Vorteil von Bézier-Kurven ist, dass Zwischenergebnisse bei deren Berechnung innerhalb es von den Kontrollpunkten aufgespannten Gebiets liegen; für die Beispielfunktion hat mal also dass alle y-Zwischenwerte in [-1,1] liegen — vorausgesetzt man entwickelt nach De-Casteljau. Damit kann man dann Fixed-Point Arithmetik verwenden, etwa nach ISO IEC TR18037 wie sie z.B. avr-gcc als _Fract zur Verfügung stellt. Allerdings braucht De-Casteljau mehr Multiplikationen als eine direkte Auswertung, z.B. nach dem Horner-Schema. Horner-Schema liefert allerdings Zwischenergebnisse, die nicht in [-1,1] liegen, was sich aber einfach reparieren lässt. Mit x in [-1,1]:
1 | 1. y1 = x/2 |
2 | 2. y2 = y1·y1 |
3 | 3. y3 = 0.75 - y2 |
4 | 4. y4 = x·y3 |
5 | 5. f(x) = 2·y4 |
Wie man leicht nachrechnet liegen alle Zwischenergebnisse in [-1,1], und man braucht nur 2 Multiplikationen und 2 Shifts. De-Casteljau hingegen braucht 12 Multiplikationen und ist damit nicht nur langsamer, sondern auch mit größerem Rundungsfehler behaftet.
Johann L. schrieb: > Wie man leicht nachrechnet liegen alle Zwischenergebnisse in [-1,1], und > man braucht nur 2 Multiplikationen und 2 Shifts. De-Casteljau hingegen > braucht 12 Multiplikationen und ist damit nicht nur langsamer, sondern > auch mit größerem Rundungsfehler behaftet. Super Beitrag! Kaum wechselt man die Draufsicht, schon purzeln hier die gewünschten Fixkommaalgos. Echt schade, dass das ganze ein paar Jahre zu spät kommt. Das bringt mich wieder auf ein Problem mit der Suchfunktion im Forum. Es sollten diese nach dem Datum des letzten Posts sortiert werden. so wie es jetzt ist, ist es total nutzlos.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.







