Teil 1: extrem schnelle Sinus Funktion
Original: http://music.columbia.edu/pipermail/musi…ber/046673.html
Die Funktion f=X^2 ergibt eine Parabel; das kann man nützen, um näherungsweise eine Sinuskurve zu berechnen.
Der ASM-Code dazu ist sehr kurz und sieht so aus:
Aufgerufen wird der Code mit folgender Funktion:
Func _Sin($fX)
Local $aResult = DllCallAddress("int", $pASM_Sin, "uint", $fX * 2 ^ 31 / $cPI)
Return $aResult[0] / -2 ^ 31
EndFunc ;==>_Sin
Das TestScript dazu ergibt dieses Bild:
SinCos_1.au3
SinCos_1.png
Sieht schon ganz OK aus! Allerdings nicht ganz...
Wenn man damit einen Kreis zeichnen möchte sieht man besser, dass eine Parabel doch keine Sinuskurve ist:
SinCos_4.au3
SinCos_4.png
Es geht natürlich noch besser, um nicht zu sagen: Fast perfekt!
SinCos_2.au3
SinCos_2.png
Nun wollen wir testen, wie schnell die Funktionen im Vergleich zu der Sinusberechnung der FPU ist.
Dieses Script erzeugt eine Wav-Datei von mehreren Sekunden in den 3 Varianten FPU, Parabel, und "Fast Perfekt":
SinCos_3.au3
Wir sehen, dass die ASM-Versionen 10x schneller sind, als die Berechnung der FPU!
Weiters kann man hören, dass die Parabel-Version harmonische Obertöne erzeugt, siehe FFT-Analyse im nächsten Post!
Fazit: Die ParabelVersion ist am schnellsten, jedoch sehr ungenau. Das reicht etwa für Animationen, aber nicht für Sound. (Außer man kann mit den harmonischen Obertönen leben)
Die Version "Fast Perfekt" ist wirklich nahezu perfekt! Nur ein einziger Oberton mit -70dB, das ist zu vernachlässigen. Der Geschwindigkeitsvorteil ist wirklich enorm!
Nachteil bei beiden Versionen ist, dass man etwas tricksen muss, um am Ende das gewünschte Ergebnis zu erhalten. Das kann aber auch ein Vorteil sein: Siehe SinCos_3.au3: Bei der Variable $fPhaseInc kann man PI komplett wegkürzen.