Main Content

RF Wideband Bandpass Tunable Filter with Re-configurable In-Band Characteristics

Tunable RF and Microwave Filters are pivotal components in modern communication and radar systems, offering the unique ability to dynamically adjust their frequency response to meet varying operational demands. These filters enable the selective passage of signals within a certain frequency range while blocking others, a crucial function for optimizing system performance in real-time.

In this MATLAB example, we explore the capabilities of the RF PCB Toolbox to model and simulate tunable RF filters, focusing on the impact of varying capacitance values on the filter's frequency response. By adjusting the capacitance of the capacitors integrated into the filter design, we can dynamically tune the filter's operating frequency, showcasing a practical application of tunable RF filters in real-world scenarios.

Define the Variables

Define the variables to create the top metal layer for the filter. This top layer will be designed using the shape catalog in the RF PCB Toolbox, with dimensions maintained according to the reference paper.

%Za dimensions
Za_Length=45.25e-3;
Za_Width=1.8e-3;
%Z1 dimensions
Z1_Space=22e-3;
Z1_Width=32.9e-3;
Z1_Length=6.2e-3;
%Z2 dimensions
Z2_Width=29.3e-3;
Z2_Length=4.96e-3;
Z2_Edge=Z1_Width+Za_Width+Z2_Width;
%gnd dimensions
gndL=90.5e-3;  
gndW=0.1;
%U1 ubend dimensions
U1_Length=[25.1e-3 8e-3 25.1e-3]; 
U1_Width=4.5e-3;
U1_Diag=4.5e-3*sqrt(2);
U1_Space=2.75e-3;
%L1 bend dimensions
L1_Length=[10.25e-3 46.45e-3];
L1_Width=4.5e-3;
L1_Diag=4.5e-3*sqrt(2);
L1_Space=2.75e-3;

Za=traceRectangular(Length=Za_Length,Width=Za_Width,...
    Center=[-gndL/2+Za_Length/2 Za_Width/2]);
%z1
Z1=traceRectangular(Length=Z1_Length,Width=Z1_Width+Za_Width,...
    Center=[-gndL/2+Z1_Space+Z1_Length/2 (Z1_Width/2+Za_Width/2)]);
%Z2
Z2=traceRectangular(Length=Z2_Length,Width=Z1_Width+Za_Width+Z2_Width,...
    Center=[-gndL/2+Z1_Space+Z1_Length/2 (Z1_Width/2+Za_Width/2+Z2_Width/2)]);

Create the Filter geometry

Use the shape catalog in RF PCB Toolbox to create the top layer of the filter. As the filter structure has U bends and rectangles, ubendMitered shape and traceRectangular can be used to create the metal layer. Add the shapes using the boolean add to create the left section of the filter.

U1=ubendMitered;
U1.Length=U1_Length;
U1.Width=[U1_Width U1_Width U1_Width];
U1.MiterDiagonal=U1_Diag;
U1_Xcord=-gndL/2+Z1_Space+Z1_Length/2+U1_Width/2+U1_Length(2)/2;
U1_Ycord=Z2_Edge+U1_Space+U1_Length(1);
U1.ReferencePoint=[U1_Xcord U1_Ycord];
U1 = rotateX(U1,180);
L1=bendMitered;
L1.Length=L1_Length;
L1.Width=[L1_Width L1_Width];
L1.MiterDiagonal=L1_Diag;
L1_Xcord=-gndL/2+Z1_Space+Z1_Length/2-Z2_Length/2-L1_Space-L1_Length(1);
L1_Ycord=Z2_Edge;
L1.ReferencePoint=[L1_Xcord L1_Ycord];
L1 = rotateY(L1,180);
%b1 dimensions
b1_Width=4.5e-3;
b1_Length=4.5e-3;
b1_Space=2.75e-3;
b1_Xcord=-gndL/2+Z1_Space+Z1_Length/2+U1_Width+U1_Length(2);
b1_Ycord=Z2_Edge-b1_Width/2;
b1=traceRectangular(length=b1_Length,Width=b1_Width,Center=[b1_Xcord b1_Ycord]);
%b2 dimensions
b2_Width=4.5e-3;
b2_Length=4.5e-3;
b2_Xcord=L1_Xcord;
b2_Space=2.75e-3;
b2_Ycord=L1_Ycord-L1_Length(2)-b2_Space-b2_Width/2;
b2=traceRectangular(length=b2_Length,Width=b2_Width,Center=[b2_Xcord b2_Ycord]);
LeftSection=Za+Z1+Z2+U1+L1+b1+b2;

Visualize the left section using the show method and mirror this section to create the Right section and visualize it. Use the boolean add to add the two sections to create the complete filter geometry.

figure;
show(LeftSection);

Figure contains an axes object. The axes object with xlabel x (mm), ylabel y (mm) contains 2 objects of type patch. These objects represent PEC, mypolygon.

