T-type Matching Network with Lumped Elements

44 views
Skip to first unread message

Jay Patel

unread,
Dec 30, 2022, 7:17:17 PM12/30/22
to scikit-rf
I am working with T-type matching network, which is basically two L type matching network. I am trying to verify if the optimization values from the scikit-rf is correct as mentioned. I am not sure how to verify those. I plotted smith chart of the same and looks fine to me. Any suggestions are most welcome.

I had Tx that connects to antenna and this is a matching network between them. I am trying to find optimal values for my C1, C2 and C3. I am attaching my code for reference.


import numpy as np
import matplotlib.pyplot as plt
import skrf as rf
from scipy.optimize import minimize
from matplotlib import style
from skrf import plotting

plt.rcParams['figure.figsize'] = 13,6

# Matching network for Antenna
#    |------L1-----C1----|----C3-----L2----|
#    |                   |                 |
#   Z_0                 C2                Z_L
#    |                   |                 |
#                       GND

# Matching with Lumped Elements
# Let’s assume the load is 200 + 0j for a line Z_0 = 50 ohm  at the frequency of 6 MHz.
Z_L = 200 + 0j
Z_0 = 50
f_0_str = '10MHz'

# frequency band centered on the frequency of interest
frequency = rf.Frequency(start=6, stop=16, npoints=401, unit='MHz')

# transmission line Media
line = rf.DefinedGammaZ0(frequency=frequency, z0=Z_0)

# load Network
load = line.load(rf.zl_2_Gamma0(Z_0, Z_L))

def matching_network_LCCCL_1(L1, C1, C2, C3, L2):
    'L1, C1, C2, C3 and L2 in uH and pF'
    return line.inductor(L1*1e-6)**line.capacitor(C1*1e-12)**line.shunt_capacitor(C2*1e-12)**line.capacitor(C3*1e-12)**line.inductor(L2*1e-6)**load

# Static inductor loads
# initial guess values
L1 = 3.2 # uH - Fixed static inductor load
C1 = 260 # pF
C2 = 260 # pF
C3 = 250 # pF
L2 = 3.2 # uH - Fixed static inductor load
x0 = (L1, C1, C2, C3, L2)

# bounds
L1_minmax = (3.2, 3.2) # uH
C1_minmax = (35, 1000) # pF
C2_minmax = (35, 1000) # pF
C3_minmax = (35, 1000) # pF
L2_minmax = (3.2, 3.2) # uH

# the objective functions minimize the return loss at the target frequency f_0
def optim_fun_1(x, f0=f_0_str):
    _ntw = matching_network_LCCCL_1(*x)
    print("Running optimization for values (L1, C1, C2, C3, L2) : ", x)
    return np.abs(_ntw[f_0_str].s).ravel()

res1 = minimize(optim_fun_1, x0, bounds=(L1_minmax, C1_minmax, C2_minmax, C3_minmax, L2_minmax))

print(f'Optimum found for LCCCL network 1: \n L1={res1.x[0]} uH;\n C1={res1.x[1]} pF ;\n C2={res1.x[2]} pF ;\n C3={res1.x[3]} pF ; and\n L2={res1.x[4]} uH')
# printed Optimum results
# Optimum found for LCCCL network 1:
#  L1=3.2 uH;
#  C1=176.9325799674975 pF ;
#  C2=156.43228266359162 pF ;
#  C3=257.3454309200819 pF ; and
#  L2=3.2 uH

ntw1 = matching_network_LCCCL_1(*res1.x)

ntw1.plot_s_mag(lw=2, label='LCCCL network 1')
plt.ylim(bottom=0)
plt.grid(True)

ntw1.plot_s_db(lw=2, label='LCCCL network 1')
plt.grid(True)

with style.context('seaborn-ticks'):
    ntw1.plot_s_smith()
    # plotting.add_markers_to_lines()
    plt.xlabel('Real Part')
    plt.ylabel('Imaginary Part')
    plt.title('Smith Chart')
    plt.legend(loc=5)

plt.show()


Julien Hillairet

unread,
Jan 1, 2023, 10:57:45 AMJan 1
to scik...@googlegroups.com
Dear Jay,

This seems OK to me. I find with your code:
 C1=183.56676526215574 pF ;
 C2=154.9879989021653 pF ;
 C3=307.9298055500741 pF ;

and indeed the network is matched at 10 MHz for these values as S11 is very very low (cf the S11 Cartesian plot vs frequency).

Julien

--
You received this message because you are subscribed to the Google Groups "scikit-rf" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scikit-rf+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/scikit-rf/2d9b5cd8-727e-4e1f-bd3a-f84512bc03b7n%40googlegroups.com.

Jay Patel

unread,
Jan 16, 2023, 1:51:29 PMJan 16
to scikit-rf
Hello,

Thanks for the confirmation. Is it possible to see the voltage across the capacitors by any chance ?

Jay

Julien Hillairet

unread,
Jan 23, 2023, 12:35:11 PMJan 23
to scik...@googlegroups.com
Dear Jay,

Actually, yes it is possible, but using a different approach, using Circuit. You will find more documentation here:
and

You will find an example below

Julien


import skrf as rf
import matplotlib.pyplot as plt


# Matching with Lumped Elements
# Let’s assume the load is 200 + 0j for a line Z_0 = 50 ohm  at the frequency of 6 MHz.
Z_L = 200 + 0j
Z_0 = 50

# frequency band centered on the frequency of interest
frequency = rf.Frequency(start=6, stop=16, npoints=401, unit='MHz')

# transmission line Media
line = rf.DefinedGammaZ0(frequency=frequency, z0=Z_0)

# Static inductor loads
# initial guess values
L1 = 3.2 # uH - Fixed static inductor load
C1 = 260 # pF
C2 = 260 # pF
C3 = 250 # pF
L2 = 3.2 # uH - Fixed static inductor load

ntwk_C1 = line.capacitor(C1*1e-12, name='C1')
ntwk_C2 = line.capacitor(C2*1e-12, name='C2')
ntwk_C3 = line.capacitor(C3*1e-12, name='C3')
ntwk_L1 = line.inductor(L1*1e-6, name='L1')
ntwk_L2 = line.inductor(L2*1e-6, name='L2')
ntwk_load = line.resistor(Z_L, name='load')
tee = line.tee(name='tee')
port = rf.Circuit.Port(frequency, name='Port1', z0=50)
gnd1 = rf.Circuit.Ground(frequency, name='gnd1')
gnd2 = rf.Circuit.Ground(frequency, name='gnd2')

cir = [
    [(port, 0), (ntwk_L1, 0)],
    [(ntwk_L1, 1), (ntwk_C1, 0)],
    [(ntwk_C1, 1), (tee, 0)],
    [(ntwk_C2, 0), (tee, 1)],
    [(ntwk_C3, 0), (tee, 2)],
    [(ntwk_C2, 1), (gnd1, 0)],
    [(ntwk_C3, 1), (ntwk_L2, 0)],
    [(ntwk_L2, 1), (ntwk_load, 0)],
    [(ntwk_load, 1), (gnd2, 0)]
]

cir = rf.Circuit(cir)

# Voltage at C2 vs frequency
power = [1]  # W
phase = [0]  # deg
voltages = cir.voltages(power, phase)

fig, ax = plt.subplots()
ax.plot(frequency.f_scaled, voltages[:, 6])  # 6 found from cir.connections_list 



Reply all
Reply to author
Forward
0 new messages