Visualization of Results
From openEMS
The simulation results can be viewed and analyzed in many ways using Matlab/Octave functions. Here are some examples.
Time Domain
Here is an example of the voltage waveforms in the rectangular waveguide tutorial which has a section of waveguide with ports at each end. After the simulation is complete, the plot frequency range is defined and calcPort
is run.
f_start = 20e9; f_0 = 24e9; f_stop = 26e9; % ... freq = linspace(f_start,f_stop,201); port = calcPort(port, Sim_Path, freq);
The time values and the total voltage values are extracted from the data structures for the ports and plotted. The blue curve is the active port and the red curve shows the wave incident on the second port.
figure plot( 1e12*port{1}.ut.time, port{1}.ut.tot, 'b-', 'Linewidth', 2 ); hold on plot( 1e12*port{1}.ut.time, port{2}.ut.tot, 'r-', 'Linewidth', 2 ); title( 'Voltage vs Time' ); xlabel( 'Time (pS)' ); ylabel( 'Voltage (V)' ); legend( 'port 1','port 2');
Frequency Domain
Frequently in microwave engineering we want to view the s-parameters, just as we would with a vector network analyzer. Here is an example taken from the rectangular waveguide tutorial. After the simulation is complete, the plot frequency range is defined and calcPort
is run. (Note that it should only be necessary to run calcPort
once, and then numerous plots can be made from the port data structure.)
f_start = 20e9; f_0 = 24e9; f_stop = 26e9; % ... freq = linspace(f_start,f_stop,201); port = calcPort(port, Sim_Path, freq);
Next, components of the port structure can be used in calculations and the results plotted. Here is the calculation of s11 and s21 using incident and reflected frequency-domain voltages:
s11 = port{1}.uf.ref./ port{1}.uf.inc; s21 = port{2}.uf.ref./ port{1}.uf.inc;
And the curves plotted in dB:
figure plot(freq*1e-6,20*log10(abs(s11)),'k-','Linewidth',2); xlim([freq(1) freq(end)]*1e-6); grid on; hold on; plot(freq*1e-6,20*log10(abs(s21)),'r--','Linewidth',2); l = legend('S_{11}','S_{21}','Location','East'); set(l,'FontSize',12); ylabel('S-Parameter (dB)','FontSize',12); xlabel('frequency (MHz) \rightarrow','FontSize',12);
The reflection coefficient can also be plotted on a polar plot (Smith Chart). Note that in this example that the radius of the outer circle is much less than 1 because the waveguide is well matched and auto-scaling zooms into the centre of the plot.
polar(arg(s11), abs(s11)); title( 'Reflection Coefficient S_{11}' );
Radiation Patterns
For antennas, radiation patterns are an important property to plot. Assuming that the NF2FF box has been set up in the simulation, after the simulation the CalcNF2FF
function transforms the near-field data at frequency f0
to far-field cuts over the range thetaRange
on cuts phiCuts
(in this case 0, 45, and 90 degrees).
thetaRange = (0:2:359) - 180; phiCuts = [0 45 90]; nf2ff = CalcNF2FF(nf2ff, Sim_Path, f0, thetaRange*pi/180, phiCuts*pi/180);
The openEMS function plotFFdB
plots the radiation patterns.
figure plotFFdB(nf2ff,'xaxis','theta','param',[1 2 3]); axis([-180 180]);
However, plotFFdB
plots |E| which has the co- and cross-polarized components of the electric field combined, and antenna engineers often plot the two polarization responses as separate curves. Part of the structure returned by CalcNF2FF
are orthogonal field components aligned in the phi direction and the theta direction. These components can be extracted with:
E_theta = nf2ff.E_theta{freq_index} / max(nf2ff.E_norm{freq_index}(:)); E_phi = nf2ff.E_phi{freq_index} / max(nf2ff.E_norm{freq_index}(:));
Conversion to co and cross is straightforward:
% Convert from E_theta and E_phi to co- and cross-pol as per % Ludwig's third definition. % Ref.: Milligan, Modern Antenna Design, 2005, p.22 % [ E_co] = [cos(phi) -sin(phi)] [E_phi ] % [ E_cx] = [sin(phi) cos(phi)] [E_theta] E_co = E_theta.*cos(nf2ff.phi) - E_phi.*sin(nf2ff.phi); E_cx = E_theta.*sin(nf2ff.phi) + E_phi.*cos(nf2ff.phi); E_co_log = 20*log10(E_co) + 10*log10(nf2ff.Dmax(freq_index)); E_cx_log = 20*log10(E_cx) + 10*log10(nf2ff.Dmax(freq_index));
These can be plotted on a single graph with solid lines representing the co-polarized patterns and dashed lines the cross-polarized patterns.
xax = nf2ff.theta; yax1 = E_co_log(:,param); yax2 = E_cx_log(:,param); h = plot( xax/pi*180, yax1, xax/pi*180, yax2, '--' );
(In this example param = [1 2 3]
to specify the three phi-cuts.)
A modified version of plotFFdB
plots the co- and cross-polarized patterns: File:PlotFFcocx.m.