openEMS/matlab/examples/microstrip/MSL_Losses.m

104 lines
3.7 KiB
Matlab

%
% examples / microstrip / MSL_Losses
%
% This example demonstrates how to model sheet conductor losses
%
% Tested with
% - Matlab 2011a / Octave 3.4.3
% - openEMS v0.0.28
%
% (C) 2012 Thorsten Liebig <thorsten.liebig@gmx.de>
close all
clear
clc
%% setup the simulation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
physical_constants;
unit = 1e-6; % specify everything in um
MSL.length = 10000;
MSL.port_dist = 5000;
MSL.width = 225;
MSL.conductivity = 41e6;
MSL.thickness = 35e-6;
substrate.thickness = 250;
substrate.epr = 9.8;
f_start = 0e9;
f_stop = 25e9;
lambda = c0/f_stop;
%% setup FDTD parameters & excitation function %%%%%%%%%%%%%%%%%%%%%%%%%%%%
FDTD = InitFDTD(1e6,1e-4);
FDTD = SetGaussExcite(FDTD,0.5*(f_start+f_stop),0.5*(f_stop-f_start));
BC = {'PML_8' 'PML_8' 'PML_8' 'PML_8' 'PEC' 'PML_8'};
FDTD = SetBoundaryCond( FDTD, BC );
%% setup CSXCAD geometry & mesh %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CSX = InitCSX();
resolution = c0/(f_stop*sqrt(substrate.epr))/unit /20;
mesh.x = SmoothMeshLines( [-MSL.length*0.5-MSL.port_dist 0 MSL.length*0.5+MSL.port_dist], resolution, 1.3 ,0 );
mesh.y = SmoothMeshLines2( [0 MSL.width/2], resolution/6 , 1.3);
mesh.y = SmoothMeshLines( [-0.5*lambda/unit -mesh.y mesh.y 0.5*lambda/unit], resolution, 1.4);
mesh.z = SmoothMeshLines( [linspace(0,substrate.thickness,10) 0.5*lambda/unit], resolution );
CSX = DefineRectGrid( CSX, unit, mesh );
%% substrate
CSX = AddMaterial( CSX, 'RO4350B' );
CSX = SetMaterialProperty( CSX, 'RO4350B', 'Epsilon', substrate.epr );
start = [mesh.x(1), mesh.y(1), 0];
stop = [mesh.x(end), mesh.y(end), substrate.thickness];
CSX = AddBox( CSX, 'RO4350B', 0, start, stop );
%% MSL ports and lossy line
CSX = AddConductingSheet( CSX, 'gold', MSL.conductivity, MSL.thickness );
portstart = [ mesh.x(1), -MSL.width/2, substrate.thickness];
portstop = [ mesh.x(1)+MSL.port_dist, MSL.width/2, 0];
[CSX,portstruct{1}] = AddMSLPort( CSX, 999, 1, 'gold', portstart, portstop, 0, [0 0 -1], 'ExcitePort', 'excite', 'FeedShift', 10*resolution, 'MeasPlaneShift', MSL.port_dist);
portstart = [mesh.x(end), -MSL.width/2, substrate.thickness];
portstop = [mesh.x(end)-MSL.port_dist, MSL.width/2, 0];
[CSX,portstruct{2}] = AddMSLPort( CSX, 999, 2, 'gold', portstart, portstop, 0, [0 0 -1], 'MeasPlaneShift', MSL.port_dist );
start = [mesh.x(1)+MSL.port_dist, -MSL.width/2, substrate.thickness];
stop = [mesh.x(end)-MSL.port_dist, MSL.width/2, substrate.thickness];
CSX = AddBox(CSX,'gold',500,start,stop);
%% write/show/run the openEMS compatible xml-file
Sim_Path = 'tmp';
Sim_CSX = 'msl.xml';
[status, message, messageid] = rmdir( Sim_Path, 's' ); % clear previous directory
[status, message, messageid] = mkdir( Sim_Path ); % create empty simulation folder
WriteOpenEMS( [Sim_Path '/' Sim_CSX], FDTD, CSX );
CSXGeomPlot( [Sim_Path '/' Sim_CSX] );
RunOpenEMS( Sim_Path, Sim_CSX ,'');
%% post-processing
close all
f = linspace( f_start, f_stop, 1601 );
port{1} = calcPort( portstruct{1}, Sim_Path, f, 'RefImpedance', 50);
port{2} = calcPort( portstruct{2}, Sim_Path, f, 'RefImpedance', 50);
s11 = port{1}.uf.ref./ port{1}.uf.inc;
s21 = port{2}.uf.ref./ port{1}.uf.inc;
plot(f/1e9,-20*log10(abs(s21)),'r--','LineWidth',2);
grid on;
hold on;
ylabel('-|S_21| (dB)','Interpreter','None');
xlabel('frequency (GHz)');
%% plot 35um thickness loss model curve
% values extracted from http://wcalc.sourceforge.net/cgi-bin/microstrip.cgi
model.f = [1 2 2.5 3 4 5 7.5 10 12.5 15 17.5 20 25 ]; % frequency in GHz
model.loss = [3.0 4.2 4.7 5.2 5.9 6.6 8.1 9.38 10.5 11.5 12.4 13.2 14.65]; % loss in db/m
plot(model.f, model.loss * MSL.length * unit ,'k-','LineWidth',1);
legend('FDTD simulated attenuation','t=35um, loss model by E. Hammerstad & F. Bekkadal','Location','NorthWest');