Trigonometrische Funktionen auf dem eingebetteten System

9

sin und cos Funktionen sind langsam und benötigen eine Menge Ressourcen, um auf eingebetteten Systemen zu laufen. Wie berechnet man sin und cos ressourcenschonender und schneller?

    
starblue 15.10.2009, 10:23
quelle

11 Antworten

16

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

    
pavium 15.10.2009 10:26
quelle
10

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.

    
Noldorin 15.10.2009 10:35
quelle
4

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?

    
Artelius 15.10.2009 10:29
quelle
3

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.

    
Clifford 15.10.2009 16:01
quelle
2
  1. Lookup-Tabellen
  2. Taylor-Serie , wie du sagst

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.

    
unwind 15.10.2009 10:27
quelle
2

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.

    
John D. Cook 15.10.2009 11:57
quelle
0

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.

    
Adam Matan 15.10.2009 10:26
quelle
0

In einigen Fällen kann man mit nur einem IIR-Filter zurechtkommen, der auf die benötigte Frequenz abgestimmt ist. Schau hier: Ссылка

    
Mtr 06.01.2010 20:14
quelle
0

Dies könnte hilfreich / inspirierend sein: Magische Quadratwurzel in Quake III

    
John U 22.06.2012 18:26
quelle
0

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:

  • Nachschlagetabellengenerator tablegen (in Java geschrieben, aber das spielt keine große Rolle), der mehrere Optionen erhält und C-Code erzeugt (const struct mit Nachschlagetabelle)
  • Kleines C-Modul, das mit einer Lookup-Tabelle arbeitet, die von 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:

  • Faktor, mit dem jedes Element in der Nachschlagetabelle multipliziert wird (pro Tabelle);
  • Schritt in Grad zwischen jedem Element in der Tabelle (auf Tabellenbasis); Art der Elemente in der Tabelle (gemeinsam für das gesamte C-Projekt).

Sie können also je nach Ihren Bedürfnissen:

  • Generieren Sie eine einzelne Tabelle für die gesamte Anwendung mit maximalem Faktor, so dass jedes Subsystem Ihres C-Projekts diese einzelne Tabelle verwenden kann, wobei der gewünschte Faktor bereitgestellt wird, und wird neu berechnet, wenn der angeforderte Faktor ein anderer ist als der der Tabelle;
  • Generieren Sie mehrere Tabellen mit jeweils einem Ad-hoc-Faktor, und jedes Subsystem Ihres C-Projekts verwendet seine dedizierte Tabelle. Dann können Werte aus der Tabelle ohne Neuberechnung zurückgegeben werden. das funktioniert schneller.

Ich benutze es in meinen eingebetteten Projekten, es funktioniert gut.

    
Dmitry Frank 23.03.2015 09:59
quelle
0

Sie können sich diese willkürliche Fixed-Point-Bibliothek für 8-Bit-AVR-Mikrocontroller ansehen:   Ссылка

BEARBEITEN: Verknüpfung aktualisiert

    
avra 25.06.2012 12:47
quelle

Tags und Links