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 numpy as np
import skrf
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)