Use the mirrorY function to mirror the left section along the Y axis and visualize the right section.

RightSection = copy(LeftSection);
RightSection = mirrorY(RightSection);
figure; 
show(RightSection)

Figure contains an axes object. The axes object with xlabel x (mm), ylabel y (mm) contains 2 objects of type patch. These objects represent PEC, mypolygon.

Combine the Left and Right Sections using boolean add and visualise the top layer of the filter.

combineSection = LeftSection + RightSection;
figure;
show(combineSection);

Figure contains an axes object. The axes object with xlabel x (mm), ylabel y (mm) contains 2 objects of type patch. These objects represent PEC, mypolygon.

Create the pcbComponent

Use the pcbComponent to place the created top layer on the substrate and assign the ground plane. Assign the properties of the pcbComponent such as Layers, BoardShape, FeedLocations, FeedDiameter, ViaDiameter, ViaLocations and visualize the filter using show method.

S_Thick=1.27e-3;
substrate = dielectric(EpsilonR = 6.45,LossTangent = 0.0027,...
    Name = "custom",Thickness = 1.27e-3);

ground = traceRectangular(Length = gndL+2e-3,Width = gndW,...
    Center=[0,0.045]);
pcb = pcbComponent;
pcb.BoardShape = ground;
pcb.BoardThickness = 1.27e-3;
pcb.Layers ={combineSection,substrate,ground};
pcb.FeedDiameter = Za_Width;
%Feedlocations
delta = 0;
pcb.FeedLocations = [-gndL/2 0.9e-3 1 3;gndL/2 0.9e-3 1 3;Z1.Center(1) Z2_Edge-delta 1 3;Z1.Center(1) Z2_Edge+U1_Space+delta 1 3;...
   L1_Xcord+L1_Length(1)-delta Z2_Edge 1 3;L1_Xcord L1_Ycord-L1_Length(2)+delta 1 3;L1_Xcord L1_Ycord-L1_Length(2)-b2_Space-delta 1 3;...
   b1_Xcord b1_Ycord+b1_Width/2+b1_Space+delta 1 3;b1_Xcord b1_Ycord+b1_Width/2-delta 1 3;-Z1.Center(1) Z2_Edge-delta 1 3;-Z1.Center(1) Z2_Edge+U1_Space+delta 1 3;...
   -(L1_Xcord+L1_Length(1))+delta Z2_Edge 1 3;-L1_Xcord L1_Ycord-L1_Length(2)+delta 1 3;-L1_Xcord L1_Ycord-L1_Length(2)-b2_Space-delta 1 3;...
   -b1_Xcord b1_Ycord+b1_Width/2+b1_Space+delta 1 3;-b1_Xcord b1_Ycord+b1_Width/2-delta 1 3];
% Vias in pcb
ViaD=[];
ViaLocat=[];
startx=[b1_Xcord b2_Xcord -b1_Xcord -b2_Xcord];
starty=[b1_Ycord b2_Ycord b1_Ycord  b2_Ycord];
dist1=b2_Length/3;
d1=1e-3;
delx=[-1e-3  1e-3];
dely=[-1e-3 -1e-3 -1e-3 -1e-3 -1e-3 -1e-3];
for i=1:4
    p1=startx(i);
    p2=starty(i);
    for j=1:2
      ViaLocat=[ViaLocat;p1+delx(j) p2+dely(j)-delta+0.3e-3 1 3];
      ViaD=[ViaD d1];
    end
end
pcb.ViaLocations=ViaLocat;
pcb.ViaDiameter=ViaD;
figure;
show(pcb);

Figure contains an axes object. The axes object with title pcbComponent element, xlabel x (mm), ylabel y (mm) contains 69 objects of type patch, surface. These objects represent PEC, feed, custom.

Use the mesh command to mesh the structure and give the MaxEdgeLength as 5 mm to create a dense mesh so that the finer gaps between the stubs can be meshed properly.

% load('pcb.mat')
figure,mesh(pcb,'MaxEdgeLength',8e-3);

Figure contains an axes object and an object of type uicontrol. The axes object with title Metal-Dielectric, xlabel x (m), ylabel y (m) contains 18 objects of type patch, surface. These objects represent PEC, feed.

% figure,mesh(pcb);

Use the Layout function to see the layout of the filter with the Vias and the Feed Locations. The feed locations other than the input and output will be connected to capacitors

figure;
layout(pcb);

Figure contains an axes object. The axes object with title PCB Component Layout, xlabel x (m), ylabel y (m) contains 21 objects of type line, text. One or more of the lines displays its values using only markers These objects represent Board Shape, Layer1, Layer3, Feed, Via.

Use the sparameters function to calculate the S-Parameters of the pcbComponent with all the Feed Locations.

