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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von steverino (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
3 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Du musst die Symmetrien, Phasenverschiebungen und die Periode ausnutzen.

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

von berndl (Gast)


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

von steverino (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [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 Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.