Wissenswertes zu Schwingungen
Die Sinusfunktion wird häufig benötigt, wenn es um Klangsynthese geht. Sie ist die einfachste Schwingungsform. In der Natur bauen alle Schwingungen auf der Sinusschwingung auf. Es ist quasi die Grundschwingung der Natur.
Eine reine Sinusschwingung besteht aus nur einer Frequenz. Jede Schwingung kann man in einer 2D-Ansicht sowohl in der Zeit- als auch in der Frequenzachse darstellen. Die Zeitachse spielgelt die Amplitude wieder, die hin und her schwingt, wie ein Pendel. Die Frequenzachse dagegen zeigt an, welche Frequenzen in der Schwingung enthalten sind.
Die Fourier Transformation ist ein Verfahren zur Bestimmung der Frequenzanteile in einem Signal. Dabei wird das zu analysierende Signal mit (mathematisch generierten) Sinusschwingungen gefaltet. Für jede Faltung entsteht ein „Koeffizient“, welcher eine Aussage über die Amplitude des Frequenzanteils erlaubt.
In der Praxis wird das Signal mit Sinus- und Cosinusschwingungen gefaltet, damit sich komplexe Werte ergeben. Diese erlauben zusätzlich eine Aussage über die Phasenlage des Frequenzanteils. Mit diesen beiden Informationen (Amplitude und Phase pro Frequenzanteil) lässt sich das Ausgangssignal tatsächlich verlustfrei rekonstruieren.
Bemerkenswert ist die Symmetrie der Sinus- und Cosinus Funktionen. Die Ableitungen von Sinus ergibt die Cosinusfunktion:
sin'(x)=cos(x)
Weitere Ableitungen ergeben immer wieder cos oder sin Funktionen:
cos'(x)=-sin(x)
Besondere Werte:
sin(0)=0 sin(π/2)=1 sin(π)=0 sin(3π/2)=-1 sin(2π)=0 | cos(0)=1 cos(π/2)=0 cos(π)=-1 cos(3π/2)=0 cos(2π)=1 |
Taylorreihen
Die Sinus Funktion gibt es für alle möglichen Programmiersprachen in verschiedenen Genauigkeiten (Math.sin, sin, sinf etc.). Wir wollen diese aber nicht verwenden, da sie viel zu langsam ist. Der Grund dafür ist, dass die meisten angebotenen Funktionen die größtlögliche mathematisch mögliche Genauigkeit umsetzen. Gleichzeitig sollen sie für den gesamten möglichen Zahlenbereich funktionieren. Der entsprechende numerische Algorithmus ist entsprechend rechenaufwändig umzusetzen.
Mit Taylorreihen lassen sich trigonometische Funktionen als Polynome approximieren. Dies ist wesentlich schneller als eine Sinus Funktion aufzurufen (die intern möglicherweise etwas ähnliches macht).
Die erste Annäherung an sin(x) ist schlicht f(x)=x. Wie man sofort erkennt, ist das eine ziemlich schlechte Sinus-Näherung:
- Sie ist nicht „rund“
- Sie ist nicht periodisch
- Sie hat eine zu große Abweichung zur Sinus Funktion
Einziger Vorteil ist, dass die Ableitung an der Stelle 0 ebenso wie der Funktionswert selbst exakt der Sinus Funktion entsprechen:
- f(x)=x1
- f'(x)=1
- x*0=0, sin(0)=0
- 1=sin'(0)=cos(x)
Die nächstbeste Taylor Approximation ist f(x) = x – x3 / 6
Diese Funktion hat die notwendigen „Rundungen“ und Symmetrien:

Auch diese Funktion ist nach links und rechts offen. Die Funktionswerte passen bei dieser Taylor Funktion nicht, wir wollen von -1..1 gehen. Hier bietet sich eine leicht abgewandelte Form an:


Die Kurve schneidet die Punkte (0,0) und (1,1) sowie (-1,-1). Dies ist leichter handzuhaben als π/2. Wie sich herausstellt, liegt die absolute Abweichung bei nur +-2% bzw. dem Wert +-0.02 gegenüber der Funktion sin(x*π/2). Wir können eigentlich nur den mittleren Teil gebrauchen von -1..1, dann wird die Abweichung zu groß:

Was ebenso zu bemerken ist: Die Funktion ist punktsymmetrisch zum Ursprung. An den Rändern -1 und 1 ist die Steigung (1. Ableitung) jeweils 0, das heißt sie ist kontinuierlich. Ebenso ist die Krümmung (2. Ableitung) kontinuierlich, die Kurve hat keine „Knicke“:

Die Abbildung zeigt die approximierte Sinusschwingung. Dabei wird die obengenannte Funktion im Bereich -1..1 einmal gespiegelt wiederholt, woraus sich ein kompletter Cosinus Schwingungszug ergibt.
Man kann sich vorstellen, diese Schwingung als Oszillator oder LFO zu verwenden. Aufgrund der Ungenauigkeit von 4% ergeben sich jedoch Oberschwingungen, die in man in Kauf nehmen muss. Alternativ kann man eine Stufe höher gehen und eine Approximation 5. Grades berechnen, um die Genauigkeit weiter zu erhöhen.