smith.m
上传用户:asli888
上传日期:2013-05-03
资源大小:7045k
文件大小:5k
源码类别:

matlab例程

开发平台:

Matlab

  1. function hpol = smith(zeta,line_style)
  2. %SMITH  Smith chart plot.
  3. %   SMITH(ZETA) makes a plot of ZETA using a conformal (Moebius)
  4. %   mapping, i.e. in Smith chart coordinates.
  5. %   It is assumed that the data is normalized to the reference
  6. %   impedance, e.g. 50 Ohm
  7. %   SMITH(ZETA,S) uses the linestyle specified in string S.
  8. %   See PLOT for a description of legal linestyles.
  9. %
  10. %   See also PLOT, LOGLOG, SEMILOGX, SEMILOGY, POLAR.
  11. %   Copyright 1984-2001 The MathWorks, Inc. 
  12. %   $Revision: 5.21 $  $Date: 2001/04/15 12:00:43 $
  13. %   Modified from POLAR by dr.ing. Mikael Hammer, NTNU, Trondheim
  14. %   15.04.03
  15. if nargin < 1
  16.     error('Requires 1 or 2 input arguments.')
  17. elseif nargin == 1
  18.     line_style = 'auto';
  19. end
  20. if isstr(zeta)
  21.     error('First input argument must be numeric.');
  22. end
  23. % get hold state
  24. cax = newplot;
  25. next = lower(get(cax,'NextPlot'));
  26. hold_state = ishold;
  27. % get x-axis text color so grid is in same color
  28. tc = get(cax,'xcolor');
  29. ls = get(cax,'gridlinestyle');
  30. % Hold on to current Text defaults, reset them to the
  31. % Axes' font attributes so tick marks use them.
  32. fAngle  = get(cax, 'DefaultTextFontAngle');
  33. fName   = get(cax, 'DefaultTextFontName');
  34. fSize   = get(cax, 'DefaultTextFontSize');
  35. fWeight = get(cax, 'DefaultTextFontWeight');
  36. fUnits  = get(cax, 'DefaultTextUnits');
  37. set(cax, 'DefaultTextFontAngle',  get(cax, 'FontAngle'), ...
  38.     'DefaultTextFontName',   get(cax, 'FontName'), ...
  39.     'DefaultTextFontSize',   get(cax, 'FontSize'), ...
  40.     'DefaultTextFontWeight', get(cax, 'FontWeight'), ...
  41.     'DefaultTextUnits','data')
  42. % only do grids if hold is off
  43. if ~hold_state
  44. % Convert zeta to S parameters (special fix to cope with division by zero)
  45. Numerator=zeta - 1;
  46. Denominator=zeta + 1;
  47. epsilon=1e-6;
  48. for i=1:length(Denominator)
  49.     if Denominator(i) == 0
  50.         Denominator(i)=Denominator(i) + epsilon;
  51.     end
  52. end
  53. S=Numerator./Denominator;
  54.     
  55. %% make a radial grid
  56.     hold on;
  57.     maxs = max(abs(S(:)));
  58.     hhh=plot([-maxs -maxs maxs maxs],[-maxs maxs maxs -maxs]);
  59.     set(gca,'dataaspectratio',[1 1 1],'plotboxaspectratiomode','auto')
  60.     v = [get(cax,'xlim') get(cax,'ylim')];
  61.     ticks = sum(get(cax,'ytick')>=0);
  62.     delete(hhh);
  63. % check radial limits and ticks
  64.     rmin = 0; rmax = v(4); rticks = max(ticks-1,2);
  65.     if rticks > 5   % see if we can reduce the number
  66.         if rem(rticks,2) == 0
  67.             rticks = rticks/2;
  68.         elseif rem(rticks,3) == 0
  69.             rticks = rticks/3;
  70.         end
  71.     end
  72. %% define a circle
  73.     th = 0:pi/50:2*pi;
  74.     xunit = cos(th);
  75.     yunit = sin(th);
  76. %% now really force points on x/y axes to lie on them exactly
  77.     inds = 1:(length(th)-1)/4:length(th);
  78.     xunit(inds(2:2:4)) = zeros(2,1);
  79.     yunit(inds(1:2:5)) = zeros(3,1);
  80. % plot background if necessary
  81.     if ~isstr(get(cax,'color')),
  82.        patch('xdata',xunit*rmax,'ydata',yunit*rmax, ...
  83.              'edgecolor',tc,'facecolor',get(gca,'color'),...
  84.              'handlevisibility','off');
  85.     end
  86. %% draw radial circles
  87. %    c82 = cos(82*pi/180);
  88. %    s82 = sin(82*pi/180);
  89. %    rinc = (rmax-rmin)/rticks;
  90. %    for i=(rmin+rinc):rinc:rmax
  91. %        hhh = plot(xunit*i,yunit*i,ls,'color',tc,'linewidth',1,...
  92. %                   'handlevisibility','off');
  93. %        text((i+rinc/20)*c82,(i+rinc/20)*s82, ...
  94. %            ['  ' num2str(i)],'verticalalignment','bottom',...
  95. %            'handlevisibility','off')
  96. %end
  97. %    set(hhh,'linestyle','-') % Make outer circle solid
  98. % draw circles of Smith chart
  99.     rotation=[1 j -1 -j];
  100.     cirangle=0:(0.01*2*pi):(2*pi);
  101.     cirradii=[0.1 0.2 0.5 0.7 1 2 3 4 5];
  102.     for q=1:4
  103.         for r=1:length(cirangle)
  104.             for s=1:length(cirradii)
  105.                 pt=rotation(q)*(cirradii(s)*exp(j*cirangle(r))+cirradii(s))+1;
  106.                 if (abs(pt) < maxs)
  107.                     hold on;
  108.                     plot(pt,ls,'color',tc,'linewidth',1,...
  109.                         'handlevisibility','off')
  110.                 end
  111.             end
  112.         end
  113.     end
  114.     
  115. % plot x and y axes to indicate origin
  116.     th = (1:4)*pi/2;
  117.     cst = cos(th); snt = sin(th);
  118.     cs = [-cst; cst];
  119.     sn = [-snt; snt];
  120.     plot(rmax*cs,rmax*sn,ls,'color',tc,'linewidth',1,...
  121.          'handlevisibility','off')
  122. %% annotate spokes in degrees
  123. %    rt = 1.1*rmax;
  124. %    for i = 1:length(th)
  125. %        text(rt*cst(i),rt*snt(i),int2str(i*30),...
  126. %             'horizontalalignment','center',...
  127. %             'handlevisibility','off');
  128. %        if i == length(th)
  129. %            loc = int2str(0);
  130. %        else
  131. %            loc = int2str(180+i*30);
  132. %        end
  133. %        text(-rt*cst(i),-rt*snt(i),loc,'horizontalalignment','center',...
  134. %             'handlevisibility','off')
  135. %    end
  136. % set view to 2-D
  137.     view(2);
  138. % set axis limits
  139.     axis(rmax*[-1 1 -1.15 1.15]);
  140. end
  141. % Reset defaults.
  142. set(cax, 'DefaultTextFontAngle', fAngle , ...
  143.     'DefaultTextFontName',   fName , ...
  144.     'DefaultTextFontSize',   fSize, ...
  145.     'DefaultTextFontWeight', fWeight, ...
  146.     'DefaultTextUnits',fUnits );
  147. % plot data on top of grid
  148. if strcmp(line_style,'auto')
  149.     hold on;
  150.     q = plot(real(S),imag(S));
  151. else
  152.     hold on;
  153.     q = plot(real(S),imag(S),line_style);
  154. end
  155. if nargout > 0
  156.     hpol = q;
  157. end
  158. if ~hold_state
  159.     set(gca,'dataaspectratio',[1 1 1]), axis off; set(cax,'NextPlot',next);
  160. end
  161. set(get(gca,'xlabel'),'visible','on')
  162. set(get(gca,'ylabel'),'visible','on')