[WIP] Breaking Change - Use Update
Folder name is changed, rework the html templates Change the organisation.
							
								
								
									
										152
									
								
								spindle/Macros_ttt_spindle/Dual_Spindle_error.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,152 @@
 | 
			
		||||
function [Res] = Dual_Spindle_error(dataX, dataY, NbTurn,texte, path)
 | 
			
		||||
    L= length(dataX);
 | 
			
		||||
    res_per_rev = L/NbTurn;
 | 
			
		||||
    P = 0: (res_per_rev * NbTurn)-1;
 | 
			
		||||
    Pos =  P' * 360/res_per_rev;
 | 
			
		||||
    Theta = degtorad(Pos)';
 | 
			
		||||
 | 
			
		||||
    x1 = myfit2(Pos, dataX);
 | 
			
		||||
    y1 = myfit2(Pos, dataY);
 | 
			
		||||
 | 
			
		||||
    %Convert data to frequency domain and scale accordingly
 | 
			
		||||
    X2 = 2/(res_per_rev*NbTurn)*fft(x1);
 | 
			
		||||
    f2 = (0:L-1)./NbTurn;
 | 
			
		||||
    Y2 = 2/(res_per_rev*NbTurn)*fft(y1);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    % Separate the fft integers and not-integers
 | 
			
		||||
    for i = 1 : length(f2)
 | 
			
		||||
        if mod(f2(i), 1) == 0;
 | 
			
		||||
            X2dec(i)= 0;
 | 
			
		||||
            X2int(i)= X2(i);
 | 
			
		||||
            Y2dec(i)= 0;
 | 
			
		||||
            Y2int(i)= Y2(i);
 | 
			
		||||
        else
 | 
			
		||||
            X2dec(i)= X2(i);
 | 
			
		||||
            X2int(i)= 0;
 | 
			
		||||
            Y2dec(i)= Y2(i);
 | 
			
		||||
            Y2int(i)= 0;
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if mod(length(f2),2) ==1; % Case length(f2) is odd -> the mirror image of the FFT is reflected between 2 harmonique
 | 
			
		||||
        for i = length(f2)/2 +1.5: length(f2)
 | 
			
		||||
            if mod(f2(i-1), 1) == 0;
 | 
			
		||||
                X2dec(i)= 0;
 | 
			
		||||
                X2int(i)= X2(i);
 | 
			
		||||
                Y2dec(i)= 0;
 | 
			
		||||
                Y2int(i)= Y2(i);
 | 
			
		||||
            else
 | 
			
		||||
                X2dec(i)= X2(i);
 | 
			
		||||
                X2int(i)= 0;
 | 
			
		||||
                Y2dec(i)= Y2(i);
 | 
			
		||||
                Y2int(i)= 0;
 | 
			
		||||
            end
 | 
			
		||||
        end
 | 
			
		||||
    else % Case length(f2) is even -> the mirror image of the FFT is reflected at the Nyquist frequency
 | 
			
		||||
        for i = length(f2)/2 +1: length(f2)
 | 
			
		||||
            if mod(f2(i), 1) == 0;
 | 
			
		||||
                X2dec(i)= 0;
 | 
			
		||||
                X2int(i)= X2(i);
 | 
			
		||||
                Y2dec(i)= 0;
 | 
			
		||||
                Y2int(i)= Y2(i);
 | 
			
		||||
            else
 | 
			
		||||
                X2dec(i)= X2(i);
 | 
			
		||||
                X2int(i)= 0;
 | 
			
		||||
                Y2dec(i)= Y2(i);
 | 
			
		||||
                Y2int(i)= 0;
 | 
			
		||||
            end
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    X2int(1) = 0; %remove the data average/dc component
 | 
			
		||||
    X2int(NbTurn+1) = 0; %Remove fondamental/eccentricity
 | 
			
		||||
    %  X2int(length(f2)) = 0; %remove the data average/dc component
 | 
			
		||||
    X2int(length(f2)-NbTurn+1) = 0; %Remove eccentricity
 | 
			
		||||
 | 
			
		||||
    Y2int(1) = 0; %remove the data average/dc component
 | 
			
		||||
    Y2int(NbTurn+1) = 0; %Remove fondamental/eccentricity
 | 
			
		||||
    %  Y2int(length(f2)) = 0; %remove the data average/dc component
 | 
			
		||||
    Y2int(length(f2)-NbTurn+1) = 0; %Remove eccentricity
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    % Extract the fondamentale-> exentricity
 | 
			
		||||
    for i = 1:length(f2)
 | 
			
		||||
        if i == NbTurn+1 || i==  length(f2)-NbTurn + 1
 | 
			
		||||
            X2fond(i) = X2(i);
 | 
			
		||||
            Y2fond(i) = Y2(i);
 | 
			
		||||
        else
 | 
			
		||||
            X2fond(i) = 0;
 | 
			
		||||
            Y2fond(i) = 0;
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    X2tot= X2int + X2dec;
 | 
			
		||||
    Y2tot= Y2int + Y2dec;
 | 
			
		||||
 | 
			
		||||
    %Convert data to "time" domain and scale accordingly
 | 
			
		||||
    Wxint = real((res_per_rev*NbTurn)/2 * ifft(X2int)) ;
 | 
			
		||||
    Wxdec = real((res_per_rev*NbTurn)/2 * ifft(X2dec)) ;
 | 
			
		||||
    Wxtot = real((res_per_rev*NbTurn)/2 * ifft(X2tot)) ;
 | 
			
		||||
 | 
			
		||||
    %Convert data to "time" domain and scale accordingly
 | 
			
		||||
    Wyint = real((res_per_rev*NbTurn)/2 * ifft(Y2int)) ;
 | 
			
		||||
    Wydec = real((res_per_rev*NbTurn)/2 * ifft(Y2dec)) ;
 | 
			
		||||
    Wytot = real((res_per_rev*NbTurn)/2 * ifft(Y2tot)) ;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    %%
 | 
			
		||||
    fig = figure();
 | 
			
		||||
 | 
			
		||||
    % subplot(3, 2, 5); bar(f2(1:50*NbTurn),abs(W2int(1:50*NbTurn)),3) ;
 | 
			
		||||
    % axis([0,50,0,max(abs(X2int(1:50*NbTurn)))]);
 | 
			
		||||
    % title ('Fourier integer'  ); xlabel('UPR'); ylabel ('Microns')
 | 
			
		||||
 | 
			
		||||
    % subplot(3, 2, 6); bar(f2(1:50*NbTurn),abs(W2dec(1:50*NbTurn)),2); title (' Fourier non-integer'  );
 | 
			
		||||
    % axis([0,50,0,max(abs(X2dec(1:50*NbTurn)))]);
 | 
			
		||||
    % title ('Fourier non-integer'  ); xlabel('UPR'); ylabel ('Microns')
 | 
			
		||||
 | 
			
		||||
    % Sensitive pos dir (synchrone+asynchrone)
 | 
			
		||||
    Wtot= Wytot.*cos(Theta)+Wxtot.*sin(Theta);
 | 
			
		||||
    % Wtot= Wytot+Wxtot; = WTot = real((res_per_rev*NbTurn)/2 * ifft(W2tot)) ;
 | 
			
		||||
 | 
			
		||||
    %Sensitive pos dir (synchrone+asynchrone)
 | 
			
		||||
    Wint= Wyint.*cos(Theta)+Wxint.*sin(Theta);
 | 
			
		||||
    %Sensitive pos dir (synchrone+asynchrone)
 | 
			
		||||
    Wdec= Wydec.*cos(Theta)+Wxdec.*sin(Theta);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    % total error motion
 | 
			
		||||
    Total_Error = max(Wtot)- min(Wtot);
 | 
			
		||||
 | 
			
		||||
    %lsc X synchronous
 | 
			
		||||
    Synchronous_Error = max(Wint)- min(Wint);
 | 
			
		||||
 | 
			
		||||
    %lsc X Asynchronous
 | 
			
		||||
    var=reshape(Wxdec,length(Wxdec)/NbTurn,NbTurn);
 | 
			
		||||
    for i=1:length(Wxdec)/NbTurn
 | 
			
		||||
        Asynch(i) = max(var(i,:)) - min(var(i,:)) ;
 | 
			
		||||
    end
 | 
			
		||||
    Asynchronous_Error = max(Asynch)- min(Asynch);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    % Raw Error Motion without Exentricity (sync +asynch)
 | 
			
		||||
    subplot(2, 2, 2) ; polar2(Theta,Wtot, 'b'); title (' Total error'  );
 | 
			
		||||
    % Residual Synchronous Error Motion without Exentricity (ie fondamental sync err motion)
 | 
			
		||||
    subplot(2, 2, 3) ;polar2(Theta,Wint,'b'); title ( 'Residual synchronous error' );
 | 
			
		||||
    % Asynchronous Error Motion
 | 
			
		||||
    subplot(2, 2, 4) ;polar2(Theta,Wdec, 'b'); title ('Asynchronous error'  );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    strmin1 = ['Total error = ', num2str(Total_Error*1000), ' nm'];
 | 
			
		||||
    strmin2 = ['Residual synchronous error = ', num2str(Synchronous_Error*1000), ' nm' ];
 | 
			
		||||
    strmin3 = ['Asynchronous error = ', num2str(Asynchronous_Error*1000), ' nm'];
 | 
			
		||||
    dim0=[0.04 0.5 0.3 .3];%x y w h basgauche to hautdroite
 | 
			
		||||
    dim1=[0.15 0.65 0.3 .3];
 | 
			
		||||
    annotation('textbox',dim0, 'String',{ strmin1 , strmin2, strmin3}, 'FitBoxToText', 'on')
 | 
			
		||||
    annotation('textbox',dim1, 'String',texte, 'FitBoxToText', 'on')
 | 
			
		||||
 | 
			
		||||
    saveas(fig,fullfile(path,char(texte)),'jpg');
 | 
			
		||||
    Res=1;
 | 
			
		||||
    close all;
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								spindle/Macros_ttt_spindle/Rotating radial Error X2Y2.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 74 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								spindle/Macros_ttt_spindle/Rotating radial Error XY.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 72 KiB  | 
							
								
								
									
										32
									
								
								spindle/Macros_ttt_spindle/Spindle.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,32 @@
 | 
			
		||||
