cos und sin mit Cordic für alle Quadranten

Gast #4974794
Guten Tag!

Ich bin dabei einen cordic zu implementieren um cos und sin zu 
berechnen, doch verstehe ich nicht wie ich das für alle Quadranten 
machen soll.

Hier im Forum habe ich bereits gesucht, doch kann mit den 
Lösungsansätzen nichts anfangen.

Als Anfangswerte verwende ich x = 1 und y = 0. Muss ich diese für einen 
anderen anderen Quadranten anpassen? Oder muss ich doch den 
Eingangswinkel anpassen?

Vielen Dank im voraus,
steverino
Gast
Das sind aber Grundlagen der Mathematik: Sowohl Sinus als auch Cosinus 
und die daraus abgeleiteten Funktionen sind symmetrisch zur Achse. Damit 
kann man sowohl spiegeln als auch drehen!
Hi

Du brauchst nur 90° einer der beiden Funktionen, z.B. SIN,
Von 90 bis 180 sind die Werte 'rückwärts',
Von 180-270 wieder 'vorwärts', aber negativ,
von 270 bis 360 wieder rückwärts, ebenfalls negativ.

So konnte man schon auf langsamsten PCs unter Basic in einer 
affenartigen Geschwindigkeit Kreise auf den Bildschirm plotten.

MfG
Gast
Patrick J. schrieb:
> Du brauchst nur 90° einer der beiden Funktionen, z.B. SIN,
> Von 90 bis 180 sind die Werte 'rückwärts',
> Von 180-270 wieder 'vorwärts', aber negativ,
> von 270 bis 360 wieder rückwärts, ebenfalls negativ.

Das Problem ist, dass ich nicht weiß wie ich das für den cordic 
einsetzen soll.

SO wie ich das verstanden habe beginne ich bei einem Startwert von x = 1 
und y = 0. das sind die Koordinaten vom Winkel 0°.
Von dort aus werden Winkel entweder addiert oder subtrahiert bis man zu 
dem gewünschten Ergebnis kommt.

Das geht aber nur in einem Bereich von +90° bis -90°. Was soll ich jetzt 
machen um den restlichen Bereich abzudecken?
Gast
Die Antworten fallen meiner Meinung nach alle unter
steverino schrieb:
> Oder muss ich doch den Eingangswinkel anpassen?

Das geht für jede Funktion und jeden Quadranten.
Zum Beispiel kannst du einen Winkel im zweiten Quadranten in den ersten 
bringen durch 180-a (a: Winkel)
sin(140)=sin(180-140)=sin(40). Das liegt im ersten Quadranten.
Du musst also für jede Winkelfunktion vier Fallunterscheidungen machen 
und dann den Winkel im ersten Quadranten in den CORDIC eingeben.
Gast
Dussel schrieb:
> Das geht für jede Funktion und jeden Quadranten.
> Zum Beispiel kannst du einen Winkel im zweiten Quadranten in den ersten
> bringen durch 180-a (a: Winkel)
> sin(140)=sin(180-140)=sin(40). Das liegt im ersten Quadranten.
> Du musst also für jede Winkelfunktion vier Fallunterscheidungen machen
> und dann den Winkel im ersten Quadranten in den CORDIC eingeben.

Vielen Dank für die Hilfe. Werde den Eingangswinkel anpassen.
Gast
steverino schrieb:
> Vielen Dank für die Hilfe.
Die Frage war ordentlich gestellt, da helfe ich doch gerne, wenn ich 
kann.
Dazu aber noch ein Nachtrag:
Ich will nicht ausschließen, dass man mit CORDIC auch Winkel in anderen 
Quadranten berechnen kann, zum Beispiel X=0, Y=1 für den zweiten 
Quadranten. Aber wenn, wäre da wohl auch eine Fallunterscheidung nötig.
Gast
steverino schrieb:
> Ich bin dabei einen cordic zu implementieren um cos und sin zu
> berechnen,

Schreibe doch um himmelswillen zu allererst, WOFÜR das Ganze gut sein 
soll. Als nächstes solltest du dich dazu durchringen, als WAS deine 
Winkel denn so vorliegen. Also im Bogenmaß oder Grad oder Neugrad oder 
Artillerie-Strich oder was?
Dann sollte folgen, auf wieviel Bit dein Sinus und Cosinus denn 
berechnet werden soll. Normalerweise braucht man für den Cordic (so man 
es sinnvoll anstellt) nämlich nicht eine Stufe pro Bit, sondern nur etwa 
0.4 Stufen pro Bit - oder anders ausgedrückt für 24 Bit Ergebnis 
brauchst du nur 8..9 Drehungen, wenn du den Restwinkel skalierst und so 
ans Ergebnis dranhängst. Du brauchst für's Skalieren ja bloß ne 
Konstante, die aus dem Produkt aller möglichen 1/cos(dx) besteht. Ich 
glaub, die war so etwa 1/1.6nochwas. Das führt zwar eine Multiplikation 
ein, spart aber zugleich 15..16 Drehungen.

Ich würde dir sehr empfehlen, deine Winkel auf 4 skaliert zu benutzen, 
das heißt, der Vollkreis entspricht 4.000. Damit hast du als ganzen Teil 
die Quadranten und als gebrochenen Teil die Winkel innerhalb des nullten 
Quadranten, vulgo 0..90°.

W.S.
(Firma: www.dossmatik.de)
Dussel schrieb:
> steverino schrieb:
>> Vielen Dank für die Hilfe.
> Die Frage war ordentlich gestellt, da helfe ich doch gerne, wenn ich
> kann.
> Dazu aber noch ein Nachtrag:
> Ich will nicht ausschließen, dass man mit CORDIC auch Winkel in anderen
> Quadranten berechnen kann, zum Beispiel X=0, Y=1 für den zweiten
> Quadranten. Aber wenn, wäre da wohl auch eine Fallunterscheidung nötig.

Nein keine Fallunterscheidung aus mathematischen Gründen nötig.

Cordic ist ein Verfahren mit dem man von einem beliebigen Startpunkt zu 
jedem Zielpunkt kommt.

Es gibt ein paar Dinge zu beachten. Das erste ist die maximale 
Schrittweite.
Um nicht mit vielen Schritten entlang der Kurze zu "rutschen" macht man 
im Angortimus eine Fallunterscheidung um von einem Startpunkt nahe des 
Ziels zu starten. Die meisten Implementierungen haben eine Entscheidung 
Rechte oder Linke Hälfte des Einheitskreises.

rechte Hälfte ist der Startpunkt 0°
linke Hälfte ist der Startpunkt 180°

Von dem Startpunkt werden die Schritte so gewählt dass sich 90° vorwärts 
und 90° rückwärts bewegt werden kann.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.