Forum: FPGA, VHDL & Co. cos und sin mit Cordic für alle Quadranten


von steverino (Gast)


Lesenswert?

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

von S. K. (Gast)


Lesenswert?

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!

von Lutz H. (luhe)


Lesenswert?

steverino schrieb:
> Als Anfangswerte verwende ich x = 1 und y = 0

was ist x, was ist y?

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

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

von steverino (Gast)


Lesenswert?

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?

von Dussel (Gast)


Lesenswert?

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.

von Dirk B. (dirkb2)


Lesenswert?

Du musst die Symmetrien, Phasenverschiebungen und die Periode ausnutzen.

https://de.wikipedia.org/wiki/Formelsammlung_Trigonometrie#Symmetrien

von berndl (Gast)


Lesenswert?

lies das mal komplett durch:
Beitrag "CORDIC in VHDL"
Wurde hier schon lang und breit durchdiskutiert...

von steverino (Gast)


Lesenswert?

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.

von Dussel (Gast)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.