clear; close all; clc;
 | 
			
		||||
 | 
			
		||||
%%
 | 
			
		||||
datapath = './data/';
 | 
			
		||||
savepath = './Macros_ttt_spindle/';
 | 
			
		||||
 | 
			
		||||
name_of_the_datafile = '10turns_60rpm_IcepapFIR.txt';
 | 
			
		||||
NbTurn = 10;    % Be careful that this value match with the measure
 | 
			
		||||
 | 
			
		||||
%%
 | 
			
		||||
% [y, x, z, y2, x2] = importfile(fullfile(datapath,name_of_the_datafile),12, inf);
 | 
			
		||||
 | 
			
		||||
spindle_table  = readtable([datapath, name_of_the_datafile]);
 | 
			
		||||
 | 
			
		||||
data  = table2array(spindle_table);
 | 
			
		||||
 | 
			
		||||
% data = [y x z y2 x2];
 | 
			
		||||
data = data(:, 3:end);
 | 
			
		||||
texte = {'Y Axis' 'X Axis' 'Z Axis' 'Y2 Axis' 'X2 Axis'};
 | 
			
		||||
texte2 = {'Rotating radial Error XY' 'Rotating radial Error X2Y2' 'Tilt Error XX2' 'Tilt Error YY2' };
 | 
			
		||||
 | 
			
		||||
%%
 | 
			
		||||
for i = 1:5
 | 
			
		||||
  Spindle_error(data(:,i), NbTurn, texte(:,i), savepath);
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
%%
 | 
			
		||||
Dual_Spindle_error(data(:,2), data(:,1),NbTurn,texte2(:,1), savepath);
 | 
			
		||||
Dual_Spindle_error(data(:,5), data(:,4),NbTurn,texte2(:,2), savepath);
 | 
			
		||||
 | 
			
		||||
Tilt_Spindle_error(data(:,2), data(:,5),NbTurn,texte2(:,3), savepath);
 | 
			
		||||
Tilt_Spindle_error(data(:,1), data(:,4),NbTurn,texte2(:,4), savepath);
 | 
			
		||||
							
								
								
									
										131
									
								
								spindle/Macros_ttt_spindle/Spindle_error.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,131 @@
 | 
			
		||||
function [Res] = Spindle_error(data, NbTurn, texte, path)
 | 
			
		||||
    %%
 | 
			
		||||
    L = length(data);
 | 
			
		||||
    res_per_rev = L/NbTurn;
 | 
			
		||||
 | 
			
		||||
    P = 0:(res_per_rev*NbTurn-1);
 | 
			
		||||
    Pos = P' * 360/res_per_rev;
 | 
			
		||||
    Theta = deg2rad(Pos)';
 | 
			
		||||
 | 
			
		||||
    % Temperature correction
 | 
			
		||||
    x1 = myfit2(Pos, data);
 | 
			
		||||
 | 
			
		||||
    % Convert data to frequency domain and scale accordingly
 | 
			
		||||
    X2 = 2/(res_per_rev*NbTurn)*fft(x1);
 | 
			
		||||
    f2 = (0:L-1)./NbTurn; %upr -> once per revolution
 | 
			
		||||
 | 
			
		||||
    %% Separate the fft integers and not-integers
 | 
			
		||||
    for i = 1:length(f2)
 | 
			
		||||
        if mod(f2(i), 1) == 0
 | 
			
		||||
            X2dec(i) = 0;
 | 
			
		||||
            X2int(i) = X2(i);
 | 
			
		||||
        else
 | 
			
		||||
            X2dec(i) = X2(i);
 | 
			
		||||
            X2int(i) = 0;
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    %% Case length(f2) is odd -> the mirror image of the FFT is reflected between 2 harmonique
 | 
			
		||||
    if mod(length(f2),2) == 1
 | 
			
		||||
        for i = length(f2)/2+1.5:length(f2)
 | 
			
		||||
            if mod(f2(i-1), 1) == 0
 | 
			
		||||
                X2dec(i) = 0;
 | 
			
		||||
                X2int(i) = X2(i);
 | 
			
		||||
            else
 | 
			
		||||
                X2dec(i) = X2(i);
 | 
			
		||||
                X2int(i) = 0;
 | 
			
		||||
            end
 | 
			
		||||
        end
 | 
			
		||||
    else % Case length(f2) is even -> the mirror image of the FFT is reflected at the Nyquist frequency
 | 
			
		||||
        for i = length(f2)/2+1:length(f2)
 | 
			
		||||
            if mod(f2(i), 1) == 0
 | 
			
		||||
                X2dec(i) = 0;
 | 
			
		||||
                X2int(i) = X2(i);
 | 
			
		||||
            else
 | 
			
		||||
                X2dec(i) = X2(i);
 | 
			
		||||
                X2int(i) = 0;
 | 
			
		||||
            end
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    %%
 | 
			
		||||
    X2int(1) = 0; %remove the data average/dc component
 | 
			
		||||
    X2int(NbTurn+1) = 0; %Remove fondamental/eccentricity
 | 
			
		||||
    % X2int(length(f2)) = 0; %remove the data average/dc component
 | 
			
		||||
    X2int(length(f2)-NbTurn+1) = 0; %Remove eccentricity
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    %% Extract the fondamental -> exentricity
 | 
			
		||||
    for i = 1:length(f2)
 | 
			
		||||
        if i == NbTurn+1 || i == length(f2)-NbTurn+1
 | 
			
		||||
            X2fond(i) = X2(i);
 | 
			
		||||
        else
 | 
			
		||||
            X2fond(i) = 0;
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    X2tot = X2int + X2dec;
 | 
			
		||||
 | 
			
		||||
    Wxfond = real((res_per_rev*NbTurn)/2 * ifft(X2fond)); % Convert data to "time" domain and scale accordingly
 | 
			
		||||
    Wxint = real((res_per_rev*NbTurn)/2 * ifft(X2int));
 | 
			
		||||
    Wxdec = real((res_per_rev*NbTurn)/2 * ifft(X2dec));
 | 
			
		||||
    Wxtot = real((res_per_rev*NbTurn)/2 * ifft(X2tot));
 | 
			
		||||
 | 
			
		||||
    %%
 | 
			
		||||
    fig = figure();
 | 
			
		||||
 | 
			
		||||
    subplot(3, 2, 5);
 | 
			
		||||
    bar(f2(1:50*NbTurn),1000*abs(X2int(1:50*NbTurn)),3);
 | 
			
		||||
    axis([0,50,0,1000*max(abs(X2int(1:50*NbTurn)))]);
 | 
			
		||||
    title ('Fourier integer');
 | 
			
		||||
    xlabel('UPR'); ylabel ('nm')
 | 
			
		||||
 | 
			
		||||
    subplot(3, 2, 6);
 | 
			
		||||
    bar(f2(1:50*NbTurn),1000*abs(X2dec(1:50*NbTurn)),2);
 | 
			
		||||
    title('Fourier non-integer');
 | 
			
		||||
    axis([0,50,0,1000*max(abs(X2dec(1:50*NbTurn)))]);
 | 
			
		||||
    title('Fourier non-integer');
 | 
			
		||||
    xlabel('UPR'); ylabel ('nm')
 | 
			
		||||
 | 
			
		||||
    % Eccentricity
 | 
			
		||||
    Eccentricity = max(Wxfond) - min(Wxfond);
 | 
			
		||||
 | 
			
		||||
    % total error motion X
 | 
			
		||||
    Total_Error = max(Wxtot) - min(Wxtot);
 | 
			
		||||
 | 
			
		||||
    % lsc X synchronous
 | 
			
		||||
    Synchronous_Error = max(Wxint) - min(Wxint);
 | 
			
		||||
 | 
			
		||||
    % lsc X Asynchronous
 | 
			
		||||
    var = reshape(Wxdec,length(Wxdec)/NbTurn,NbTurn);
 | 
			
		||||
    for i = 1:length(Wxdec)/NbTurn
 | 
			
		||||
        Asynch(i) = max(var(i,:)) - min(var(i,:));
 | 
			
		||||
    end
 | 
			
		||||
    Asynchronous_Error = max(Asynch) - min(Asynch);
 | 
			
		||||
 | 
			
		||||
    % Raw Error Motion without Exentricity (sync +asynch)
 | 
			
		||||
    subplot(3, 2, 2);
 | 
			
		||||
    polar2(Theta,Wxtot, 'b');
 | 
			
		||||
    title ('Total error');
 | 
			
		||||
    % Residual Synchronous Error Motion without Exentricity (ie fondamental sync err motion)
 | 
			
		||||
    subplot(3, 2, 3);
 | 
			
		||||
    polar2(Theta,Wxint,'b');
 | 
			
		||||
    title('Residual synchronous error');
 | 
			
		||||
    % Asynchronous Error Motion
 | 
			
		||||
    subplot(3, 2, 4);
 | 
			
		||||
    polar2(Theta,Wxdec, 'b');
 | 
			
		||||
    title('Asynchronous error');
 | 
			
		||||
 | 
			
		||||
    strmin0 = ['Eccentricity= ', num2str(Eccentricity), ' \mum '];
 | 
			
		||||
    strmin1 = ['Total error = ', num2str(Total_Error*1000), ' nm'];
 | 
			
		||||
    strmin2 = ['Residual synchronous error = ', num2str(Synchronous_Error*1000), ' nm' ];
 | 
			
		||||
    strmin3 = ['Asynchronous error = ', num2str(Asynchronous_Error*1000), ' nm'];
 | 
			
		||||
    dim0 = [0.1 0.55 0.3 .3];%x y w h basgauche to hautdroite
 | 
			
		||||
    dim1 = [0.15 0.65 0.3 .3];
 | 
			
		||||
    annotation('textbox',dim0, 'String',{ strmin0 ,strmin1 , strmin2, strmin3}, 'FitBoxToText', 'on')
 | 
			
		||||
    annotation('textbox',dim1, 'String',texte, 'FitBoxToText', 'on')
 | 
			
		||||
 | 
			
		||||
    saveas(fig,fullfile(path,char(texte)),'jpg');
 | 
			
		||||
    Res = 1;
 | 
			
		||||
    close all;
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								spindle/Macros_ttt_spindle/Tilt Error XX2.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 77 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								spindle/Macros_ttt_spindle/Tilt Error YY2.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 66 KiB  | 
							
								
								
									
										146
									
								
								spindle/Macros_ttt_spindle/Tilt_Spindle_error.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,146 @@
 | 
			
		||||
function Res = Tilt_Spindle_error(dataX, dataX2,NbTurn, texte, path)
 | 
			
		||||
    L = length(dataX);
 | 
			
		||||
    res_per_rev = L/NbTurn;
 | 
			
		||||
    P = 0: (res_per_rev * NbTurn)-1;
 | 
			
		||||
    Pos = P'*360/res_per_rev;
 | 
			
		||||
    Theta = deg2rad(Pos)';
 | 
			
		||||
 | 
			
		||||
    D = 76.2; %distance entre les deux balls en milimetres
 | 
			
		||||
 | 
			
		||||
    x1 = myfit2(Pos, dataX);
 | 
			
		||||
    y1 = myfit2(Pos, dataX2);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    %Convert data to frequency domain and scale accordingly
 | 
			
		||||
    X2 = 2/(res_per_rev*NbTurn)*fft(x1);
 | 
			
		||||
    f2 = (0:L-1)./NbTurn;
 | 
			
		||||
    Y2 = 2/(res_per_rev*NbTurn)*fft(y1);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    % Separate the fft integers and not-integers
 | 
			
		||||
    for i = 1:length(f2)
 | 
			
		||||
        if mod(f2(i), 1) == 0
 | 
			
		||||
            X2dec(i) = 0;
 | 
			
		||||
            X2int(i) = X2(i);
 | 
			
		||||
            Y2dec(i) = 0;
 | 
			
		||||
            Y2int(i) = Y2(i);
 | 
			
		||||
        else
 | 
			
		||||
            X2dec(i) = X2(i);
 | 
			
		||||
            X2int(i) = 0;
 | 
			
		||||
            Y2dec(i) = Y2(i);
 | 
			
		||||
            Y2int(i) = 0;
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if mod(length(f2),2) == 1 % Case length(f2) is odd -> the mirror image of the FFT is reflected between 2 harmonique
 | 
			
		||||
        for i = length(f2)/2+1.5:length(f2)
 | 
			
		||||
            if mod(f2(i-1), 1) == 0
 | 
			
		||||
                X2dec(i) = 0;
 | 
			
		||||
                X2int(i) = X2(i);
 | 
			
		||||
                Y2dec(i) = 0;
 | 
			
		||||
                Y2int(i) = Y2(i);
 | 
			
		||||
            else
 | 
			
		||||
                X2dec(i) = X2(i);
 | 
			
		||||
                X2int(i) = 0;
 | 
			
		||||
                Y2dec(i) = Y2(i);
 | 
			
		||||
                Y2int(i) = 0;
 | 
			
		||||
            end
 | 
			
		||||
        end
 | 
			
		||||
    else % Case length(f2) is even -> the mirror image of the FFT is reflected at the Nyquist frequency
 | 
			
		||||
        for i = length(f2)/2+1:length(f2)
 | 
			
		||||
            if mod(f2(i), 1) == 0;
 | 
			
		||||
                X2dec(i) = 0;
 | 
			
		||||
                X2int(i) = X2(i);
 | 
			
		||||
                Y2dec(i) = 0;
 | 
			
		||||
                Y2int(i) = Y2(i);
 | 
			
		||||
            else
 | 
			
		||||
                X2dec(i) = X2(i);
 | 
			
		||||
                X2int(i) = 0;
 | 
			
		||||
                Y2dec(i) = Y2(i);
 | 
			
		||||
                Y2int(i) = 0;
 | 
			
		||||
            end
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    X2int(1) = 0; %remove the data average/dc component
 | 
			
		||||
    X2int(NbTurn+1) = 0; %Remove fondamental/eccentricity
 | 
			
		||||
    %  X2int(length(f2)) = 0; %remove the data average/dc component
 | 
			
		||||
    X2int(length(f2)-NbTurn+1) = 0; %Remove eccentricity
 | 
			
		||||
 | 
			
		||||
    Y2int(1) = 0; %remove the data average/dc component
 | 
			
		||||
    Y2int(NbTurn+1) = 0; %Remove fondamental/eccentricity
 | 
			
		||||
    %  Y2int(length(f2)) = 0; %remove the data average/dc component
 | 
			
		||||
    Y2int(length(f2)-NbTurn+1) = 0; %Remove eccentricity
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    % Extract the fondamentale-> exentricity
 | 
			
		||||
    for i = 1:length(f2)
 | 
			
		||||
        if i == NbTurn+1 || i==  length(f2)-NbTurn + 1
 | 
			
		||||
            X2fond(i) = X2(i);
 | 
			
		||||
            Y2fond(i) = Y2(i);
 | 
			
		||||
        else
 | 
			
		||||
            X2fond(i) = 0;
 | 
			
		||||
            Y2fond(i) = 0;
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    X2tot = X2int + X2dec;
 | 
			
		||||
    Y2tot = Y2int + Y2dec;
 | 
			
		||||
 | 
			
		||||
    %Convert data to "time" domain and scale accordingly
 | 
			
		||||
    Wxint = real((res_per_rev*NbTurn)/2*ifft(X2int));
 | 
			
		||||
    Wxdec = real((res_per_rev*NbTurn)/2*ifft(X2dec));
 | 
			
		||||
    Wxtot = real((res_per_rev*NbTurn)/2*ifft(X2tot));
 | 
			
		||||
 | 
			
		||||
    %Convert data to "time" domain and scale accordingly
 | 
			
		||||
    Wyint = real((res_per_rev*NbTurn)/2*ifft(Y2int));
 | 
			
		||||
    Wydec = real((res_per_rev*NbTurn)/2*ifft(Y2dec));
 | 
			
		||||
    Wytot = real((res_per_rev*NbTurn)/2*ifft(Y2tot));
 | 
			
		||||
 | 
			
		||||
    Tint = atan((Wyint - Wxint)/(D*1000));
 | 
			
		||||
    Tdec = atan((Wydec - Wxdec)/(D*1000));
 | 
			
		||||
    Ttot = atan((Wytot - Wxtot)/(D*1000));
 | 
			
		||||
 | 
			
		||||
    %%
 | 
			
		||||
    fig = figure();
 | 
			
		||||
 | 
			
		||||
    % total error motion
 | 
			
		||||
    Total_Error = max(Ttot)- min(Ttot);
 | 
			
		||||
 | 
			
		||||
    %lsc X synchronous
 | 
			
		||||
    Synchronous_Error = max(Tint)- min(Tint);
 | 
			
		||||
 | 
			
		||||
    %lsc X Asynchronous
 | 
			
		||||
    var = reshape(Tdec,length(Tdec)/NbTurn,NbTurn);
 | 
			
		||||
    for i = 1:length(Tdec)/NbTurn
 | 
			
		||||
        Asynch(i) = max(var(i,:)) - min(var(i,:)) ;
 | 
			
		||||
    end
 | 
			
		||||
    Asynchronous_Error = max(Asynch)- min(Asynch);
 | 
			
		||||
 | 
			
		||||
    % Raw Error Motion without Exentricity (sync +asynch)
 | 
			
		||||
    subplot(2, 2, 2);
 | 
			
		||||
    polar2(Theta,Ttot, 'b');
 | 
			
		||||
    title('Total error');
 | 
			
		||||
    % Residual Synchronous Error Motion without Exentricity (ie fondamental sync err motion)
 | 
			
		||||
    subplot(2, 2, 3);
 | 
			
		||||
    polar2(Theta,Tint,'b');
 | 
			
		||||
    title('Residual synchronous error');
 | 
			
		||||
    % Asynchronous Error Motion
 | 
			
		||||
    subplot(2, 2, 4);
 | 
			
		||||
    polar2(Theta,Tdec, 'b');
 | 
			
		||||
    title ('Asynchronous error');
 | 
			
		||||
 | 
			
		||||
    %%
 | 
			
		||||
    strmin1 = ['Total error = ', num2str(Total_Error*1000000), ' \murad'];
 | 
			
		||||
    strmin2 = ['Residual synchronous error = ', num2str(Synchronous_Error*1000000), ' \murad' ];
 | 
			
		||||
    strmin3 = ['Asynchronous error = ', num2str(Asynchronous_Error*1000000), ' \murad'];
 | 
			
		||||
    dim0 =[0.04 0.5 0.3 .3];%x y w h basgauche to hautdroite
 | 
			
		||||
    dim1 =[0.15 0.65 0.3 .3];
 | 
			
		||||
    annotation('textbox',dim0, 'String',{ strmin1 , strmin2, strmin3}, 'FitBoxToText', 'on')
 | 
			
		||||
    annotation('textbox',dim1, 'String',texte, 'FitBoxToText', 'on')
 | 
			
		||||
 | 
			
		||||
    saveas(fig,fullfile(path,char(texte)),'jpg');
 | 
			
		||||
    Res = 1;
 | 
			
		||||
    close all;
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								spindle/Macros_ttt_spindle/X Axis.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 65 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								spindle/Macros_ttt_spindle/X2 Axis.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 66 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								spindle/Macros_ttt_spindle/Y Axis.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 65 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								spindle/Macros_ttt_spindle/Y2 Axis.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 64 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								spindle/Macros_ttt_spindle/Z Axis.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 67 KiB  | 
							
								
								
									
										49
									
								
								spindle/Macros_ttt_spindle/exportFigure.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,49 @@
 | 
			
		||||
