# Ex2: Measured 190 GHz Active 2-Port

The Vector Fitting feature is demonstrated using a 2-port S-matrix of an active circuit measured from 140 GHz to 220 GHz. Additional explanations and background information can be found in the Vector Fitting tutorial.

[1]:

import skrf
import numpy as np
import matplotlib.pyplot as mplt


This example is a lot more tricky to fit, because the responses contain a few “bumps” and noise from the measurement. In such a case, finding a good number of initial poles can take a few iterations. A good alternative for such cases is the automatic vector fitting feature, auto_fit(), which automatically refines the number of poles until a good fit is achieved.

Load the Network from a Touchstone file and create the Vector Fitting instance and start the automatic fit:

[2]:

nw = skrf.network.Network('./190ghz_tx_measured.S2P')
vf = skrf.VectorFitting(nw)
vf.auto_fit()


The function plot_convergence() can be helpful to examine the convergence and see if something was going wrong. Important parameters to check are the number of iterations until convergence and the final model order.

[3]:

vf.plot_convergence()

[4]:

print(f'model order = {vf.get_model_order(vf.poles)}')
print(f'n_poles_real = {np.sum(vf.poles.imag == 0.0)}')
print(f'n_poles_complex = {np.sum(vf.poles.imag > 0.0)}')

model order = 15
n_poles_real = 1
n_poles_complex = 7


Checking the results by comparing the model responses to the original sampled data indicates a successful fit, which is also indicated by a small rms error (less than 0.05):

[5]:

vf.get_rms_error()

[5]:

np.float64(0.014023443772011032)

[6]:

# plot frequency responses
vf.plot_s_db()


It is a good idea to also check the model response well outside the original frequency range.

[7]:

freqs = np.linspace(0, 500e9, 501) # plot model response from dc to 500 GHz
vf.plot_s_db(freqs=freqs)