Festpunkttrigonometrie für eingebettete Anwendungen

9

Ich muss Rotationstransformationen (und andere) in einer eingebetteten Anwendung durchführen, wobei die Funktionen sin () cos () und tan () erforderlich sind. Ich weiß, dass Sie Nachschlagetabellen verwenden können, und das ist die einzige Lösung, die ich für meine eigenen Recherchen finden könnte. Aber gibt es da draußen eine gute Triggerbibliothek für feste Punkte?

Ich denke darüber nach, einen Cortex M3 für die Anwendung zu verwenden, daher möchte ich mich so weit wie möglich vom Gleitkomma fernhalten, um die Anwendungen flink zu halten.

Bob
quelle
Zwei Gedanken: Eine traditionelle primitive Implementierung der Rotation ist der CORDIC-Algorithmus. Möglicherweise sehen Sie auch, ob Ihr Anbieter jetzt einen Cortex M4 anbietet, der mit dem von Ihnen in Betracht gezogenen M3 konkurrenzfähig ist.
Chris Stratton
4
Warum möchten Sie keine Nachschlagetabellen verwenden? Das funktioniert sehr gut für Sünde und Cos. Sin und cos algorithmisch zu machen wird länger dauern. Der einzige Vorteil ist möglicherweise, dass weniger Programmspeicher verwendet wird. Aber ist das in Ihrer Anwendung wirklich wichtig?
Olin Lathrop
@OlinLathrop, ich möchte wissen, was andere gefunden haben: Vielleicht gibt es eine effiziente Möglichkeit, das Problem schnell und fehlerfrei zu lösen und gleichzeitig Speicherplatz zu sparen, die ich nicht gefunden habe? Soweit ich weiß (und ich könnte mich irren), besteht das größte Problem bei der algorithmischen Lösung mit den Standardbibliotheken darin, dass die gesamte Mathematik in Gleitkomma erfolgt und ohne FPU alles numerisch ausgeführt werden muss, was schrecklich ineffizient ist. .. Das größte Problem bei Nachschlagetabellen ist: Wie genau muss ich sein? Und wenn sich diese Genauigkeitsanforderung ändert, habe ich dann noch genügend Programmspeicher?
Bob
Wie genau brauchen Sie? Eine bescheidene Größe von Nachschlagetabellen ist für die meisten eingebetteten sin / cos-Anforderungen völlig ausreichend. Mit 1025 Tabelleneinträgen erhalten Sie eine Winkelauflösung von 4096. Zu diesem Zeitpunkt erhalten Sie durch lineare Interoplation eine gute Genauigkeit zwischen Tabelleneinträgen. Es scheint viele falsche Mythen über die Sinus-Suche zu geben. Weitere Informationen finden Sie in meiner Antwort unter electronic.stackexchange.com/a/16516/4512 .
Olin Lathrop
Ich höre, was Sie sagen, und ich verstehe die Idee der Nachschlagetabelle für die Sinusfunktion, aber wenn ich Code-begrenzt bin (Projekte füllen immer den Code-Raum), gibt es eine kompaktere Möglichkeit, damit umzugehen? Deshalb habe ich gefragt: Es gibt viele talentierte Leute, die Beiträge leisten, und ich würde gerne wissen, ob sie etwas Besseres gefunden haben.
Bob

Antworten:

6

Ein guter Ansatz für die Trigonometrie in eingebetteten Anwendungen ist die Verwendung von Polynomnäherungen an die von Ihnen benötigten Funktionen. Der Code ist kompakt, die Daten bestehen aus wenigen Koeffizienten, und die einzigen erforderlichen Operationen sind Multiplizieren und Addieren / Subtrahieren. Viele eingebettete Systeme verfügen über Hardware-Multiplikatoren, die eine gute Leistung bieten.

Dave Tweed
quelle
1
Hat jemand eine Version davon in C veröffentlicht, die für eingebettete Anwendungen optimiert ist, die keine Gleitkommaanweisungen verwenden? Der hohe Fehler auf beiden Seiten der Polynomnäherung bietet sich an, Tricks zu verwenden, um verschiedene Polynome für verschiedene Segmente zu verwenden, um Fehler zu reduzieren, oder einen anderen Trick ...
Bob
1
Generisches C unterstützt keine nicht ganzzahligen Festkomma-Datentypen und -Operationen direkt, sodass Optimierungen für diesen Datentyp in der Regel ziemlich plattformspezifisch sind. Beispielsweise unterstützen die meisten DSPs einen Festkomma-Bruchdatentyp direkt in ihrer Hardware. Von C aus greifen Sie über proprietäre Bibliotheken darauf zu.
Dave Tweed
Generisches C wird durch den Datentyp _Fract unterstützt, aber die meisten Mikrocontroller-Implementierungen verfügen über herstellerspezifische Bibliotheken. Ich benutze libmathq15 für alle meine Festkomma-Anforderungen. Hat den Job bisher gemacht.
leicht
_Fractist meiner Meinung nach ein Stück Mist; Ich hasse die Tatsache, dass es vom C-Komitee "standardisiert" wurde. Es zwingt Sie, Q15 oder Q31 für alles zu verwenden, was in vielen Situationen nicht sinnvoll ist, und lässt Sie in diesen Situationen ohne Hilfe festsitzen.
Jason S
3

Sind Sie dagegen, die Fixpunkt-Cortex-Bibliotheken dafür zu verwenden?

q31_t arm_sin_q31 (q31_t x)
Schnelle Annäherung an die trigonometrische Sinusfunktion für Q31-Daten.

von:

CMSIS-DSP: DSP-Bibliothekssammlung mit über 60 Funktionen für verschiedene Datentypen: Fixpunkt (gebrochenes q7, q15, q31) und Gleitkomma mit einfacher Genauigkeit (32-Bit). Die Bibliothek ist für Cortex-M0, Cortex-M3 und Cortex-M4 verfügbar .

Es verwendet eine Nachschlagetabelle mit quadratischer Interpolation, ist aber ziemlich schnell. Sie können es an die lineare Interpolation anpassen, um eine schnellere Geschwindigkeit, aber mehr Fehler zu erzielen.

Beachten Sie auch, dass selbst Cortex M4 nicht unbedingt über eine FPU verfügt. Ich habe gesehen, dass sie "M4F" heißen, wenn sie es tun.

Endolith
quelle