openEMS/matlab/plotRefl.m

145 lines
4.0 KiB
Matlab

function h = plotRefl(port, varargin)
% h = plotRefl(port,varargin)
%
% plot the reflection coefficient of a port into a Smith chart.
% left and right facing triangles mark the lower and upper cutoff
% frequency of the pass bands. An asterisk marks the frequnecy with
% the lowest reflection.
%
% input:
% port: port data structure. Call calcPort with an appropriate
% frequency vector before calling this routine
%
% output: graphics handle for further modification of the plot.
%
% variable input:
% 'precision': - number of decimal places (floating point precision)
% for the frequency (always in MHz), default is 0
% 'threshold': - Threshold value (in dB) for the upper and lower
% cutoff frequency, default is -3
% example:
% myport = calcPort(myport, Sim_Path, linspace(f_0-f_c, f_0+f_c, 200));
% plotRefl(myport);
%
% See also calcPort
%
% openEMS matlab interface
% -----------------------
% author: Georg Michel
%defaults
precision = 0;
threshold = -3;
for n=1:2:numel(varargin)
if (strcmp(varargin{n},'precision')==1);
precision = varargin{n+1};
elseif (strcmp(varargin{n},'threshold')==1);
threshold = varargin{n+1};
else
warning('openEMS:polarFF',['unknown argument key: ''' varargin{n} '''']);
end
end
if ~isfield(port, 'uf')
error('Cannot plot the reflection coefficient. Please call calcPort first.');
end
s11 = port.uf.ref ./ port.uf.inc;
ffmt = ['%.', num2str(precision), 'f'];
figure; %new figure
plot([-1, 1], [0, 0], 'k');
axis ([-1.15, 1.15, -1.15, 1.15], "square");
axis off;
hold on
ReZ = [.2; .5; 1; 2];
ImZ = 1i * [1 2 5 2];
Z = bsxfun(@plus, ReZ, linspace(-ImZ, ImZ, 256));
Gamma = (Z-1)./(Z+1);
plot(Gamma.', 'k');
ReZ = [.5 .5 1 1 2 2 5 5 10 10];
ImZ = 1i * [-.2; .2; -.5; .5; -1; 1; -2; 2; -5; 5];
Z = bsxfun(@plus, linspace(0, ReZ, 256), ImZ);
Gamma = (Z-1)./(Z+1);
plot(Gamma.', 'k');
angle = linspace (0, 2 * pi, 256); ReZ = [0 5 10];
center = ReZ ./ (ReZ + 1);
radius = 1 ./ (ReZ + 1);
plot(bsxfun(@plus, bsxfun(@times, radius, cos(angle.')), center), bsxfun(@times, radius, sin(angle.')), 'k');
% resistance
ReZ = [0.2 0.5 1 2 5 10]; ImZ = zeros (1, length (ReZ));
rho = (ReZ.^2 + ImZ.^2 - 1 + 2i * ImZ) ./ ((ReZ + 1).^2 + ImZ.^2);
xoffset = [0.1 0.1 0.05 0.05 0.05 0.075];
yoffset = -0.03;
for idx = 1:length (ReZ)
text (real (rho(idx)) - xoffset(idx), ...
imag (rho(idx)) - yoffset, num2str (ReZ(idx)));
end
% reactance
ReZ = [-0.06 -0.06 -0.06 -0.12 -0.5];
ImZ = [0.2 0.5 1 2 5];
rho = (ReZ.^2 + ImZ.^2 - 1 + 2i * ImZ) ./ ((ReZ + 1).^2 + ImZ.^2);
for idx = 1:length (ImZ)
text (real (rho(idx)), imag (rho(idx)), [num2str(ImZ(idx)), "j"]);
text (real (rho(idx)), -imag (rho(idx)), [num2str(-ImZ(idx)), "j"]); end
% zero
rho = (-0.05.^2 + 0.^2 - 1) ./ ((-0.05 + 1).^2 + 0.^2);
text (real (rho), imag (rho), '0');
s11dB = 20*log10(abs(s11));
upperind = s11dB(1:end-1) < threshold & s11dB(2:end) > threshold;
lowerind = s11dB(1:end-1) > threshold & s11dB(2:end) < threshold;
minind = nthargout(2, @min, s11dB);
handle1 = plot(s11(lowerind),['<','b']);
handle2 = plot(s11(upperind),['>','b']);
handle3 = plot(s11(minind),['*', 'b']);
llegend = num2str(port.f(lowerind)(1)/1e6, ffmt);
ulegend = num2str(port.f(upperind)(1)/1e6, ffmt);
if nnz(lowerind) > 1
for i= 2:nnz(lowerind)
llegend = strjoin({llegend, num2str(port.f(lowerind)(i)/1e6, ffmt)}, ', ');
end
end
if nnz(upperind) > 1
for i= 2:nnz(upperind)
ulegend = strjoin({ulegend, num2str(port.f(upperind)(i)/1e6, ffmt)}, ', ');
end
end
legend([handle1, handle2, handle3], {[llegend, " MHz"], ...
[ulegend, " MHz"], ...
[num2str(20*log10(abs(s11(minind))), "%4.0f"), ...
"dB @ ", num2str(port.f(minind)/1e6, ffmt), " MHz"]});
h = plot(s11);
if (nargout == 0)
clear h;
end
end