Um eine Taylor oder Fourier Serie wird immer zeitaufwendig sein.
In einem eingebetteten System sollten Sie über Nachschlagetabellen nachdenken.
Es könnte auch interessante Informationen darüber geben, wie Hewlett-Packard solche Berechnungen in ihren frühen wissenschaftlichen Taschenrechnern optimiert hat.
Ich erinnere mich, dass ich solche Sachen zu der Zeit gesehen habe
Eine Nachschlagetabelle mit Interpolation wäre ohne Zweifel die effizienteste Lösung. Wenn Sie jedoch weniger Speicher verwenden möchten, ist CORDIC ein ziemlich effizienter Algorithmus zum Berechnen von Werten von trigonometrischen Funktionen und wird häufig implementiert in Taschenrechnern.
Als einen Nebenpunkt macht es keinen Sinn, diese Funktionen mit Fourier-Reihen darzustellen, da Sie nur ein zirkuläres Problem erstellen, wie Sie dann die Sin / Cos-Terme von Reihen auswerten. Eine Taylor-Reihe ist eine wohlbekannte Näherungsmethode, aber der Fehler erweist sich in vielen Fällen als unannehmbar groß.
Vielleicht möchten Sie auch diese Frage und ihre Antworten lesen, in Bezug auf schnelle trigonometrische Funktionen für Java (somit könnte der Code leicht portiert werden). Es erwähnt unter anderem sowohl die CORDIC- als auch die Tschebyschew-Näherung. Einer von ihnen wird zweifellos Ihren Bedürfnissen entsprechen.
Hängt davon ab, wofür Sie es brauchen. Wenn Sie nicht sehr auf Ihre Winkelgenauigkeit achten (z. B. wenn der nächstliegende Grad OK ist), verwenden Sie einfach eine Nachschlagetabelle mit Werten. Wenn Sie keine FPU haben, arbeiten Sie im Fixpunkt .
Eine einfache Methode zur Berechnung von sin / cos-Funktionen besteht in der Taylor-Reihe (wie unter Trigonometrische Funktionen hier gezeigt) ). Je weniger Begriffe Sie verwenden, desto ungenauer sind die Werte, desto schneller sind die Berechnungen.
Fourier-Reihenberechnungen erfordern, dass einige sin / cos-Werte bekannt sind. Wenn Sie jedoch die meiste Zeit in der Frequenzdomäne speichern, können Sie möglicherweise Berechnungen speichern - je nachdem, was sie sind Machst du das?
Dieser Artikel von Dr. Dobb: Math-intensive Anwendungen mit Festkommaarithmetik optimieren hat eine gute Erklärung der CORDIC-Algorithmen und stellt vollständigen Quellcode für die Bibliothek bereit, die in dem Artikel beschrieben wird.
Beachten Sie, dass Sie bei Lookup-Tabellen oft Dinge optimieren können, indem Sie die Domain z. Stellen Sie den Winkel als vorzeichenloses Zeichen dar und geben Sie nur 256 Schritte um den Kreis, aber auch eine sehr kompakte Tabelle. Ähnliche Dinge können mit dem Wert gemacht werden, wie mit Fixed-Point.
Siehe die Stapelüberlauf-Frage Wie funktionieren die trigonometrischen Funktionen? Die dort angenommene Antwort erklärt einige Details zur Entfernungsreduktion, dann CORDIC und dann weitere Optimierungen.
Es scheint ein schönes Pseudocode-Beispiel zu geben hier und expliziter Code hier .
Wie von @unwind vorgeschlagen, sollten Sie jedoch versuchen, diese Tabellen auf einem vernünftigen Computer vorzurechnen und die Tabellen auf das eingebettete Gerät zu laden.
Wenn Ihre Antwort nicht sehr genau sein muss, ist die Nachschlagetabelle eher klein und Sie können sie im Speicher Ihres Geräts speichern. Wenn Sie eine höhere Genauigkeit benötigen, müssen Sie diese im Gerät berechnen. Es ist ein Kompromiss zwischen Speicher, Zeit und erforderlicher Präzision; Die Antwort hängt von der spezifischen Art Ihres Projekts ab.
Dies könnte hilfreich / inspirierend sein: Magische Quadratwurzel in Quake III
Ich bin ein bisschen zu spät zur Party, aber trotzdem möchte ich eine vorgefertigte effiziente Lösung teilen, die eine Nachschlagetabelle verwendet (Tabellengenerator inbegriffen): DFTrig .
DFTrig besteht aus zwei Teilen:
tablegen
(in Java geschrieben, aber das spielt keine große Rolle), der mehrere Optionen erhält und C-Code erzeugt (const struct mit Nachschlagetabelle) tablegen
generiert wurde. Natürlich enthält die Nachschlagetabelle nur minimale Informationen: Sinuswerte für nur einen einzelnen Quadranten, d.h. [0, 90]
Grad. Das ist ziemlich genug, um Sinus / Cosinus für jeden Winkel zu berechnen.
Das Verhalten ist ziemlich anpassbar. Sie können Folgendes angeben:
Sie können also je nach Ihren Bedürfnissen:
Ich benutze es in meinen eingebetteten Projekten, es funktioniert gut.
Tags und Links c math embedded trigonometry