openEMS/matlab/polarFF.m

173 lines
4.6 KiB
Matlab

function h = polarFF(nf2ff,varargin)
% h = polarFF(nf2ff,varargin)
%
% plot polar far field pattern
%
% input:
% nf2ff: output of CalcNF2FF
%
% variable input:
% 'freq_index': - use the given frequency index, see nf2ff.freq
% - default is 1
% 'xaxis': - 'phi' (default) or 'theta'
% 'param': - array positions of parametric plot
% - if xaxis='phi', theta is parameter, and vice versa
% - default is 1
% 'normalize': - true/false, normalize linear plot
% - default is false, log-plot is always normalized!
% 'logscale': - if set, plot logarithmic polar
% - set the dB value for point of origin if scalar
% - set point of origin and maximum if 2-element array
% - values below minimum will be clamped
% - default is -20
% 'xtics': - set the number of tics for polar grid
% - default is 5
%
% example:
% polarFF(nf2ff, 'freq_index', 2, ...
% 'xaxis', 'phi', 'param', [1 46 91] );
%
% polarFF(..., 'normalize', true );
% polarFF(..., 'logscale', -30 );
% polarFF(..., 'logscale', [-30 10]);
%
% polarFF(..., 'xtics', 10);
%
% see examples/antenna/infDipol.m
%
% See also CalcNF2FF, plotFFdB, plotFF3D
%
% openEMS matlab interface
% -----------------------
% author: Thorsten Liebig, Stefan Mahr
% defaults
freq_index = 1;
xaxis = 'phi';
param = 1;
logscale = [];
xtics = 5;
normalize = 0;
for n=1:2:numel(varargin)
if (strcmp(varargin{n},'freq_index')==1);
freq_index = varargin{n+1};
elseif (strcmp(varargin{n},'xaxis')==1);
xaxis = varargin{n+1};
elseif (strcmp(varargin{n},'param')==1);
param = varargin{n+1};
elseif (strcmp(varargin{n},'normalize')==1);
normalize = varargin{n+1};
elseif (strcmp(varargin{n},'logscale')==1);
logscale = varargin{n+1};
elseif (strcmp(varargin{n},'xtics')==1);
xtics = varargin{n+1};
else
warning('openEMS:polarFF',['unknown argument key: ''' varargin{n} '''']);
end
end
E_far_max = max(nf2ff.E_norm{freq_index}(:));
if ~isempty(logscale)
gridmin = logscale(1);
Dmax = 10*log10(nf2ff.Dmax);
E_far_scale = Dmax - gridmin;
E_far = 20*log10(nf2ff.E_norm{freq_index}) - 20*log10(E_far_max) + E_far_scale;
E_far = E_far .* ( E_far > 0 );
E_far = E_far ./ E_far_scale;
titletext = sprintf('electrical far field [dBi] @ f = %e Hz',nf2ff.freq(freq_index));
if numel(logscale) == 2 % normalize to maximum grid
gridmax = logscale(2);
E_far = E_far .* E_far_scale/(gridmax-gridmin);
else
gridmax = Dmax;
end
elseif (normalize==0)
E_far = nf2ff.E_norm{freq_index};
titletext = sprintf('electrical far field [V/m] @ f = %e Hz',nf2ff.freq(freq_index));
gridmin = 0;
gridmax = E_far_max;
else % normalize == 1
E_far = nf2ff.E_norm{freq_index} / E_far_max;
titletext = sprintf('normalized electrical far field @ f = %e Hz',nf2ff.freq(freq_index));
gridmin = 0;
gridmax = 1;
end
if (strcmp(xaxis,'theta')==1);
xax = nf2ff.theta(:);
yax = E_far(:,param);
parval = nf2ff.phi(param);
param = 'phi';
elseif (strcmp(xaxis,'phi')==1);
xax = nf2ff.phi(:);
yax = E_far(param,:)';
parval = nf2ff.theta(param);
param = 'theta';
else
error('openEMS:polarFF','unknown parameter to ''xaxis''');
end
if ~isempty(logscale)
scalegrid = 1;
else
scalegrid = gridmax;
end
% workaround for polar plot
gridcolor = [0.85 0.85 0.85];
% plot xtics circles
a=linspace(0,2*pi,60);
b=linspace(0,scalegrid,xtics+1);
b=repmat(b(2:end),numel(a),1)';
a=repmat(a,size(b,1),1);
[x,y] = pol2cart(a,b);
h = plot(x',y');
%h=polar(a,b,'-k');
set(h,'Color',gridcolor);
set(h(end),'Color',gridcolor*0.8);
hold on;
% plot degree lines
a=bsxfun(@plus,[0:pi/6:pi-pi/6],[0 pi]');
b=scalegrid.*ones(size(a));
h=polar(a,b,'-k');
set(h,'Color',gridcolor);
set(h([1 4]),'Color',gridcolor*0.8);
text(scalegrid*0.05,scalegrid*0.05,num2str(gridmin))
text(scalegrid*1.05,scalegrid*0.05,num2str(gridmax))
% draw far field
xax = repmat(xax,1,size(yax,2));
[x,y] = pol2cart(xax,yax);
h = plot(x,y);
%h = polar( xax, yax );
% legend
ylabel( sprintf('%s / deg', xaxis) );
title( titletext );
createlegend = @(d)sprintf('%s = %3.1f',param,d / pi * 180);
legendtext = arrayfun(createlegend,parval,'UniformOutput',0);
legend( h, legendtext ,'location','southeast');
% workaround for polar plot
axis equal tight
axis ([-scalegrid scalegrid -scalegrid scalegrid]);
axis off
hold off
set(gcf,'Color','white');
if (nargout == 0)
clear h;
end
end