Network Analysis
Converting Between Networks Representations
Marconi provides functionality to convert between S,Z,Y, and T Parameters. See the library for more details.
Interpolations
To interpolate networks, one can just call interpolate
with a network object and some array or range of new frequencies. For evenly-spaced networks, interpolate
will use a cubic spline interpolation, while uneven spaced networks will use a standard linear gridded interpolation.
# Uneven network
amp = readTouchstone("Amp.s2p")
2-Port Network
Z0 = 50.0
Frequency = 10.0 MHz to 18.0 GHz
Points = 879
This network has 879 points from 10 MHz to 18 GHz. Let's reinterpret it to more points.
amp_morePoints = interpolate(amp,range(10e6,stop=18e9,length=1001))
2-Port Network
Z0 = 50.0
Frequency = 10.0 MHz to 18.0 GHz
Points = 1001
As typical with interpolations, one can only interpolate between the bounds of the source data.
Cascading Networks
For working with 2-Port networks, cascading multiple networks can be helpful for finding system performance, embedding, and deembedding.
cascade
takes n
number of 2-Port networks and returns a new DataNetwork
that is the cascaded result of all the networks. This function interpolates all networks to their overlapping frequency range, converts to T-Parameters, and cascades with matrix multiplication.
Here are two networks individually, an amplifier and band-pass filter
amp = readTouchstone("Amp.s2p")
bpf = readTouchstone("BPF.s2p")
ax = plotRectangular(amp,(2,1))
plotRectangular!(ax,bpf,(2,1))
And cascading Port 1 -> BPF -> Amp -> Port 2
system = cascade(bpf,amp)
plotRectangular!(ax,system,(2,1))
Cascading Data Networks with Equation-Driven Networks
Working with both data networks and equation driven networks can be tricky as mixing the two will always product a DataNetwork
Cascading any amount of equation-driven networks with a data network will always return a DataNetwork
. Just as before, the frequency of the result is the range that overlaps all the data networks or in the case of only one data network, the frequency range of that network.
function sillyFilter(f_center=1e9,rolloff=1;freq,Z0)
s21 = f_center / (abs(freq-f_center)+f_center)*rolloff
return [sqrt(1-s21^2) s21;s21 sqrt(1-s21^2)]
end
filter = EquationNetwork(2,50,sillyFilter)
amp = readTouchstone("Amp.s2p")
net = cascade(amp,filter)
ax = plotRectangular(net,(2,1),label="Cascaded S(2,1)")
plotRectangular!(ax,amp,(2,1),label="Amplifier S(2,1)")
plotRectangular!(ax,filter,(2,1),freqs=net.frequency,label="Filter S(2,1)")
ax["ylabel"] = "dB"