% This function exports the given figure with nice settings to the given
 | 
			
		||||
% file path in the defined file format.
 | 
			
		||||
% 
 | 
			
		||||
% input parameter:
 | 
			
		||||
%   - handle ... figure handle
 | 
			
		||||
%   - path   ... file path
 | 
			
		||||
%   - format ... file format ('pdf', 'meta', 'jpeg', 'png'), default 'pdf'
 | 
			
		||||
 | 
			
		||||
function exportFigure(handle, path, format)
 | 
			
		||||
 | 
			
		||||
% select figure
 | 
			
		||||
figure(handle)
 | 
			
		||||
 | 
			
		||||
% set output settings
 | 
			
		||||
set(gcf, 'PaperPositionMode', 'manual', 'Renderer', 'painters', 'RendererMode', 'manual');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% export figure
 | 
			
		||||
print(handle, path, '-dpdf');
 | 
			
		||||
 | 
			
		||||
% set export format
 | 
			
		||||
% if(strcmp(format,'pdf') || strcmp(format,'jpeg') )
 | 
			
		||||
%     dformat = ['-d' format];
 | 
			
		||||
% else
 | 
			
		||||
%     dformat = '-dpdf';
 | 
			
		||||
% end
 | 
			
		||||
% 
 | 
			
		||||
% if(strcmp(format,'meta'))
 | 
			
		||||
%     format = 'emf';
 | 
			
		||||
% end
 | 
			
		||||
% 
 | 
			
		||||
% if(strcmp(format,'jpeg'))
 | 
			
		||||
%     format = 'jpg';
 | 
			
		||||
% end
 | 
			
		||||
 | 
			
		||||
if(strcmp(format,'jpeg') || strcmp(format,'jpg') || ...
 | 
			
		||||
        strcmp(format,'JPEG') || strcmp(format,'JPG'))
 | 
			
		||||
    display(' --------------- Converting to JPG image ----------------- ');
 | 
			
		||||
    system(['convert -density 300 ' path '.pdf -quality 95 ' path '.jpg']);
 | 
			
		||||
    system(['rm ' path '.pdf']);
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
if(strcmp(format,'png') || strcmp(format,'PNG'))
 | 
			
		||||
    display(' --------------- Converting to PNG image ----------------- ');
 | 
			
		||||
    system(['convert -density 300 ' path '.pdf ' path '.png']);
 | 
			
		||||
    system(['rm ' path '.pdf']);
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
end % end function
 | 
			
		||||
							
								
								
									
										15
									
								
								spindle/Macros_ttt_spindle/fitcircle2.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,15 @@
 | 
			
		||||
function [c,r] = fitcircle2(x,y)
 | 
			
		||||
% Function to plot a linear least squares circle on a data set
 | 
			
		||||
% x = vector of x-coordinates
 | 
			
		||||
% y = vector of y-coordinates
 | 
			
		||||
% c = center of the circle
 | 
			
		||||
% r = radius of circle (not relevant)
 | 
			
		||||
n=length(x);  xx=x.*x; yy=y.*y; xy=x.*y;
 | 
			
		||||
A=[sum(x) sum(y) n;sum(xy) sum(yy) sum(y);sum(xx) sum(xy) sum(x)];
 | 
			
		||||
B=[-sum(xx+yy) ; -sum(xx.*y+yy.*y) ; -sum(xx.*x+xy.*y)];
 | 
			
		||||
a=A\B;
 | 
			
		||||
xc = -.5*a(1);
 | 
			
		||||
yc = -.5*a(2);
 | 
			
		||||
r  =  sqrt((a(1)^2+a(2)^2)/4-a(3));
 | 
			
		||||
c = [xc;yc];
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										64
									
								
								spindle/Macros_ttt_spindle/importfile.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,64 @@
 | 
			
		||||
function [mesure1,VarName4,VarName6,VarName8,VarName10] = importfile1(filename, startRow, endRow)
 | 
			
		||||
%IMPORTFILE1 Import numeric data from a text file as column vectors.
 | 
			
		||||
%   [MESURE1,VARNAME4,VARNAME6,VARNAME8,VARNAME10] = IMPORTFILE1(FILENAME)
 | 
			
		||||
%   Reads data from text file FILENAME for the default selection.
 | 
			
		||||
%
 | 
			
		||||
%   [MESURE1,VARNAME4,VARNAME6,VARNAME8,VARNAME10] = IMPORTFILE1(FILENAME,
 | 
			
		||||
%   STARTROW, ENDROW) Reads data from rows STARTROW through ENDROW of text
 | 
			
		||||
%   file FILENAME.
 | 
			
		||||
%
 | 
			
		||||
% Example:
 | 
			
		||||
%   [mesure1,VarName4,VarName6,VarName8,VarName10] = importfile1('mesure.txt',12, 550411);
 | 
			
		||||
%
 | 
			
		||||
%    See also TEXTSCAN.
 | 
			
		||||
 | 
			
		||||
% Auto-generated by MATLAB on 2017/05/03 10:14:16
 | 
			
		||||
 | 
			
		||||
