Ich möchte berechnen y(n)=32677Sin(45/1024•n)
, wo y
eine Ganzzahl ist und n
zwischen 0 und 2048 liegt. Wie kann ich diesen Prozess schneller und genauer machen? Jetzt möchte ich Ihnen eine Referenzantwort zeigen: Seit Sin(a+b)=Sin(a)Cos(b)+Cos(a)Sin(b)
Und Cos(a+b)=Cos(a)Cos(b)-Sin(a)Cos(b)
. So kann ich speichern Sin(45/1024•1)
und nur. Cos(45/1024•1)
Dann verwenden Sie diese Formel:
Sin(45/1024•2)=Sin(45/1024•1+45/1024•1)
,
Cos(45/1024•2)=Cos(45/1024•1+45/1024•1)
,
Sin(45/1024•n)=Sin(45/1024•(n-1)+45/1024•1)
,
Cos(45/1024•n)=Cos(45/1024•(n-1)+45/1024•1)
, Auf diese Weise vielleicht schneller ohne großen Array zu speichern.
c++
algorithms
LaiJong
quelle
quelle
sin(x)
wox
in Grad ist. Wenn dies der Fall ist, müssen Sie sich bewusst sein, dass das Argument für die Triggerfunktionen normalerweise im Bogenmaß lautet. Das Argument ist in C ++ im Bogenmaß angegeben. So wird diese Frage markiert.Antworten:
Wenn der
n
Bereich zwischen 0 und 2048 liegt, können Sie die Werte vorberechnen und dann in einem Array speichern.y(n)
würde werdenvalues[n]
.quelle
fsin
verwendet werden und sind cachefreundlicher als einige Arrays).Berechnen Sie die Tabelle zur Kompilierungszeit anstelle der Laufzeit.
Sie erstellen eine Tabelle mit 2048 Elementen mit skalierten 16-Bit-Ganzzahlwerten.
Schreiben Sie ein billiges Matlab-Skript mit einem Ausdruck, der eine Datenzeile enthält, die für Ihre endgültige Programmiersprache geeignet ist. Schneiden Sie das Ergebnis als konstante Datentabelle aus und fügen Sie es in Ihren Quellcode ein. Führen Sie zur Laufzeit eine Tabellensuche durch. Dadurch wird die anfängliche Rechenzeit anstelle der Programmstartzeit in den Erstellungszyklus verschoben.
quelle
In Anbetracht der Form der Funktion ist die natürliche Antwort der CORDIC-Algorithmus . Es ist ein viel saubererer Ansatz als die Aufschlüsselung der Frage. Andererseits ist der benötigte Tisch viel, viel kleiner als der Tisch, den andere vorgeschlagen haben.
quelle