function eval_cordic(Nmax, doplot)
N = 100;

arctan_tbl = (atan(2.^-(0:N-1))/pi)'
%gain_tbl = (1./cumprod(sqrt(1+2.^-(2*(0:N-1)))))'

% Rotation mode
disp('Rotation:')
for i=1:N,
    phi(i) = 2*pi*(i-N/2)/N;
    [x(i),y(i)] = cordic_rot(0, 1, phi(i), Nmax, 0);
end;
close all;
figure
plot(1:N, x, 1:N, y);
legend('x','y')
grid;

% Vector mode
disp('Magnitude and phase:')
for i=1:N,
    [mag(i), phi(i)] = cordic_vec(x(i), y(i), Nmax, 0);
end;
figure
plot(1:N, mag, 1:N, phi);
legend('Magnitude','Phase')
grid;


% ------------------------------------------------------------
function [mag, phi] = cordic_cart2polar(x, y, Nmax, doplot)
    [mag, phi] = cordic_vec(x, y, Nmax, doplot);
  
% ------------------------------------------------------------
function [x, y] = cordic_polar2cart(mag, phi, Nmax, doplot)
    [mag, phi] = cordic_vec(x, y, Nmax, doplot);
  
% ------------------------------------------------------------
function [xout, yout] = cordic_rot(xin, yin, phi, N, doplot)

    % Initialize
    arctan_tbl = atan(2.^-(0:N-1));
    gain_tbl = 1./cumprod(sqrt(1+2.^-(2*(0:N-1))));

    coeffs = arctan_tbl';
    gains = gain_tbl';

    % Calculate initial rotation
    if (phi < (-pi/2))
        z = phi + pi;
        x = -xin;
        y = -yin;
    else
        if (phi > pi/2)
            z = phi - pi;
            x = -xin;
            y = -yin;
        else
            x = xin;
            y = yin;
            z = phi;
        end;
    end;

    % Loop
    for i=1:N,
        xi(i) = x;
        yi(i) = y;
        zi(i) = z;
    
        S = 2^(-(i-1));
        if (z < 0)
			t = x + y*S;
			y = y - x*S;
			z = z + arctan_tbl(i);
			x = t;
        else
			t = x - y*S;
			y = y + x*S;
			z = z - arctan_tbl(i);
			x = t;
        end;
        
    end;

    % Result
    k = gain_tbl(i);
    xout = k*x;
    yout = k*y;

    % Output
    if(doplot)
        close all;
        figure(1);
        plot(1:N, xi, 1:N, yi, 1:N, zi)
        legend('x','y','z');
        title('Convergence');
        grid;

        figure(2);
        plot(xi.*gain_tbl, yi.*gain_tbl, '-x')
        title('Polar plot');
        grid;
    end;

% ------------------------------------------------------------
function [mag, phi] = cordic_vec(xin, yin, N, doplot)

    % Initialize
    arctan_tbl = atan(2.^-(0:N-1));
    gain_tbl = 1./cumprod(sqrt(1+2.^-(2*(0:N-1))));

    coeffs = arctan_tbl';
    gains = gain_tbl';
    
    % Calculate initial rotation
    if (xin < 0)
        x = -xin;
        y = -yin;
        if (yin < 0)
            z = -pi;
        else
            z = pi;
        end;
    else
        x = xin;
        y = yin;
        z = 0;
    end;
  
    % Loop
    for i=1:N,
        xi(i) = x;
        yi(i) = y;
        zi(i) = z;
    
        S = 2^(-(i-1));
        if (y < 0)
			t = x - y*S;
			y = y + x*S;
			z = z - arctan_tbl(i);
			x = t;
        else
			t = x + y*S;
			y = y - x*S;
			z = z + arctan_tbl(i);
			x = t;
        end;
        
    end;

    % Result
    k = gain_tbl(i);
    mag = k*x;
    phi = z;
    
    % Output
    if(doplot)
        close all;
        figure(1);
        plot(1:N, xi, 1:N, yi, 1:N, zi)
        legend('x','y','z');
        title('Convergence');
        grid;

        figure(2);
        plot(xi.*gain_tbl, yi.*gain_tbl, '-x')
        title('Polar plot');
        grid;
    end;
    