diff options
Diffstat (limited to 'hyp2mat/eagle/hairpinfilter/demo_hairpin.m')
-rw-r--r-- | hyp2mat/eagle/hairpinfilter/demo_hairpin.m | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/hyp2mat/eagle/hairpinfilter/demo_hairpin.m b/hyp2mat/eagle/hairpinfilter/demo_hairpin.m new file mode 100644 index 0000000..ebe4bd8 --- /dev/null +++ b/hyp2mat/eagle/hairpinfilter/demo_hairpin.m @@ -0,0 +1,109 @@ +% demo for hyp2mat - simulation of a hairpin filter. +% +% run from openems matlab command prompt +% See hyp2mat(1) - convert hyperlynx files to matlab scripts. + +% (C) 2011,2012 Thorsten Liebig <thorsten.liebig@gmx.de> +% Copyright 2012 Koen De Vleeschauwer. +% +% This file is part of hyp2mat. +% +% This program is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see <http://www.gnu.org/licenses/>. + +close all +clear +clc + +% initialize +physical_constants; +unit = 1; % this pcb has units in meters. +fc= 1.1e9; % center frequency +f0= 1.0e9; % estimated 20db frequency +substrate_epr = 4.8; +resolution = c0 / (f0+fc) / sqrt(substrate_epr) / unit / 25; +hypfilename = 'hairpinfilter.HYP'; + +AirBox = c0/(f0+fc)/unit/25; + +% set up FTDT +FDTD = InitFDTD(); +FDTD = SetGaussExcite( FDTD, f0, fc ); +BC = {'PML_8' 'PML_8' 'PML_8' 'PML_8' 'PML_8' 'PML_8'}; +FDTD = SetBoundaryCond( FDTD, BC ); + +% create 3d model +CSX = InitCSX(); +disp([ 'loading ' hypfilename ]); +CSX = ImportHyperLynx(CSX, hypfilename); + +mesh = DetectEdges(CSX); + +% get the coordinates of the ports. +% 'TP1.TP' is pin 'TP' of test point 'TP1'. (See schematic) +[port1_material, port1_start, port1_stop] = GetHyperLynxPort(CSX, 'TP1.TP'); +[port2_material, port2_start, port2_stop] = GetHyperLynxPort(CSX, 'TP5.TP'); + +port1_stop(3)=mesh.z(1); % port goes all the way to the ground plane +[CSX, port{1}] = AddLumpedPort( CSX, 999, 1, 50 , port1_start, port1_stop, [0 0 -1], true); + +port2_stop(3)=mesh.z(1); % port goes all the way to the ground plane +[CSX, port{2}] = AddLumpedPort( CSX, 999, 2, 50, port2_start, port2_stop, [0 0 -1]); + +% re-run DetectEdges to add the lumped ports to the mesh +mesh = DetectEdges(CSX); + +% add air-box around the imported structure +mesh.x = [min(mesh.x)-AirBox max(mesh.x)+AirBox mesh.x]; +mesh.y = [min(mesh.y)-AirBox max(mesh.y)+AirBox mesh.y]; +mesh.z = [min(mesh.z)-AirBox max(mesh.z)+2*AirBox mesh.z]; + +mesh = SmoothMesh(mesh, resolution); + +% add 8 additional cells for the pml +mesh = AddPML(mesh, 8); + +CSX = DefineRectGrid(CSX, unit, mesh); + +% 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 + +disp([ 'Estimated simulation runtime: 25000 timesteps' ]); % inform user this may take a while... +WriteOpenEMS( [Sim_Path '/' Sim_CSX], FDTD, CSX ); +CSXGeomPlot( [Sim_Path '/' Sim_CSX] ); +RunOpenEMS( Sim_Path, Sim_CSX ); + +%% post-processing +close all +f = linspace( 1e6, 2e9, 1601 ); +port = calcPort( port, 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(s11)),'k-','LineWidth',2); +hold on; +grid on; +plot(f/1e9,20*log10(abs(s21)),'r--','LineWidth',2); +legend('S_{11}','S_{21}'); +ylabel('S-Parameter (dB)','FontSize',12); +xlabel('frequency (GHz) \rightarrow','FontSize',12); +ylim([-60 2]); +print ('hairpinfilter_simulation.png', '-dpng'); + +% not truncated |