%% Initialize variables.
 | 
			
		||||
delimiter = '\t';
 | 
			
		||||
if nargin<=2
 | 
			
		||||
    startRow = 12;
 | 
			
		||||
    endRow = inf;
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
%% Format string for each line of text:
 | 
			
		||||
%   column2: double (%f)
 | 
			
		||||
%	column4: double (%f)
 | 
			
		||||
%   column6: double (%f)
 | 
			
		||||
%	column8: double (%f)
 | 
			
		||||
%   column10: double (%f)
 | 
			
		||||
% For more information, see the TEXTSCAN documentation.
 | 
			
		||||
formatSpec = '%*s%f%*s%f%*s%f%*s%f%*s%f%[^\n\r]';
 | 
			
		||||
 | 
			
		||||
%% Open the text file.
 | 
			
		||||
fileID = fopen(filename,'r');
 | 
			
		||||
 | 
			
		||||
%% Read columns of data according to format string.
 | 
			
		||||
% This call is based on the structure of the file used to generate this
 | 
			
		||||
% code. If an error occurs for a different file, try regenerating the code
 | 
			
		||||
% from the Import Tool.
 | 
			
		||||
dataArray = textscan(fileID, formatSpec, endRow(1)-startRow(1)+1, 'Delimiter', delimiter, 'EmptyValue' ,NaN,'HeaderLines', startRow(1)-1, 'ReturnOnError', false);
 | 
			
		||||
for block=2:length(startRow)
 | 
			
		||||
    frewind(fileID);
 | 
			
		||||
    dataArrayBlock = textscan(fileID, formatSpec, endRow(block)-startRow(block)+1, 'Delimiter', delimiter, 'EmptyValue' ,NaN,'HeaderLines', startRow(block)-1, 'ReturnOnError', false);
 | 
			
		||||
    for col=1:length(dataArray)
 | 
			
		||||
        dataArray{col} = [dataArray{col};dataArrayBlock{col}];
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
%% Close the text file.
 | 
			
		||||
fclose(fileID);
 | 
			
		||||
 | 
			
		||||
%% Post processing for unimportable data.
 | 
			
		||||
% No unimportable data rules were applied during the import, so no post
 | 
			
		||||
% processing code is included. To generate code which works for
 | 
			
		||||
% unimportable data, select unimportable cells in a file and regenerate the
 | 
			
		||||
% script.
 | 
			
		||||
 | 
			
		||||
%% Allocate imported array to column variable names
 | 
			
		||||
mesure1 = dataArray{:, 1};
 | 
			
		||||
VarName4 = dataArray{:, 2};
 | 
			
		||||
VarName6 = dataArray{:, 3};
 | 
			
		||||
VarName8 = dataArray{:, 4};
 | 
			
		||||
VarName10 = dataArray{:, 5};
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										35
									
								
								spindle/Macros_ttt_spindle/myFit.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,35 @@
 | 
			
		||||
function [Y] = myFit(x, y, start, End, file)
 | 
			
		||||
 | 
			
		||||
W = (y-y(1)) - (y(End-start)-y(1))/(x(End - start))*x;
 | 
			
		||||
A = [x ones(size(x))]\y;
 | 
			
		||||
 | 
			
		||||
a = A(1); b = A(2);
 | 
			
		||||
Y = y - (a*x + b);
 | 
			
		||||
 | 
			
		||||
fig = newFigure(16,20);
 | 
			
		||||
subplot(2,1,1);
 | 
			
		||||
plot (x, y, 'r');
 | 
			
		||||
grid on
 | 
			
		||||
xlabel ('Time (sec)', 'interpreter', 'latex')
 | 
			
		||||
ylabel ('Straightness $( \mu{} \mathrm{m})$', 'interpreter', 'latex')
 | 
			
		||||
title ('Straightness-Raw', 'interpreter', 'latex')
 | 
			
		||||
 | 
			
		||||
subplot(2,1,2);
 | 
			
		||||
plot (x, Y, 'color',[0 0.5 0]);
 | 
			
		||||
grid on
 | 
			
		||||
%ylim([-10 14]);
 | 
			
		||||
xlabel ('Time (sec)', 'interpreter', 'latex')
 | 
			
		||||
ylabel ('Straightness $( \mu{} \mathrm{m})$', 'interpreter', 'latex')
 | 
			
		||||
title ('Straightness-Corrected', 'interpreter', 'latex')
 | 
			
		||||
 | 
			
		||||
m= max(Y) - min(Y);
 | 
			
		||||
text(1,10, 'max - min =', 'interpreter', 'latex')
 | 
			
		||||
text(1,6, [num2str(m) ' $\mu{} \mathrm{m}$'], 'interpreter', 'latex')
 | 
			
		||||
 | 
			
		||||
string = { file };
 | 
			
		||||
Newstring = {string{1}(1:end-4)} ;
 | 
			
		||||
p= char(Newstring);
 | 
			
		||||
 | 
			
		||||
exportFigure(fig,p, 'png');
 | 
			
		||||
end 
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										5
									
								
								spindle/Macros_ttt_spindle/myfit2.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,5 @@
 | 
			
		||||
function Y =  myfit2(x,y)
 | 
			
		||||
    A = [x ones(size(x))]\y;
 | 
			
		||||
    a = A(1); b = A(2);
 | 
			
		||||
    Y = y - (a*x + b);
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										270
									
								
								spindle/Macros_ttt_spindle/polar2.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,270 @@
 | 
			
		||||
function hpol = polar2(varargin)
 | 
			
		||||
%POLAR2  Polar coordinate plot.
 | 
			
		||||
%   POLA2R(THETA, RHO) makes a plot using polar coordinates of
 | 
			
		||||
%   the angle THETA, in radians, versus the radius RHO.
 | 
			
		||||
%   POLAR2(THETA,RHO,R) uses the radial limits specified by the two element
 | 
			
		||||
%   vector R. If R is a 4-element vector, the second two elements are
 | 
			
		||||
%   angular limits.
 | 
			
		||||
%   POLAR2(THETA,RHO,S) uses the linestyle specified in string S.
 | 
			
		||||
%   See PLOT for a description of legal linestyles.
 | 
			
		||||
%   POLAR2(THETA,RHO,R,S) uses the linestyle specified in string S and the
 | 
			
		||||
%   radial limits in R.
 | 
			
		||||
%
 | 
			
		||||
%   POLAR2(AX,...) plots into AX instead of GCA.
 | 
			
		||||
%
 | 
			
		||||
%   H = POLAR2(...) returns a handle to the plotted object in H.
 | 
			
		||||
%
 | 
			
		||||
%   Example:
 | 
			
		||||
%      t = 0:.01:2*pi;
 | 
			
		||||
%      polar2(t,sin(2*t).*cos(2*t),[-2 2], '--r');
 | 
			
		||||
%
 | 
			
		||||
%   See also PLOT, LOGLOG, SEMILOGX, SEMILOGY.
 | 
			
		||||
%
 | 
			
		||||
%   Copyright 2009-2012 The MathWorks, Inc.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
% Parse possible Axes input
 | 
			
		||||
[cax,args,nargs] = axescheck(varargin{:});
 | 
			
		||||
%error(nargchk(1,4,nargs,'struct'));
 | 
			
		||||
 | 
			
		||||
if nargs < 1 || nargs > 4
 | 
			
		||||
    error('MATLAB:polar:InvalidInput', 'Requires 2 to 4 data arguments.')
 | 
			
		||||
elseif nargs == 2
 | 
			
		||||
    theta = args{1};
 | 
			
		||||
    rho = args{2};
 | 
			
		||||
    if ischar(rho)
 | 
			
		||||
        line_style = rho;
 | 
			
		||||
        rho = theta;
 | 
			
		||||
        [mr,nr] = size(rho);
 | 
			
		||||
        if mr == 1
 | 
			
		||||
            theta = 1:nr;
 | 
			
		||||
        else
 | 
			
		||||
            th = (1:mr)';
 | 
			
		||||
            theta = th(:,ones(1,nr));
 | 
			
		||||
        end
 | 
			
		||||
    else
 | 
			
		||||
        line_style = 'auto';
 | 
			
		||||
    end
 | 
			
		||||
    radial_limits = [];
 | 
			
		||||
elseif nargs == 1
 | 
			
		||||
    theta = args{1};
 | 
			
		||||
    line_style = 'auto';
 | 
			
		||||
    rho = theta;
 | 
			
		||||
    [mr,nr] = size(rho);
 | 
			
		||||
    if mr == 1
 | 
			
		||||
        theta = 1:nr;
 | 
			
		||||
    else
 | 
			
		||||
        th = (1:mr)';
 | 
			
		||||
        theta = th(:,ones(1,nr));
 | 
			
		||||
    end
 | 
			
		||||
    radial_limits = [];
 | 
			
		||||
elseif nargs == 3
 | 
			
		||||
    if ( ischar(args{3}) )
 | 
			
		||||
        [theta,rho,line_style] = deal(args{1:3});
 | 
			
		||||
        radial_limits = [];
 | 
			
		||||
    else
 | 
			
		||||
        [theta,rho,radial_limits] = deal(args{1:3});
 | 
			
		||||
        line_style = 'auto';
 | 
			
		||||
        if ( isempty(radial_limits) )
 | 
			
		||||
      radial_limits = [];
 | 
			
		||||
    elseif ( numel(radial_limits) == 2 )
 | 
			
		||||
      radial_limits = [radial_limits(:); 0; 2*pi];
 | 
			
		||||
    elseif ( ~(numel(radial_limits) == 4) )
 | 
			
		||||
            error ( 'R must be a 2 element vector' );
 | 
			
		||||
        end
 | 
			
		||||
    end
 | 
			
		||||
else %nargs == 4
 | 
			
		||||
  [theta,rho,radial_limits,line_style] = deal(args{1:4});
 | 
			
		||||
  if ( isempty(radial_limits) )
 | 
			
		||||
    radial_limits = [];
 | 
			
		||||
  elseif ( numel(radial_limits) == 2 )
 | 
			
		||||
    radial_limits = [radial_limits(:); 0; 2*pi];
 | 
			
		||||
  elseif ( ~(numel(radial_limits) == 4) )
 | 
			
		||||
    error ( 'R must be a 2 element vector' );
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
if ischar(theta) || ischar(rho)
 | 
			
		||||
    error('MATLAB:polar:InvalidInputType', 'Input arguments must be numeric.');
 | 
			
		||||
end
 | 
			
		||||
if ~isequal(size(theta),size(rho))
 | 
			
		||||
    error('MATLAB:polar:InvalidInput', 'THETA and RHO must be the same size.');
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
% get hold state
 | 
			
		||||
cax = newplot(cax);
 | 
			
		||||
 | 
			
		||||
next = lower(get(cax,'NextPlot'));
 | 
			
		||||
hold_state = ishold(cax);
 | 
			
		||||
 | 
			
		||||
% get x-axis text color so grid is in same color
 | 
			
		||||
tc = get(cax,'xcolor');
 | 
			
		||||
ls = get(cax,'gridlinestyle');
 | 
			
		||||
 | 
			
		||||
% Hold on to current Text defaults, reset them to the
 | 
			
		||||
% Axes' font attributes so tick marks use them.
 | 
			
		||||
fAngle  = get(cax, 'DefaultTextFontAngle');
 | 
			
		||||
fName   = get(cax, 'DefaultTextFontName');
 | 
			
		||||
fSize   = get(cax, 'DefaultTextFontSize');
 | 
			
		||||
fWeight = get(cax, 'DefaultTextFontWeight');
 | 
			
		||||
fUnits  = get(cax, 'DefaultTextUnits');
 | 
			
		||||
set(cax, 'DefaultTextFontAngle',  get(cax, 'FontAngle'), ...
 | 
			
		||||
    'DefaultTextFontName',   get(cax, 'FontName'), ...
 | 
			
		||||
    'DefaultTextFontSize',   get(cax, 'FontSize'), ...
 | 
			
		||||
    'DefaultTextFontWeight', get(cax, 'FontWeight'), ...
 | 
			
		||||
    'DefaultTextUnits','data')
 | 
			
		||||
 | 
			
		||||
% only do grids if hold is off
 | 
			
		||||
if ~hold_state
 | 
			
		||||
 | 
			
		||||
% make a radial grid
 | 
			
		||||
    hold(cax,'on');
 | 
			
		||||
    set(cax,'dataaspectratio',[1 1 1],'plotboxaspectratiomode','auto')
 | 
			
		||||
 | 
			
		||||
    % ensure that Inf values don't enter into the limit calculation.
 | 
			
		||||
    %arho = abs(rho(:));
 | 
			
		||||
    if ( isempty(radial_limits) )
 | 
			
		||||
        maxrho = max(rho(rho ~= Inf));
 | 
			
		||||
        minrho = min(rho(rho ~= Inf));
 | 
			
		||||
        hhh=line([minrho minrho maxrho maxrho],[minrho maxrho maxrho minrho],'parent',cax);
 | 
			
		||||
        v = [get(cax,'xlim') get(cax,'ylim')];
 | 
			
		||||
        ticks = numel(get(cax,'ytick'));
 | 
			
		||||
        delete(hhh);
 | 
			
		||||
        % check radial limits and ticks
 | 
			
		||||
        rmin = v(1); rmax = v(4); rticks = max(ticks-1,2);
 | 
			
		||||
        if rticks > 5   % see if we can reduce the number
 | 
			
		||||
            if rem(rticks,2) == 0
 | 
			
		||||
                rticks = rticks/2;
 | 
			
		||||
            elseif rem(rticks,3) == 0
 | 
			
		||||
                rticks = rticks/3;
 | 
			
		||||
            end
 | 
			
		||||
        end
 | 
			
		||||
        rinc = (rmax-rmin)/rticks;
 | 
			
		||||
 | 
			
		||||
  else
 | 
			
		||||
 | 
			
		||||
    thmax = radial_limits(4);
 | 
			
		||||
        thmin = radial_limits(3);
 | 
			
		||||
    rmax = radial_limits(2);
 | 
			
		||||
        rmin = radial_limits(1);
 | 
			
		||||
 | 
			
		||||
        order = (10^floor(log10(rmax-rmin)));
 | 
			
		||||
        firstDigit = floor((rmax-rmin)/order);
 | 
			
		||||
        if ( firstDigit <= 1 )
 | 
			
		||||
            step = 0.2*order;
 | 
			
		||||
        elseif ( firstDigit <= 3 )
 | 
			
		||||
            step = 0.5*order;
 | 
			
		||||
        elseif ( firstDigit <= 7 )
 | 
			
		||||
            step = order;
 | 
			
		||||
        else
 | 
			
		||||
            step = 2*order;
 | 
			
		||||
        end
 | 
			
		||||
        rinc = step;
 | 
			
		||||
 | 
			
		||||
    %Also, make sure to drop any values outside the limits.
 | 
			
		||||
    if ( rmin == 0 )
 | 
			
		||||
      subset = rho >= -rmax & rho <= rmax & theta >= thmin & theta <= thmax;
 | 
			
		||||
    else
 | 
			
		||||
      subset = rho >= rmin & rho <= rmax & theta >= thmin & theta <= thmax;
 | 
			
		||||
    end
 | 
			
		||||
    theta = theta(subset);
 | 
			
		||||
    rho = rho(subset);
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
% define a circle
 | 
			
		||||
    th = 0:pi/50:2*pi;
 | 
			
		||||
    xunit = cos(th);
 | 
			
		||||
    yunit = sin(th);
 | 
			
		||||
% now really force points on x/y axes to lie on them exactly
 | 
			
		||||
    inds = 1:(length(th)-1)/4:length(th);
 | 
			
		||||
    xunit(inds(2:2:4)) = zeros(2,1);
 | 
			
		||||
    yunit(inds(1:2:5)) = zeros(3,1);
 | 
			
		||||
% plot background if necessary
 | 
			
		||||
    if ~ischar(get(cax,'color')),
 | 
			
		||||
       patch('xdata',xunit*(rmax-rmin),'ydata',yunit*(rmax-rmin), ...
 | 
			
		||||
             'edgecolor',tc,'facecolor',get(cax,'color'),...
 | 
			
		||||
             'handlevisibility','off','parent',cax);
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
% draw radial circles
 | 
			
		||||
    c82 = cos(82*pi/180);
 | 
			
		||||
    s82 = sin(82*pi/180);
 | 
			
		||||
    for i=(rmin+rinc):rinc:rmax
 | 
			
		||||
        hhh = line(xunit*(i-rmin),yunit*(i-rmin),'linestyle',ls,'color',tc,'linewidth',1,...
 | 
			
		||||
                   'handlevisibility','off','parent',cax);
 | 
			
		||||
        text((i-rmin+rinc/20)*c82,(i-rmin+rinc/20)*s82, ...
 | 
			
		||||
            ['  ' num2str(i)],'verticalalignment','bottom',...
 | 
			
		||||
            'handlevisibility','off','parent',cax)
 | 
			
		||||
    end
 | 
			
		||||
    set(hhh,'linestyle',':') % Make outer circle solid
 | 
			
		||||
 | 
			
		||||
% plot spokes
 | 
			
		||||
    th = (1:6)*2*pi/12;
 | 
			
		||||
    cst = cos(th); snt = sin(th);
 | 
			
		||||
    cs = [-cst; cst];
 | 
			
		||||
    sn = [-snt; snt];
 | 
			
		||||
    line((rmax-rmin)*cs,(rmax-rmin)*sn,'linestyle',ls,'color',tc,'linewidth',1,...
 | 
			
		||||
         'handlevisibility','off','parent',cax)
 | 
			
		||||
 | 
			
		||||
% annotate spokes in degrees
 | 
			
		||||
    rt = 1.1*(rmax-rmin);
 | 
			
		||||
    for i = 1:length(th)
 | 
			
		||||
        text(rt*cst(i),rt*snt(i),int2str(i*30),...
 | 
			
		||||
             'horizontalalignment','center',...
 | 
			
		||||
             'handlevisibility','off','parent',cax);
 | 
			
		||||
        if i == length(th)
 | 
			
		||||
            loc = int2str(0);
 | 
			
		||||
        else
 | 
			
		||||
            loc = int2str(180+i*30);
 | 
			
		||||
        end
 | 
			
		||||
        text(-rt*cst(i),-rt*snt(i),loc,'horizontalalignment','center',...
 | 
			
		||||
             'handlevisibility','off','parent',cax)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
% set view to 2-D
 | 
			
		||||
    view(cax,2);
 | 
			
		||||
% set axis limits
 | 
			
		||||
    axis(cax,(rmax-rmin)*[-1 1 -1.15 1.15]);
 | 
			
		||||
 | 
			
		||||
    setappdata( cax, 'rMin', rmin );
 | 
			
		||||
 | 
			
		||||
else
 | 
			
		||||
    %Try to find the inner radius of the current axis.
 | 
			
		||||
    if ( isappdata ( cax, 'rMin' ) )
 | 
			
		||||
        rmin = getappdata( cax, 'rMin' );
 | 
			
		||||
    else
 | 
			
		||||
        rmin = 0;
 | 
			
		||||
    end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
% Reset defaults.
 | 
			
		||||
set(cax, 'DefaultTextFontAngle', fAngle , ...
 | 
			
		||||
    'DefaultTextFontName',   fName , ...
 | 
			
		||||
    'DefaultTextFontSize',   fSize, ...
 | 
			
		||||
    'DefaultTextFontWeight', fWeight, ...
 | 
			
		||||
    'DefaultTextUnits',fUnits );
 | 
			
		||||
 | 
			
		||||
% transform data to Cartesian coordinates.
 | 
			
		||||
xx = (rho - rmin).*cos(theta);
 | 
			
		||||
yy = (rho - rmin).*sin(theta);
 | 
			
		||||
 | 
			
		||||
% plot data on top of grid
 | 
			
		||||
if strcmp(line_style,'auto')
 | 
			
		||||
    q = plot(xx,yy,'parent',cax);
 | 
			
		||||
else
 | 
			
		||||
    q = plot(xx,yy,line_style,'parent',cax);
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
if nargout == 1
 | 
			
		||||
    hpol = q;
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
if ~hold_state
 | 
			
		||||
    set(cax,'dataaspectratio',[1 1 1]), axis(cax,'off'); set(cax,'NextPlot',next);
 | 
			
		||||
end
 | 
			
		||||
set(get(cax,'xlabel'),'visible','on')
 | 
			
		||||
set(get(cax,'ylabel'),'visible','on')
 | 
			
		||||
 | 
			
		||||
if ~isempty(q) && ~isdeployed
 | 
			
		||||
    makemcode('RegisterHandle',cax,'IgnoreHandle',q,'FunctionName','polar');
 | 
			
		||||
end
 | 
			
		||||