diff --git a/charon_vna/vna.py b/charon_vna/vna.py index 1cf54f5..3ea3552 100644 --- a/charon_vna/vna.py +++ b/charon_vna/vna.py @@ -2,7 +2,7 @@ import copy from enum import IntEnum, unique from pathlib import Path -from typing import Any, Callable, Dict, Literal, Tuple +from typing import Any, Callable, Dict, List, Literal, Tuple import adi import iio @@ -305,7 +305,16 @@ class Charon: return np.mean(data[1] / data[0]) - def capture(self, callback: Callable[int, int] | None = None): + def capture( + self, + callback: Callable[int, int] | None = None, + *, + measurements: List[Tuple[int, int]] = None, + ): + if measurements is None: + measurements = [(m, n) for n in self.ports for m in self.ports] + measurements = list(measurements) + s = xr.DataArray( np.zeros( [len(self.frequency), len(self.ports), len(self.ports)], @@ -319,30 +328,31 @@ class Charon: ), ) - total_count = len(s.m) * len(s.n) * len(s.frequency) + total_count = len(measurements) * len(s.frequency) count = 0 for m in s.m.data: for n in s.n.data: - self.set_switches(b=m - 1, a=n - 1) + if (m, n) in measurements: + self.set_switches(b=m - 1, a=n - 1) - for ff, freq in enumerate(s.frequency.data): - if callback is not None: - # report progress during sweep - callback(count, total_count) + for ff, freq in enumerate(s.frequency.data): + if callback is not None: + # report progress during sweep + callback(count, total_count) - self.set_output(frequency=freq, power=-5) - self.sdr.rx_destroy_buffer() - self.sdr.rx_lo = int(freq) - self.sdr.rx_enabled_channels = [0, 1] - self.sdr.gain_control_mode_chan0 = "manual" - self.sdr.gain_control_mode_chan1 = "manual" - self.sdr.rx_hardwaregain_chan0 = 40 - self.sdr.rx_hardwaregain_chan1 = 40 - rx = self.sdr.rx() - s.loc[dict(frequency=freq, m=m, n=n)] = np.mean(rx[1] / rx[0]) + self.set_output(frequency=freq, power=-5) + self.sdr.rx_destroy_buffer() + self.sdr.rx_lo = int(freq) + self.sdr.rx_enabled_channels = [0, 1] + self.sdr.gain_control_mode_chan0 = "manual" + self.sdr.gain_control_mode_chan1 = "manual" + self.sdr.rx_hardwaregain_chan0 = 40 + self.sdr.rx_hardwaregain_chan1 = 40 + rx = self.sdr.rx() + s.loc[dict(frequency=freq, m=m, n=n)] = np.mean(rx[1] / rx[0]) - count += 1 + count += 1 if callback is not None: # mark capture as complete diff --git a/charon_vna/vna_dev.py b/charon_vna/vna_dev.py index 4e8bdd2..3acff13 100644 --- a/charon_vna/vna_dev.py +++ b/charon_vna/vna_dev.py @@ -11,7 +11,7 @@ frequency = np.linspace(80e6, 280e6, 31) vna = Charon(frequency=frequency, ports=2) # %% -s = vna.capture() +s = vna.capture(measurements=[(2, 1), (2, 2)]) # %% for m in s.m.data: