From e0ff3b1bc5c8b537273f5c42f852122dff6a87c6 Mon Sep 17 00:00:00 2001 From: NawfalMotii79 Date: Sun, 15 Mar 2026 22:03:54 +0000 Subject: [PATCH] Add files via upload --- 5_Simulations/Matlab/16_8.m | 52 ++++++++++ 5_Simulations/Matlab/Antenna16_8.m | 108 +++++++++++++++++++++ 5_Simulations/Matlab/Antenna_array.m | 40 ++++++++ 5_Simulations/Matlab/DielectricCatalog.csv | 18 ++++ 5_Simulations/Matlab/antenna16_antenna8.m | 92 ++++++++++++++++++ 5_Simulations/Matlab/pattern_data.mat | Bin 0 -> 176360 bytes 6 files changed, 310 insertions(+) create mode 100644 5_Simulations/Matlab/16_8.m create mode 100644 5_Simulations/Matlab/Antenna16_8.m create mode 100644 5_Simulations/Matlab/Antenna_array.m create mode 100644 5_Simulations/Matlab/DielectricCatalog.csv create mode 100644 5_Simulations/Matlab/antenna16_antenna8.m create mode 100644 5_Simulations/Matlab/pattern_data.mat diff --git a/5_Simulations/Matlab/16_8.m b/5_Simulations/Matlab/16_8.m new file mode 100644 index 0000000..60fa681 --- /dev/null +++ b/5_Simulations/Matlab/16_8.m @@ -0,0 +1,52 @@ +%Size of PCB +pcbThickness = 0.578e-3; +pcbLength = 200e-3; +pcbWidth = 200e-3; + +f = 10.5e+9; +c = 3e+8; +lambda = c/f; + +Length_patch = 8.76e-3; +Width_patch = 9.545e-3; +dist_patch = lambda/2; +feeder_width = 0.94e-3; + +%Specifying Material of PCB +pcbEpsilonR = 3.48; +%Creating dielectic Material +d = dielectric(Name="RO4350B",EpsilonR=pcbEpsilonR,LossTangent=0.003,Thickness=pcbThickness); +GndPlane = antenna.Rectangle('Length',pcbLength,'Width',pcbWidth); %Creating Ground Plane of Antenna +%Creating Different Shapes of antenna +Rec1 = antenna.Rectangle('Length',dist_patch-Length_patch,'Width',feeder_width,'Center',[0,(dist_patch-Length_patch)/2]); %feeder +Rec2 = antenna.Rectangle('Length',Length_patch,'Width',Width_patch,'Center',[0,(dist_patch-Length_patch)+(Length_patch)/2]); %patch + +for i=1:1:16 + for j=1:1:8 + Rec1 = Rec1 + antenna.Rectangle('Length',dist_patch-Length_patch,'Width',feeder_width,'Center',[i-1,j*(dist_patch)+(dist_patch-Length_patch)/2]); + Rec2 = Rec2 + antenna.Rectangle('Length',Length_patch,'Width',Width_patch,'Center',[i-1,j*(dist_patch)+(dist_patch-Length_patch)+(Length_patch)/2]); + end +end + +%Adding all different shapes of antenna +AntennaPlane = Rec1 + Rec2; + +%%Creating PCB Stack +p = pcbStack; +p.Name = 'Strip-fed slot'; +p.BoardShape = GndPlane; +p.BoardThickness = pcbThickness; +p.Layers = {AntennaPlane,d,GndPlane}; %[x Cordinate,y Cordinate,startLayer stopLayer] +p.FeedLocations = [0,0,1,3;0,dist_patch,1,3;0,dist_patch*2,1,3;0,dist_patch*3,1,3;0,dist_patch*4,1,3;0,dist_patch*5,1,3;0,dist_patch*6,1,3;0,dist_patch*7,1,3;0,dist_patch*8,1,3;0,dist_patch*9,1,3;0,dist_patch*10,1,3;0,dist_patch*11,1,3;0,dist_patch*12,1,3;0,dist_patch*13,1,3;0,dist_patch*14,1,3;0,dist_patch*15,1,3]; + +%Plotting Different patterns and graphs +figure(1); +show(p); %Display Antenna +% figure(2); +% pattern(p,1.943e9); %Display Radiation Pattern at 1.943GHZ +% figure(3); +% impedance(p,1.6e9:2e7:2.2e9); %Display Impedance Graph from 1.6GHz to 2.2GHz +% freq = linspace(1.6e9, 2.2e9, 50); % Creating Frequency Vector +% s = sparameters(p,freq,50); % Calalculate S11 for all frequencys +% figure(4); +% rfplot(s);%Diplay S11 Plot \ No newline at end of file diff --git a/5_Simulations/Matlab/Antenna16_8.m b/5_Simulations/Matlab/Antenna16_8.m new file mode 100644 index 0000000..fa0c13e --- /dev/null +++ b/5_Simulations/Matlab/Antenna16_8.m @@ -0,0 +1,108 @@ +n_array = 1; +m_array = 2; + +delta_phy = 15; %phase difference between adjacent patches (in degrees) + +f = 10.5e+9; +c = 3e+8; +lambda = c/f; + +Width_patch = 8.76e-3; +Length_patch = 9.545e-3; +dist_patch = lambda/2; +feeder_width = dist_patch - Width_patch; +feeder_length = 0.94e-3; + +% Define angles (break into smaller chunks) +theta = -90:1:90; +phi = -180:1:180; +chunk_size = 30; + + +% Define file name for saving +matFileName = 'pattern_data.mat'; + +% Create a MAT file object for incremental writing +mf = matfile(matFileName, 'Writable', true); + + + +%Size of PCB +pcbThickness = 0.508e-3; +pcbWidth = 0.5*feeder_width + (feeder_width +Width_patch)*(m_array); +pcbLength =dist_patch*n_array; + +%Specifying Material of PCB +% pcbMaterial = 'RO4350B'; +% pcbEpsilonR = 3.48; +pcbMaterial = 'RO4350B'; +pcbEpsilonR = 3.48; +d = dielectric(pcbMaterial); +d.EpsilonR = pcbEpsilonR; +d.Thickness = pcbThickness; +%Creating dielectic Material + +GndPlane = antenna.Rectangle('Length',pcbLength,'Width',pcbWidth,'Center',[0,0]); %Creating Ground Plane of Antenna +%Creating Different Shapes of antenna + Rec1 = antenna.Rectangle('Length',feeder_length,'Width',feeder_width,'Center',[-(pcbLength/2)+0.5*dist_patch,-pcbWidth/2+feeder_width/2]); + Rec2 = antenna.Rectangle('Length',Length_patch,'Width',Width_patch,'Center',[-(pcbLength/2)+0.5*dist_patch,-pcbWidth/2 + feeder_width+Width_patch/2]); + +for j=1:1:n_array + for i=1:1:m_array + if((i~=1) || (j~=1)) + Rec1 = Rec1 + antenna.Rectangle('Length',feeder_length,'Width',feeder_width,'Center',[(j-1)*dist_patch-(pcbLength/2)+0.5*dist_patch,-pcbWidth/2+feeder_width/2+(i-1)*dist_patch]); + Rec2 = Rec2 + antenna.Rectangle('Length',Length_patch,'Width',Width_patch,'Center',[(j-1)*dist_patch-(pcbLength/2)+0.5*dist_patch,-pcbWidth/2+feeder_width+Width_patch/2+ (i-1)*dist_patch]); + end + end +end + +AntennaPlane = Rec1 + Rec2; + + +%%Creating PCB Stack +p = pcbStack; +p.Name = 'Strip-fed slot'; +p.BoardShape = GndPlane; +p.BoardThickness = pcbThickness; +p.Layers = {AntennaPlane,d,GndPlane}; + +%[x Cordinate,y Cordinate,startLayer stopLayer] +p.FeedDiameter = feeder_length/4; + +p.FeedLocations = [-(pcbLength/2)+0.5*dist_patch,-pcbWidth/2+feeder_length/1.4,1,3]; + +%p.FeedLocations = [-(pcbLength/2)+0.5*dist_patch,-pcbWidth/2+feeder_length/1.4,1,3;dist_patch-(pcbLength/2)+0.5*dist_patch,-pcbWidth/2+feeder_length/1.4,1,3;dist_patch*2-(pcbLength/2)+0.5*dist_patch,-pcbWidth/2+feeder_length/1.4,1,3]; +%p.FeedLocations = [0,feeder_length/1.4,1,3;dist_patch,feeder_length/1.4,1,3;dist_patch*2,feeder_length/1.4,1,3;dist_patch*3,feeder_length/1.4,1,3;dist_patch*4,feeder_length/1.4,1,3;dist_patch*5,feeder_length/1.4,1,3;dist_patch*6,feeder_length/1.4,1,3;dist_patch*7,feeder_length/1.4,1,3;dist_patch*8,feeder_length/1.4,1,3;dist_patch*9,feeder_length/1.4,1,3;dist_patch*10,feeder_length/1.4,1,3;dist_patch*11,feeder_length/1.4,1,3;dist_patch*12,feeder_length/1.4,1,3;dist_patch*13,feeder_length/1.4,1,3;dist_patch*14,feeder_length/1.4,1,3;dist_patch*15,feeder_length/1.4,1,3]; +%p.p.FeedPhase = [0 delta_phy delta_phy*2 delta_phy*3 delta_phy*4 delta_phy*5 delta_phy*6 delta_phy*7 delta_phy*8 delta_phy*9 delta_phy*10 delta_phy*11 delta_phy*12 delta_phy*13 delta_phy*14 delta_phy*15]; + +figure(1); +show(p); %Display Antenna +%figure(2); +% pattern(p,f,-180:30:180,0); +% pattern3Dfig = figure(2); %array pattern +% pattern(p,f); + +% Initialize counters for indexing +index = 1; +% Process and store in chunks +for i = 1:chunk_size:length(theta) + for j = 1:chunk_size:length(phi) + % Simulated computation (replace with actual pattern function) + p_val = pattern(p,f,theta(i),phi(j)); + mf.pattern_values(index, 1) = p_val; + % Store computed values directly into the MAT file (avoiding large RAM usage) + mf.theta_values(index, 1) = theta(i); + mf.phi_values(index, 1) = phi(j); + clear p_val theta(i) phi(j); + + + % Increment index + index = index + 1; + end +end + +figure(2); +patternCustom( mf.pattern_values,mf.theta_values ,mf.phi_values); +% Display confirmation message +%M = readtable("pattern_data.mat"); +%patternCustom(M(:,3),M(:,2),M(:,1)); \ No newline at end of file diff --git a/5_Simulations/Matlab/Antenna_array.m b/5_Simulations/Matlab/Antenna_array.m new file mode 100644 index 0000000..c384441 --- /dev/null +++ b/5_Simulations/Matlab/Antenna_array.m @@ -0,0 +1,40 @@ +%This Code was Written By Nemeen Shah +%Subscribe to My YouTube Channel: https://Youtube.com/NematicsLab +%Size of PCB +pcbThickness = 1.6e-3; %1.6mm +pcbLength = 152.4e-3; %152.4mm or 6inch +pcbWidth = 101.6e-3; %101.6mm 0r 4inch +%Specifying Material of PCB +pcbMaterial = 'FR4'; +pcbEpsilonR = 4.4; +%Creating dielectic Material +d = dielectric(pcbMaterial); +d.EpsilonR = pcbEpsilonR; +d.Thickness = pcbThickness; +AntennaPlane=antenna.Rectangle('Length',0.5e-2,'Width',5e-2,'Center',[0, 0]); %Creating Feed Plane of Antenna +GndPlane = antenna.Rectangle('Length',pcbLength,'Width',pcbWidth); %Creating Ground Plane of Antenna +%Creating Different Shapes of antenna +Rec = antenna.Rectangle('Length',10e-2,'Width',2e-2,'Center',[0,-20e-3]); +Rec1 = antenna.Rectangle('Length',6e-2,'Width',2e-2,'Center',[0,20e-3]); +%%Creating PCB Stack +p = pcbStack; +p.Name = 'Strip-fed slot'; +p.BoardShape = GndPlane; +p.BoardThickness = pcbThickness; +p.Layers = {AntennaPlane,d,GndPlane}; %[x Cordinate,y Cordinate,startLayer stopLayer] +p.FeedLocations = [0,(-pcbWidth/2)+6e-2,1,3]; + +%Adding all different shapes of antenna +AntennaPlane = AntennaPlane + Rec + Rec1; +p.Layers = {AntennaPlane,d,GndPlane}; +%Plotting Different patterns and graphs +figure(1); +show(p); %Display Antenna +figure(2); +pattern(p,1.943e9); %Display Radiation Pattern at 1.943GHZ +figure(3); +impedance(p,1.6e9:2e7:2.2e9); %Display Impedance Graph from 1.6GHz to 2.2GHz +freq = linspace(1.6e9, 2.2e9, 50); % Creating Frequency Vector +s = sparameters(p,freq,50); % Calalculate S11 for all frequencys +figure(4); +rfplot(s);%Diplay S11 Plot \ No newline at end of file diff --git a/5_Simulations/Matlab/DielectricCatalog.csv b/5_Simulations/Matlab/DielectricCatalog.csv new file mode 100644 index 0000000..bef885d --- /dev/null +++ b/5_Simulations/Matlab/DielectricCatalog.csv @@ -0,0 +1,18 @@ +Name,Relative_Permittivity,Loss_Tangent,Frequency,Comments +"RO4350B",4.38,0.003,12000000000,"" +"Air",1,0,1000000000,"" +"FR4",4.8,0.026,100000000,"" +"Teflon",2.1,0.0002,100000000,"" +"Foam",1.03,0.00015,50000000,"" +"Polystyrene",2.55,0.0001,100000000,"" +"Plexiglas",2.59,0.00676,10000000000,"" +"Fused quartz",3.78,0.0001,10000000000,"" +"E glass",6.22,0.0023,100000000,"" +"RO4725JXR",2.55,0.0022,2500000000,"" +"RO4730JXR",3,0.0023,2500000000,"" +"TMM3",3.45,0.002,10000000000,"" +"TMM4",4.7,0.002,10000000000,"" +"TMM6",6.3,0.0023,10000000000,"" +"TMM10",9.8,0.0022,10000000000,"" +"TMM10i",9.9,0.002,10000000000,"" +"Taconic RF-35",3.5,0.0018,1900000000,"" diff --git a/5_Simulations/Matlab/antenna16_antenna8.m b/5_Simulations/Matlab/antenna16_antenna8.m new file mode 100644 index 0000000..34ef528 --- /dev/null +++ b/5_Simulations/Matlab/antenna16_antenna8.m @@ -0,0 +1,92 @@ +% Open file to write +csvFileName = 'pattern_data.csv'; +fileID = fopen(csvFileName, 'w'); +fprintf(fileID, 'Theta,Phi,Pattern\n'); % CSV headers + +% Define angles (break into smaller chunks) +theta = -90:1:90; +phi = -180:1:180; +chunk_size = 50; + +%Size of PCB +pcbThickness = 0.508e-3; +pcbLength = 100e-3; +pcbWidth = 100e-3; + +n_array = 3; +m_array = 2; + +f = 10.5e+9; +c = 3e+8; +lambda = c/f; + +Length_patch = 8.76e-3; +Width_patch = 9.545e-3; +dist_patch = lambda/2; +feeder_width = 0.94e-3; +delta_phy = 15; %in degrees + +%Specifying Material of PCB +pcbMaterial = 'RO4350B'; +pcbEpsilonR = 3.48; +%Creating dielectic Material +d = dielectric(pcbMaterial); +d.EpsilonR = pcbEpsilonR; +d.Thickness = pcbThickness; +GndPlane = antenna.Rectangle('Length',pcbLength,'Width',pcbWidth); %Creating Ground Plane of Antenna +%Creating Different Shapes of antenna +%Rec1 = antenna.Rectangle('Length',feeder_width,'Width',dist_patch-Length_patch,'Center',[0,(dist_patch-Length_patch)/2]); %feeder +%Rec2 = antenna.Rectangle('Length',Length_patch,'Width',Width_patch,'Center',[0,(dist_patch-Length_patch)+(Length_patch)/2]); %patch + +for i=1:1:n_array + for j=1:1:m_array + Rec1 = Rec1 + antenna.Rectangle('Length',feeder_width,'Width',dist_patch-Length_patch,'Center',[(i-1)*(dist_patch),(j-1)*(dist_patch)+(dist_patch-Length_patch)/2]); + Rec2 = Rec2 + antenna.Rectangle('Length',Length_patch,'Width',Width_patch,'Center',[(i-1)*(dist_patch),(j-1)*(dist_patch)+(dist_patch-Length_patch)+(Length_patch)/2]); + end +end + + +%Adding all different shapes of antenna +AntennaPlane = Rec1 + Rec2; + +%%Creating PCB Stack +p = pcbStack; +p.Name = 'patch slot'; +p.BoardShape = GndPlane; +p.BoardThickness = pcbThickness; +p.Layers = {AntennaPlane,d,GndPlane}; +%[x Cordinate,y Cordinate,startLayer stopLayer] +% p.FeedLocations = [0,0,1,3;dist_patch,0,1,3;dist_patch*2,0,1,3;dist_patch*3,0,1,3;dist_patch*4,0,1,3;dist_patch*5,0,1,3;dist_patch*6,0,1,3;dist_patch*7,0,1,3;dist_patch*8,0,1,3;dist_patch*9,0,1,3;dist_patch*10,0,1,3;dist_patch*11,0,1,3;dist_patch*12,0,1,3;dist_patch*13,0,1,3;dist_patch*14,0,1,3;dist_patch*15,0,1,3]; +% p.FeedPhase = [0,delta_phy, delta_phy*2, delta_phy*3, delta_phy*4, delta_phy*5, delta_phy*6, delta_phy*7, delta_phy*8, delta_phy*9, delta_phy*10, delta_phy*11, delta_phy*12, delta_phy*13, delta_phy*14, delta_phy*15]; + +p.FeedLocations = [0,0.001,1,3;dist_patch,0.001,1,3;dist_patch*2,0.001,1,3]; + + +%Plotting Different patterns and graphs +figure(1); +show(p); %Display Antenna +%pattern(p,10.5e9); %Display Radiation Pattern at 10.5GHz +% Process and save in chunks +for i = 1:chunk_size:length(theta) + for j = 1:chunk_size:length(phi) + % Simulated computation (replace with actual pattern function) + p_val = rand(); % Example placeholder + + % Write to file + fprintf(fileID, '%.2f,%.2f,%.6f\n', theta(i), phi(j), p_val); + end +end + +% Close the file +fclose(fileID); + +% Display confirmation message +figure(2); +disp('Pattern data saved to CSV.'); + +% figure(3); +% impedance(p,0.8*f:0.05*f:1.2*f); %Display Impedance Graph from 1.6GHz to 2.2GHz +% freq = linspace(0.8*f, 1.2*f, 50); % Creating Frequency Vector +% s = sparameters(p,freq,50); % Calalculate S11 for all frequencys +% figure(4); +% rfplot(s);%Diplay S11 Plot \ No newline at end of file diff --git a/5_Simulations/Matlab/pattern_data.mat b/5_Simulations/Matlab/pattern_data.mat new file mode 100644 index 0000000000000000000000000000000000000000..32a9e78763ae93255d7e7a6588fae056c9cf2fab GIT binary patch literal 176360 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 PPvUht&nnVuZhij$eAuQV literal 0 HcmV?d00001