Add the posibility of use an attenuator inline

with the S21 (CH1) input
original from
https://github.com/mihtjel/nanovna-saver/pull/145
pull/190/head
Mauro 2020-03-12 20:14:22 +01:00 zatwierdzone przez Mauro Gaioni
rodzic 7de2097519
commit 2ade3b65a2
3 zmienionych plików z 51 dodań i 2 usunięć

Wyświetl plik

@ -44,6 +44,7 @@ from .SweepWorker import SweepWorker
from .Settings import BandsModel
from .Touchstone import Touchstone
from .about import version as ver
from NanoVNASaver.RFTools import corrAttData
logger = logging.getLogger(__name__)
@ -57,6 +58,7 @@ class NanoVNASaver(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.s21att = 0.0
if getattr(sys, 'frozen', False):
logger.debug("Running from pyinstaller bundle")
self.icon = QtGui.QIcon(f"{sys._MEIPASS}/icon_48x48.png") # pylint: disable=no-member
@ -684,7 +686,11 @@ class NanoVNASaver(QtWidgets.QWidget):
def saveData(self, data, data12, source=None):
if self.dataLock.acquire(blocking=True):
self.data = data
self.data21 = data12
if self.s21att > 0:
corData12 = corrAttData(data12, self.s21att)
self.data21 = corData12
else:
self.data21 = data12
else:
logger.error("Failed acquiring data lock while saving.")
self.dataLock.release()

Wyświetl plik

@ -95,6 +95,7 @@ def parseFrequency(freq: str) -> int:
return -1
class Datapoint(NamedTuple):
freq: int
re: float
@ -173,3 +174,21 @@ class RFTools:
@staticmethod
def parseFrequency(freq: str) -> int:
return parseFrequency(freq)
def corrAttData(data: Datapoint, att: float):
"""Correct the ratio for a given attenuation on s21 input"""
if att <= 0:
return data
else:
att = 10**(att/20)
ndata = []
for i in range(len(data)):
freq, re, im = data[i]
orig = complex(re, im)
corrected = orig * att
ndata.append(Datapoint(freq, corrected.real, corrected.imag))
return ndata

Wyświetl plik

@ -73,14 +73,22 @@ class SweepSettingsWindow(QtWidgets.QWidget):
"Averaging allows discarding outlying samples to get better averages."))
settings_layout.addRow(
QtWidgets.QLabel("Common values are 3/0, 5/2, 9/4 and 25/6."))
self.s21att = QtWidgets.QLineEdit("0")
settings_layout.addRow(QtWidgets.QLabel(""))
settings_layout.addRow(QtWidgets.QLabel("Some times when you measure amplifiers you need to use an attenuator"))
settings_layout.addRow(QtWidgets.QLabel("in line with the S21 input (CH1) here you can specify it."))
settings_layout.addRow("Attenuator in port CH1 (s21) in dB", self.s21att)
settings_layout.addRow(QtWidgets.QLabel("Common values with un-un are 16.9 (49:1 2450) 9.54 (9:1 450)"))
self.continuous_sweep_radiobutton.toggled.connect(
lambda: self.app.worker.setContinuousSweep(
self.continuous_sweep_radiobutton.isChecked()))
self.averaged_sweep_radiobutton.toggled.connect(self.updateAveraging)
self.averages.textEdited.connect(self.updateAveraging)
self.truncates.textEdited.connect(self.updateAveraging)
self.s21att.textEdited.connect(self.setS21Attenuator)
layout.addWidget(settings_box)
band_sweep_box = QtWidgets.QGroupBox("Sweep band")
@ -145,6 +153,22 @@ class SweepSettingsWindow(QtWidgets.QWidget):
f"Sweep span: {RFTools.formatShortFrequency(start)}"
f" to {RFTools.formatShortFrequency(stop)}")
def setS21Attenuator(self):
try:
s21att = float(self.s21att.text())
except:
s21att = 0
if (s21att < 0):
logger.warning("Values for attenuator are absolute and with no minus sign, resetting.")
self.s21att.setText("0")
else:
logger.info("Setting an attenuator of %.2f dB inline with the CH1/S21 input", s21att)
self.app.s21att = s21att
def setBandSweep(self):
index_start = self.band_list.model().index(self.band_list.currentIndex(), 1)
index_stop = self.band_list.model().index(self.band_list.currentIndex(), 2)