kopia lustrzana https://github.com/NanoVNA-Saver/nanovna-saver
Add the posibility of use an attenuator inline
with the S21 (CH1) input original from https://github.com/mihtjel/nanovna-saver/pull/145pull/190/head
rodzic
7de2097519
commit
2ade3b65a2
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Ładowanie…
Reference in New Issue