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 vom Autor 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].
:
Bearbeitet durch User
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. :-)
:
Bearbeitet durch User
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 vom Autor 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.
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.