s=sparameters(pcb,linspace(0.4e9,1.4e9,101),50);

Create a pcbElement and convert to Circuit

Use the pcbElement to create a circuit with the S-Parameters and the Capacitors. Assign the Capacitor values to the PortValue property on the pcbElement.

C1 = capacitor(2.2e-12);
C2 = capacitor(2.2e-12);
Cr1 = capacitor(5.1e-12);
Cr2 = capacitor(1.6e-12);
C_1 = capacitor(2e-12);
C_2 = capacitor(2.2e-12);
C_r1= capacitor(5.1e-12);
C_r2= capacitor(1.6e-12);
pcbckt = pcbElement(pcb);
Warning: antenna.Polygon not supported for behavioral S-parameters.
pcbckt.AnalysisPorts = {1,2};
pcbckt.PortNumber = {{3,4},{3,5},{6,7},{8,9},{10,11},{10,12},{13,14},{15,16}};
pcbckt.PortValue = {C1,C2,Cr1,Cr2,C_1,C_2,C_r1,C_r2};
Sboard = sparameters(pcbckt,linspace(0.4e9,1.4e9,101),50);
figure;
rfplot(Sboard);

Figure contains an axes object. The axes object with xlabel Frequency (GHz), ylabel Magnitude (dB) contains 4 objects of type line. These objects represent dB(S_{11}), dB(S_{21}), dB(S_{12}), dB(S_{22}).

Results variation with different Capacitor values

Capacitance value is changed from the original value and the loop is run to multiply these capacitances from 1 to 10 times and the result is observed.

figure;
iterations = {'CapacitorValue','CapacitorValue*3','CapacitorValue*5','CapacitorValue*7'};
for i = 1:2:8
    C1 = capacitor(i*2.2e-12);
    C2 = capacitor(i*2.2e-12);
    Cr1 = capacitor(i*5.1e-12);
    Cr2 = capacitor(i*1.6e-12);
    C_1 = capacitor(i*2e-12);
    C_2 = capacitor(i*2.2e-12);
    C_r1= capacitor(i*5.1e-12);
    C_r2= capacitor(i*1.6e-12);
    pcbckt.AnalysisPorts = {1,2};
    pcbckt.PortNumber = {{3,4},{3,5},{6,7},{8,9},{10,11},{10,12},{13,14},{15,16}};
    pcbckt.PortValue = {C1,C2,Cr1,Cr2,C_1,C_2,C_r1,C_r2};
    Sboard = sparameters(pcbckt,linspace(0.4e9,1.4e9,101),50);
    S21 = rfparam(Sboard,2,1);
    plot(Sboard.Frequencies,10*log10(abs(S21)),"LineWidth",2);
    hold on
end
legend(iterations)

Figure contains an axes object. The axes object contains 4 objects of type line. These objects represent CapacitorValue, CapacitorValue*3, CapacitorValue*5, CapacitorValue*7.

Use the Modelethics SELECT+ Library and use the capacitors from that database in the simulation.

mdlxSetup('C:\Modelithics\MATLAB')
mdlx = mdlxLibrary;
pobj2_0 = mdlxPart(mdlx,'600S','Capacitors','ATC','Rogers4350B4mil',Value=2e-12);
pobj2_2 = mdlxPart(mdlx,'600S','Capacitors','ATC','Rogers4350B4mil',Value=2.2e-12);
pobj5_1 = mdlxPart(mdlx,'600S','Capacitors','ATC','Rogers4350B4mil',Value=5.1e-12);
pobj1_6 = mdlxPart(mdlx,'600S','Capacitors','ATC','Rogers4350B4mil',Value=1.6e-12);
pcbckt.AnalysisPorts = {1,2};
pcbckt.PortNumber = {{3,4},{3,5},{6,7},{8,9},{10,11},{10,12},{13,14},{15,16}};
pcbckt.PortValue = {pobj2_2,pobj2_2,pobj5_1,pobj1_6,pobj2_0,pobj2_2,pobj5_1,pobj1_6};
Sboard = sparameters(pcbckt,linspace(0.4e9,1.4e9,91),50);
figure,rfplot(Sboard);

Figure contains an axes object. The axes object with xlabel Frequency (GHz), ylabel Magnitude (dB) contains 4 objects of type line. These objects represent dB(S_{11}), dB(S_{21}), dB(S_{12}), dB(S_{22}).

This workflow can be applied to connect passive and active component and simulate them with an RF PCB Layout and overall s-parameters can be computed.

References

[1] D. Psychogiou, R. Gómez-García and D. Peroulis, "RF Wide-Band Bandpass Filter With Dynamic In-Band Multi-Interference Suppression Capability," in IEEE Transactions on Circuits and Systems II: Express Briefs, vol. 65, no. 7, pp. 898-902, July 2018, doi: 10.1109/TCSII.2017.2726145