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
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
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?
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.
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.
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.
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.
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.