Frage von KesselwagenUsermod, 24

Warum funktioniert meine CORDIC-Implementierung nicht?

Hallo,

ich versuche gerade einfach ganz stur und noch erstmal ohne Rücksicht auf Effizienz den CORDIC-Algorithmus zur Berechnung von sin und cos im Rotation-Modus in C zu implementieren.

Mein Code:

#include <stdio.h>
#include <math.h>

int main(int argc, const char * argv[]) {
    // Startwerte
    double xrp = 1;
    double yrp = 0;
    
    double winkel = 12;
    int iterations = 20;
    
    for(int i = 1; i < iterations; i++){
        double sigma;
        if(atan(yrp / xrp) > winkel) sigma = -1;
        else sigma = 1;
        // Wenn neuer Winkel größer als der gesuchte Winkel, dann setze sigma = -1
        
        double xrpb = xrp; // x_(n-1) sichern

        // Gemäß Formel x_n und y_n berechnen
        xrp = (1 / sqrt(1 + pow(2, -2 * i))) * (xrp - (sigma * pow(2, -i) * yrp));
        yrp = (1 / sqrt(1 + pow(2, -2 * i))) * (yrp + (sigma * pow(2, -i) * xrpb));
        
        // Ausgeben
        printf("x%d = %.20f \ny%d = %.20f\nsigma = %.0f\n", i, xrp, i, yrp, sigma);
    }
}

Warum funktioniert mein Code nicht bzw warum konvergiert es nicht gegen den gesuchten Winkel? Denke es hat mit dem Startwert und mit den Indizes zu tun, aber ich sitz seit ner Stunde dran und weiß nicht wo welcher Index falsch ein könnte. Wäre toll, wenn mir jemand helfen könnte :S

Hier der Algorithmus auf Wikipedia: https://en.wikipedia.org/wiki/CORDIC

Habe nur die Formeln für v_i Berechnung genommen.

Vielen vielen Dank im Voraus!

LG. Kesselwagen

Antwort
von ralphdieter, 13
double winkel = 12;

Der Algorithmus konvergiert wohl nur für |winkel| < π.

Kommentar von Kesselwagen ,

Joa danke für Deine Antwort.

Liegt wohl daran, dass C-atan rad-Werte ausgibt und mein Winkel und der Rest in deg angegeben war. Doofer Fehler. Ist nun behoben und funktioniert einwandfrei 

Keine passende Antwort gefunden?

Fragen Sie die Community