summaryrefslogtreecommitdiff
path: root/openEMS/matlab/polarFF.m
diff options
context:
space:
mode:
Diffstat (limited to 'openEMS/matlab/polarFF.m')
-rw-r--r--openEMS/matlab/polarFF.m172
1 files changed, 172 insertions, 0 deletions
diff --git a/openEMS/matlab/polarFF.m b/openEMS/matlab/polarFF.m
new file mode 100644
index 0000000..96b97da
--- /dev/null
+++ b/openEMS/matlab/polarFF.m
@@ -0,0 +1,172 @@
+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(freq_index));
+ 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