Gesucht: Schnelle S-Funktion

OP #7214383
Lesenswert?

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?
Angehängte Dateien:
#7214399
Lesenswert?

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?
Beitrag #7214452 wurde von einem Moderator gelöscht.
OP #7214477
Lesenswert?

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. :-)
#7214506
Lesenswert?

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?
Persönliche Seite #7215975
Lesenswert?

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
Beitrag #7216859 wurde von einem Moderator gelöscht.
Persönliche Seite #7216865
Lesenswert?

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...
Angehängte Dateien:
Persönliche Seite #7242716
Lesenswert?

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.
Angehängte Dateien:
Persönliche Seite #7242983
Lesenswert?

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.
Angehängte Dateien:
Persönliche Seite #7252438
Lesenswert?

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.
Persönliche Seite #7253531
Lesenswert?

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.
Gast #7254726
Lesenswert?

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
Gast #7254729
Lesenswert?

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.
Persönliche Seite #7254849
Lesenswert?

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.
OP #7944516
Lesenswert?

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.
#7949876
Lesenswert?

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.

Persönliche Seite #7949990
Lesenswert?

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.

Persönliche Seite #7951106
Lesenswert?

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
#7951651
Lesenswert?

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.

OP #7951927
Lesenswert?

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
Persönliche Seite #7952093
Lesenswert?

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

$$v(t) = \begin{cases} 1+\cos t\ ;&\text{für}\quad |t|<\pi\\ 0 \ ;&\text{für}\quad |t|\geqslant\pi\\ \end{cases}$$

und diese dann integrieren:

$$f(t)=\int_0^s\! v(s)ds$$

Persönliche Seite #7952720
Lesenswert?

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:

$$x(t)=\int_0^t \!\! v(\tau)d\tau =\begin{cases} t+\sin t\ ;&\text{für}\quad |t|<\pi\\ \pi \operatorname{sign}t \ ;&\text{für}\quad |t|\geqslant\pi\\ \end{cases}$$

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

$$m\ddot x + c\dot x + kx = F(t)$$

und dann macht man eine Fourier-Analyse von F(t) mit

$$F(t)\sim \begin{cases} -\sin t\ ;&\text{für}\quad |t|<\pi\\ 0 \ ;&\text{für}\quad |t|\geqslant\pi\\ \end{cases}$$

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

Persönliche Seite #7953684
Lesenswert?

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.

$$f(x)=\sin(x/2)$$

Die Anschlussstellen von ƒ liegen an den Maxima bei ±π.

$$g(x)=\frac1\pi(x+\sin x)$$

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.

Angehängte Dateien:
Persönliche Seite #7953751
Lesenswert?

...tatsächlich ist ein Taylor-Polynom etwas besser geeignet als g(x)=x+sin(x). Dazu macht man den Ansatz

$$p'(x)=\alpha(x^2-\pi^2)^2$$

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

$$\int_0^\pi\!\! p(x)dx\stackrel!=1$$

also

$$\alpha=\frac{15}{8\pi^5}$$

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
#7954199
Lesenswert?

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.

Persönliche Seite #7954423
Lesenswert?

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

$$u(x)=\frac x{1-x^2}$$

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?

Angehängte Dateien:
: Bearbeitet durch User
#7956029
Lesenswert?

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.

Angehängte Dateien:
: Bearbeitet durch User
Persönliche Seite #7956131
Lesenswert?

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

$$f(x) = \frac12(3x-x^3)$$

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.

#7956377
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren