Complex Data & Multi-Channel Support
Instrumation is designed to handle advanced RF measurements, including Vector Network Analysis (VNA) and Mixed Signal Oscilloscope (MSO) traces.
Complex (I/Q) Data
The MeasurementResult object supports complex numbers and numpy arrays. This is essential for Phase/Magnitude traces in VNAs.
Working with complex traces
with get_instrument(vna_addr, "VNA") as vna:
# get_complex_trace returns a list of complex numbers
res = vna.get_complex_trace("S21")
for val in res.value:
print(f"Real: {val.real}, Imag: {val.imag}")
Multi-Channel Measurements
Measurement results can now specify a channel or pod (for digital signals).
res = MeasurementResult(value=5.0, unit="V", channel=1)
print(res) # Output: 5.0 V [CH 1] (OK) @ ...
Oscilloscope Channel-Aware Measurements (v0.4.0)
All Oscilloscope drivers now expose channel-aware measurement methods:
with get_instrument(scope_addr, "SCOPE") as scope:
# Measure on default channel (1)
freq = scope.measure_frequency()
duty = scope.measure_duty_cycle()
vpp = scope.measure_v_peak_to_peak()
# Measure on explicit channel
freq_ch2 = scope.measure_frequency(channel=2)
duty_ch2 = scope.measure_duty_cycle(channel=2)
vpp_ch2 = scope.measure_v_peak_to_peak(channel=2)
This works on KeysightInfiniiVision, SiglentSDS, TektronixTDS, SimulatedOscilloscope, and ReplayDriver — all scope-type drivers respect the channel parameter.
NumPy Integration
If numpy is installed, MeasurementResult can store high-performance arrays directly in the value field. When converted to JSON (via to_json()), these arrays are automatically serialized to lists.
import numpy as np
trace = np.sin(np.linspace(0, 10, 100))
res = MeasurementResult(value=trace, unit="V")
# JSON output is ready for the VFP or data logging
print(res.to_json())