¿ªÔÆÌåÓý

ctrl + shift + ? for shortcuts
© 2025 Groups.io

Re: 6ghz unit available? - calibration strategies


 

On 9/7/21 5:13 AM, Donald S Brant Jr wrote:
I have one of the LibreVNA units and it is working satisfactorily for me, but the provided calibration standards and/or their definitions, provided by Kurt Poulsen, only work up to about 3.8GHz; the calibration "falls apart" above that.
I have ordered a set of calibration standards from Dr. David Kirkby at Kirkby Microwave and they should work better at the higher frequencies. A set of calibration standards from Keysight, Anritsu, Maury Microwave, Rohde & Schwarz and others should also be suitable if they are available. It is important that correct and accurate calibration kit standards definitions are available and are entered into the analyzer's calibration routine. If incorrect or inaccurate definitions are used even the best standards will give erroneous results.
73, Don N2VGU.
One thing that not all the software supports, but one can tinker a bit with scikit-rf and achieve, is that you can use fairly "bad" cal standards, as long as they're repeatable and if you measure the standards "somewhere else".

Sure, a perfect open, short, load, and thru with known perfect impedances and physical offsets is sort of the "easiest" (and the one used by the NanoVNA "out of the box")

But it's entirely possible to take a load, go measure it on a "really good VNA" (maybe at work, or a friend has one, or ...) and then use that measurement in the calibration process.


Here's an example in python

""" measured standards"""

cableopen = rf.Network('cable1open.s1p')
cableshort = rf.Network('cable1short.s1p')
cableload = rf.Network('cable1load.s1p')

plt.figure()
cableopen.plot_s_db(logx=True)
cableshort.plot_s_db(logx=True)
cableload.plot_s_db(logx=True)
plt.title('RG-8 25ft')
plt.grid()

""" what you want """

idealshort = rf.Network()
idealshort.copy_from(cableopen)
idealshort.name='Ideal short'
idealshort.s = idealshort.s * 0 -1
idealload = rf.Network()
idealload.copy_from(cableopen)
idealload.name='Ideal load'
idealload.s = idealshort.s * 0
idealopen = rf.Network()
idealopen.copy_from(cableopen)
idealopen.name='Ideal open'
idealopen.s = idealopen.s * 0 +1

""" build cal sets from short open load """

ideals = [idealshort,idealopen,idealload]
measuredcable = [cableshort,cableopen,cableload]
calcable = rf.OnePort(ideals=ideals,measured=measuredcable)
calcable.run()

---

and then you can use that calibration set

""" read in the raw measurements """
""" then calibrate """
plt.figure()
dut = rf.Network('test6ant.s1p')
dut.frequency.unit='mhz'
dut.plot_s_db(logx=True)

dut_cal = calcable.apply_cal(dut)
dut_cal.frequency.unit = 'mhz'
dut_cal.name=dut_cal.name + ' calibrated'
dut_cal.plot_s_db()
plt.grid(True)
rf.plotting.shade_bands(justbands,cmap=bandcmap,alpha=0.1)

Join [email protected] to automatically receive all group messages.