%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Thank you for using ClarkWare Products!!!! % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % SMITH Smith Chart. % SMITH(Zl,Zo) draws a Smith chart of the Complex impedances % in Zl, normalized to the real valued characteristic impedance Zo. % Multiple plots are obtained in different colours etc if Zl % is a matrix, ie its columns contain sets of complex values. % Smith may be subplotted with fair deal of success. (Text size % doesn't change and is a bit messy with subplot (221) -- but % liveable! ) Obeys all usual conventions. % % Originally based on some Matlab code by % Antony-Dean McKechnie & Neville Wilken in their final year project % of their BSc(Eng) at Wits. (Which in turn was based on some Pascal % code of mine :-) % But rather heavily rewritten :-) by % Alan Robert Clark, PrEng. % Dept Elec Eng % P.O.Wits % 2050 South Africa % clark@odie.wits.ee.ac.za % 15 December 1992. % Added: subplot capability. % multiple plot capability (re-defaulted). % 'Polar'ized axes % combined multi stage process into one simple function call. % Removed: non standard calling conventions. % Bugs, bugs, bugs :-) :-) Probably should fall under Added too! function smith (Zl, Zo); % Set up Constant Resistance Circles; % and Constant reactance circles -- but crop at Outer Circle. r = [1 0.826 0.665 0.500 0.334 0.162]; axis([-1 1 -1 1]); Re = [1,2,5,5]; Im = [0.2 0.5 1 2]; for i = 1:4 p = (0:(Re(i)/100):Re(i))'; q = p-p+Im(i); Icirc1 = p+j*q; Icirc2 = p-j*q; rho1=(Icirc1-1)./(Icirc1+1); rho2=(Icirc2-1)./(Icirc2+1); rhomag = abs(rho1); Circm(:,i)= rhomag; Circp = angle(rho1); Circp1(:,i) = Circp; Circp = angle(rho2); Circp2(:,i) = Circp; end, inc = 2*pi/100; theta = 0:inc:pi; phi = 0:2*inc:2*pi; RV = phi-phi+0.329; for i=1:6 R1 = 2*r(:,i)*sin(theta+pi/2); y1 = R1.*sin(theta); x1 = R1.*cos(theta); y2 = y1; x2 = x1+(1-2*r(i)); R = sqrt(x2.^2+y2.^2); R2(:,i) = R'; theta1 = atan((y2./x2)); for p=1:length(x2) % Crop at 1 if x2(p) < 0, theta1(p)=theta1(p)-pi; end; end, theta2(:,i) = theta1'; end % Keep polar from doing anything silly hold on polar(theta2,R2,':c1',Circp1,Circm,':c1',.... Circp2,Circm,':c1',phi,RV,':c1'); % Fill in the Real axis.. x=[-pi 0]; y=[1 1]; polar (x,y,'w:'); % Do a bit of fiddling to get the scale positioned.. text(-pi,1.1,'0'); text(-pi,0.66,'.2'); text(-pi,0.33,'.5'); text(0,0,'1'); text(0,0.33,'2'); text(0,0.66,'5'); %text(0,1.1,'ì'); % Works fine on screen but PCGPP falls over and dies!!! text(0,1.05,'inf'); % so we have to make do with a poor man's infinity!! text(5.2*pi/6,1.1,'.2'); text(-5.2*pi/6,1.15,'.2'); text(2.2*pi/3,1.1,'.5'); text(-2.2*pi/3,1.15,'.5'); text(pi/2,1.05,'1'); text(-pi/2,1.1,'1'); text(pi/3.2,1.05,'2'); text(-pi/3.2,1.1,'2'); % OK now go ahead and plot the impedances, -- first normalize rho=(Zl-Zo)./(Zl+Zo); rhomag = abs(rho); rhoph = angle(rho); polar(rhoph,rhomag); hold off % return to usual state % Need to address a serious bug in the reversion to rectangular coords % .. if the plot is held, and PLOT is used, the FIRST point is haywire-- % causing GPP to hang the machine etc. SECOND point is fine. % Hence : hold on; plot(0,0,'i'); hold off; % which sorts it out beautifully..... function [rads] = angle (comp_val) % Can you believe that ANGLE is not defined???? % Angle of a complex value returns radians..... % Alan Robert Clark rads = atan2 (imag(comp_val),real(comp_val));