Connecting Networks

scikit-rf supports the connection of arbitrary ports of N-port networks. It accomplishes this using an algorithm called sub-network growth[1], available through the function connect(). Note that this function takes into account port impedances. If two connected ports have different port impedances, an appropriate impedance mismatch is inserted. This capability is illustrated here with situations often encountered.

[1]:
import skrf as rf

Cascading 2-port and 1-port Networks

A common problem is to connect two Networks one to the other, also known as cascading Networks, which creates a new Network. The figure below illustrates sile simple situations, where the port numbers are identified in gray:

7dd5d2156f6e414a9aca6d218d379938

or,

2c3a1626507043c8841d98a773288ca3

Let’s illustrate this by connecting a transmission line (2-port Network) to a short-circuit (1-port Network) to create a delay short (1-port Network):

d2b62c7a8ba646d398df7e8f3163b938

Cascading Networks being a frequent operation, it can done conveniently through the ** operator or with the cascade function:

[2]:
line = rf.data.wr2p2_line  # 2-port
short = rf.data.wr2p2_short  # 1-port

delayshort = line ** short  # --> 1-port Network
print(delayshort)
1-Port Network: 'wr2p2,line',  330.0-500.0 GHz, 201 pts, z0=[50.+0.j]

or, equivalently using the cascade() function:

[3]:
delayshort2 = rf.cascade(line, short)
print(delayshort2 == delayshort)  # the result is the same
True

It is of course possible to connect two 2-port Networks together using the connect() function. The connect() function requires the Networks and the port numbers to connect together. In our example, the port 1 of the line is connected to the port 0 of the short:

[4]:
delayshort3 = rf.connect(line, 1, short, 0)
print(delayshort3 == delayshort)
True

One often needs to cascade a chain Networks together:

4f568d38dfb44e1490034d5b938d0dd0 or, 5cee9d15167b4102b2f6c0a15e361925

which can be realized using chained ** or the convenient function cascade_list:

[5]:
line1 = rf.data.wr2p2_line  # 2-port
line2 = rf.data.wr2p2_line  # 2-port
line3 = rf.data.wr2p2_line  # 2-port
line4 = rf.data.wr2p2_line  # 2-port
short = rf.data.wr2p2_short  # 1-port

chain1 = line1 ** line2 ** line3 ** line4 ** short

chain2 = rf.cascade_list([line1, line2, line3, line4, short])

print(chain1 == chain2)
True

Cascacing 2N-port Networks

The cascading operator ** also works for to 2N-port Networks, width the following port scheme:

e41f63b9fbfd4d7986a6920f403a9e57

It also works for multiple 2N-port Network. For example, assuming you want to cascade three 4-port Network ntw1, ntw2 and ntw3, you can use:

resulting_ntw = ntw1 ** ntw2 ** ntw3

This is illustrated in this example on balanced Networks.

Cascading Multi-port Networks

To make specific connections between multi-port Networks, two solutions are available, which mostly depends of the complexity of the circuit one wants to build:

  • For reduced number of connection(s): the connect() function

  • For advanced connections between many arbitrary N-port Networks, the Circuit object is more relevant since it allows defining explicitly the connections between ports and Networks. For more information, please refer to the Circuit documentation.

As an example, terminating one of the port of an a 3-port Network, such as an ideal 3-way splitter:

979272b5f88c4da0af01508d88d954f9

can be done like:

[6]:
tee = rf.data.tee

To connect port 1 of the tee, to port 0 of the delay short,

[7]:
terminated_tee = rf.connect(tee, 1, delayshort, 0)
terminated_tee
[7]:
2-Port Network: 'tee',  330.0-500.0 GHz, 201 pts, z0=[50.+0.j 50.+0.j]

In the previous example, the port #2 of the 3-port Network tee becomes the port #1 of the resulting 2-port Network.

Multiple Connections of Multi-port Networks

Keeping track of the port numbering when using multiple time the connect function can be tedious (this is the reason why the Circuit object can be simpler to use).

Let’s illustrate this with the following example: connecting the port #1 of a tee-junction (3-port) to the port #0 of a transmission line (2-port):

fdef9275a852469795008d2ded159bc7

To keep track of the port scheme after the connection operation, let’s change the port characteristic impedances (in red in the figure above):

[8]:
tee.z0 = [1, 2, 3]
line.z0 = [10, 20]
# the resulting network is:
rf.connect(tee, 1, line, 0)
[8]:
3-Port Network: 'tee',  330.0-500.0 GHz, 201 pts, z0=[ 1.+0.j 20.+0.j  3.+0.j]

References

[1] Compton, R.C.; , “Perspectives in microwave circuit analysis,” Circuits and Systems, 1989., Proceedings of the 32nd Midwest Symposium on , vol., no., pp.716-718 vol.2, 14-16 Aug 1989. URL: http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=101955&isnumber=3167

[ ]: