Forum: Compiler & IDEs Gesucht: Schnelle S-Funktion


von Walter T. (nicolas)


Angehängte Dateien:

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?

von avr (Gast)


Lesenswert?

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.

von Wilhelm M. (wimalopaan)


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?

von Achim H. (anymouse)


Lesenswert?

Hm, schneller als

von Walter T. (nicolas)


Lesenswert?

Ja, wahrscheinlich lässt sich das Polynom kaum schlagen, zumal die 
Ableitung ja sogar noch weniger Aufwand als die eigentliche Funktion 
ist.

von Walter T. (nicolas)


Lesenswert?

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 vom Autor gelöscht.
von Wilhelm M. (wimalopaan)


Lesenswert?

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].

: Bearbeitet durch User
von Nils (Gast)


Lesenswert?

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.

von Wilhelm M. (wimalopaan)


Lesenswert?

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]

von Walter T. (nicolas)


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. :-)

: Bearbeitet durch User
von Daniel A. (daniel-a)


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?

von Re D. (Gast)


Lesenswert?

Google mal nach Ansatzfunktionen für FEM.

von Walter T. (nicolas)


Lesenswert?

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.

von Re D. (Gast)


Lesenswert?

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.

von Eberhard H. (sepic) Benutzerseite


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

von Walter T. (nicolas)


Lesenswert?

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 vom Autor gelöscht.
von Eberhard H. (sepic) Benutzerseite


Angehängte Dateien:

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...

von Mathematikus (Gast)


Lesenswert?

Achim H. schrieb:
> Hm, schneller als

Wo haste die her?

von Eberhard H. (sepic) Benutzerseite


Angehängte Dateien:

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.

von J. S. (engineer) Benutzerseite


Angehängte Dateien:

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.

von J. S. (engineer) Benutzerseite



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.

von Walter T. (nicolas)


Lesenswert?

Gibt auch irgendwo eine Erklärung, was da passiert, die man versteht, 
ohne alle Begriffe aus der FPGA-Welt zu kennen?

von J. S. (engineer) Benutzerseite


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.

von Walter T. (Gast)


Lesenswert?

Ehrlich gesagt verstehe ich immer noch nicht, was X16 ist, nur dass es 
jetzt auch noch X4 gibt. Sind das die Stützstellen?

von Walter T. (Gast)


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

von Walter T. (Gast)


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.

von J. S. (engineer) Benutzerseite


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.