kopia lustrzana https://github.com/NanoVNA-Saver/nanovna-saver
Merge upstream/Development
commit
b5ca88e2c8
|
@ -485,7 +485,7 @@ class CalibrationWindow(QtWidgets.QWidget):
|
||||||
|
|
||||||
def setOffsetDelay(self, value: float):
|
def setOffsetDelay(self, value: float):
|
||||||
logger.debug("New offset delay value: %f ps", value)
|
logger.debug("New offset delay value: %f ps", value)
|
||||||
self.app.worker.offsetDelay = value / 10e12
|
self.app.worker.offsetDelay = value / 1e12
|
||||||
if len(self.app.worker.rawData11) > 0:
|
if len(self.app.worker.rawData11) > 0:
|
||||||
# There's raw data, so we can get corrected data
|
# There's raw data, so we can get corrected data
|
||||||
logger.debug("Applying new offset to existing sweep data.")
|
logger.debug("Applying new offset to existing sweep data.")
|
||||||
|
|
|
@ -3619,9 +3619,6 @@ class GroupDelayChart(FrequencyChart):
|
||||||
|
|
||||||
self.reflective = reflective
|
self.reflective = reflective
|
||||||
|
|
||||||
self.unwrappedData = []
|
|
||||||
self.unwrappedReference = []
|
|
||||||
|
|
||||||
self.groupDelay = []
|
self.groupDelay = []
|
||||||
self.groupDelayReference = []
|
self.groupDelayReference = []
|
||||||
|
|
||||||
|
@ -3640,6 +3637,8 @@ class GroupDelayChart(FrequencyChart):
|
||||||
def copy(self):
|
def copy(self):
|
||||||
new_chart: GroupDelayChart = super().copy()
|
new_chart: GroupDelayChart = super().copy()
|
||||||
new_chart.reflective = self.reflective
|
new_chart.reflective = self.reflective
|
||||||
|
new_chart.groupDelay = self.groupDelay.copy()
|
||||||
|
new_chart.groupDelayReference = self.groupDelay.copy()
|
||||||
return new_chart
|
return new_chart
|
||||||
|
|
||||||
def setReference(self, data):
|
def setReference(self, data):
|
||||||
|
@ -3662,18 +3661,19 @@ class GroupDelayChart(FrequencyChart):
|
||||||
rawReference.append(d.phase)
|
rawReference.append(d.phase)
|
||||||
|
|
||||||
if len(self.data) > 0:
|
if len(self.data) > 0:
|
||||||
self.unwrappedData = np.degrees(np.unwrap(rawData))
|
unwrappedData = np.degrees(np.unwrap(rawData))
|
||||||
self.groupDelay = []
|
self.groupDelay = []
|
||||||
for i in range(len(self.data)):
|
for i in range(len(self.data)):
|
||||||
|
# TODO: Replace with call to RFTools.groupDelay
|
||||||
if i == 0:
|
if i == 0:
|
||||||
phase_change = self.unwrappedData[1] - self.unwrappedData[0]
|
phase_change = unwrappedData[1] - unwrappedData[0]
|
||||||
freq_change = self.data[1].freq - self.data[0].freq
|
freq_change = self.data[1].freq - self.data[0].freq
|
||||||
elif i == len(self.data)-1:
|
elif i == len(self.data)-1:
|
||||||
idx = len(self.data)-1
|
idx = len(self.data)-1
|
||||||
phase_change = self.unwrappedData[idx] - self.unwrappedData[idx-1]
|
phase_change = unwrappedData[idx] - unwrappedData[idx-1]
|
||||||
freq_change = self.data[idx].freq - self.data[idx-1].freq
|
freq_change = self.data[idx].freq - self.data[idx-1].freq
|
||||||
else:
|
else:
|
||||||
phase_change = self.unwrappedData[i+1] - self.unwrappedData[i-1]
|
phase_change = unwrappedData[i+1] - unwrappedData[i-1]
|
||||||
freq_change = self.data[i+1].freq - self.data[i-1].freq
|
freq_change = self.data[i+1].freq - self.data[i-1].freq
|
||||||
delay = (-phase_change / (freq_change * 360)) * 10e8
|
delay = (-phase_change / (freq_change * 360)) * 10e8
|
||||||
if not self.reflective:
|
if not self.reflective:
|
||||||
|
@ -3681,18 +3681,18 @@ class GroupDelayChart(FrequencyChart):
|
||||||
self.groupDelay.append(delay)
|
self.groupDelay.append(delay)
|
||||||
|
|
||||||
if len(self.reference) > 0:
|
if len(self.reference) > 0:
|
||||||
self.unwrappedReference = np.degrees(np.unwrap(rawReference))
|
unwrappedReference = np.degrees(np.unwrap(rawReference))
|
||||||
self.groupDelayReference = []
|
self.groupDelayReference = []
|
||||||
for i in range(len(self.reference)):
|
for i in range(len(self.reference)):
|
||||||
if i == 0:
|
if i == 0:
|
||||||
phase_change = self.unwrappedReference[1] - self.unwrappedReference[0]
|
phase_change = unwrappedReference[1] - unwrappedReference[0]
|
||||||
freq_change = self.reference[1].freq - self.reference[0].freq
|
freq_change = self.reference[1].freq - self.reference[0].freq
|
||||||
elif i == len(self.reference)-1:
|
elif i == len(self.reference)-1:
|
||||||
idx = len(self.reference)-1
|
idx = len(self.reference)-1
|
||||||
phase_change = self.unwrappedReference[idx] - self.unwrappedReference[idx-1]
|
phase_change = unwrappedReference[idx] - unwrappedReference[idx-1]
|
||||||
freq_change = self.reference[idx].freq - self.reference[idx-1].freq
|
freq_change = self.reference[idx].freq - self.reference[idx-1].freq
|
||||||
else:
|
else:
|
||||||
phase_change = self.unwrappedReference[i+1] - self.unwrappedReference[i-1]
|
phase_change = unwrappedReference[i+1] - unwrappedReference[i-1]
|
||||||
freq_change = self.reference[i+1].freq - self.reference[i-1].freq
|
freq_change = self.reference[i+1].freq - self.reference[i-1].freq
|
||||||
delay = (-phase_change / (freq_change * 360)) * 10e8
|
delay = (-phase_change / (freq_change * 360)) * 10e8
|
||||||
if not self.reflective:
|
if not self.reflective:
|
||||||
|
|
|
@ -31,6 +31,7 @@ FMT_IND_CAP = SITools.Format(max_nr_digits=5, allow_strip=True)
|
||||||
FMT_GROUP_DELAY = SITools.Format(max_nr_digits=5)
|
FMT_GROUP_DELAY = SITools.Format(max_nr_digits=5)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def format_q_factor(val: float) -> str:
|
def format_q_factor(val: float) -> str:
|
||||||
if val < 0 or val > 10000.0:
|
if val < 0 or val > 10000.0:
|
||||||
return "\N{INFINITY}"
|
return "\N{INFINITY}"
|
||||||
|
@ -302,7 +303,7 @@ class Marker(QtCore.QObject):
|
||||||
|
|
||||||
min_distance = max_freq
|
min_distance = max_freq
|
||||||
for i in range(len(data)):
|
for i in range(len(data)):
|
||||||
if abs(data[i].freq - self.frequency) < min_distance:
|
if abs(data[i].freq - self.frequency) <= min_distance:
|
||||||
min_distance = abs(data[i].freq - self.frequency)
|
min_distance = abs(data[i].freq - self.frequency)
|
||||||
else:
|
else:
|
||||||
# We have now started moving away from the nearest point
|
# We have now started moving away from the nearest point
|
||||||
|
|
|
@ -68,8 +68,6 @@ class Datapoint(NamedTuple):
|
||||||
mag = abs(self.z)
|
mag = abs(self.z)
|
||||||
if mag == 1:
|
if mag == 1:
|
||||||
return 1
|
return 1
|
||||||
if mag > 1:
|
|
||||||
return math.inf
|
|
||||||
return (1 + mag) / (1 - mag)
|
return (1 + mag) / (1 - mag)
|
||||||
|
|
||||||
def impedance(self, ref_impedance: float = 50) -> complex:
|
def impedance(self, ref_impedance: float = 50) -> complex:
|
||||||
|
|
|
@ -168,14 +168,13 @@ class SweepWorker(QtCore.QRunnable):
|
||||||
self.signals.finished.emit()
|
self.signals.finished.emit()
|
||||||
return
|
return
|
||||||
|
|
||||||
def updateData(self, values11, values21, offset):
|
def updateData(self, values11, values21, offset, segment_size = 101):
|
||||||
# Update the data from (i*101) to (i+1)*101
|
# Update the data from (i*101) to (i+1)*101
|
||||||
# TODO: Get rid of the 101 point assumptions
|
|
||||||
logger.debug("Calculating data and inserting in existing data at offset %d", offset)
|
logger.debug("Calculating data and inserting in existing data at offset %d", offset)
|
||||||
for i in range(len(values11)):
|
for i in range(len(values11)):
|
||||||
re, im = values11[i]
|
re, im = values11[i]
|
||||||
re21, im21 = values21[i]
|
re21, im21 = values21[i]
|
||||||
freq = self.data11[offset*101 + i].freq
|
freq = self.data11[offset * segment_size + i].freq
|
||||||
rawData11 = Datapoint(freq, re, im)
|
rawData11 = Datapoint(freq, re, im)
|
||||||
rawData21 = Datapoint(freq, re21, im21)
|
rawData21 = Datapoint(freq, re21, im21)
|
||||||
# TODO: Use applyCalibration instead
|
# TODO: Use applyCalibration instead
|
||||||
|
@ -184,10 +183,10 @@ class SweepWorker(QtCore.QRunnable):
|
||||||
if self.app.calibration.isValid2Port():
|
if self.app.calibration.isValid2Port():
|
||||||
re21, im21 = self.app.calibration.correct21(re21, im21, freq)
|
re21, im21 = self.app.calibration.correct21(re21, im21, freq)
|
||||||
|
|
||||||
self.data11[offset*101 + i] = Datapoint(freq, re, im)
|
self.data11[offset * segment_size + i] = Datapoint(freq, re, im)
|
||||||
self.data21[offset * 101 + i] = Datapoint(freq, re21, im21)
|
self.data21[offset * segment_size + i] = Datapoint(freq, re21, im21)
|
||||||
self.rawData11[offset * 101 + i] = rawData11
|
self.rawData11[offset * segment_size + i] = rawData11
|
||||||
self.rawData21[offset * 101 + i] = rawData21
|
self.rawData21[offset * segment_size + i] = rawData21
|
||||||
logger.debug("Saving data to application (%d and %d points)", len(self.data11), len(self.data21))
|
logger.debug("Saving data to application (%d and %d points)", len(self.data11), len(self.data21))
|
||||||
self.app.saveData(self.data11, self.data21)
|
self.app.saveData(self.data11, self.data21)
|
||||||
logger.debug("Sending \"updated\" signal")
|
logger.debug("Sending \"updated\" signal")
|
||||||
|
|
|
@ -129,20 +129,17 @@ class Touchstone:
|
||||||
continue
|
continue
|
||||||
return line
|
return line
|
||||||
|
|
||||||
def _append_line_data(self, freq: float, data: list):
|
def _append_line_data(self, freq: int, data: list):
|
||||||
data_list = iter(self.sdata)
|
data_list = iter(self.sdata)
|
||||||
vals = iter(data)
|
vals = iter(data)
|
||||||
for v in vals:
|
for v in vals:
|
||||||
if self.opts.format == "ri":
|
if self.opts.format == "ri":
|
||||||
next(data_list).append(
|
next(data_list).append(Datapoint(freq, float(v), float(next(vals))))
|
||||||
Datapoint(freq, float(v), float(next(vals))))
|
|
||||||
if self.opts.format == "ma":
|
if self.opts.format == "ma":
|
||||||
z = cmath.polar(float(v),
|
z = cmath.rect(float(v), math.radians(float(next(vals))))
|
||||||
math.radians(float(next(vals))))
|
|
||||||
next(data_list).append(Datapoint(freq, z.real, z.imag))
|
next(data_list).append(Datapoint(freq, z.real, z.imag))
|
||||||
if self.opts.format == "db":
|
if self.opts.format == "db":
|
||||||
z = cmath.polar(math.exp(float(v) / 20),
|
z = cmath.rect(math.exp(float(v) / 20), math.radians(float(next(vals))))
|
||||||
math.radians(float(next(vals))))
|
|
||||||
next(data_list).append(Datapoint(freq, z.real, z.imag))
|
next(data_list).append(Datapoint(freq, z.real, z.imag))
|
||||||
|
|
||||||
def load(self):
|
def load(self):
|
||||||
|
@ -184,7 +181,7 @@ class Touchstone:
|
||||||
# ignore comments at data end
|
# ignore comments at data end
|
||||||
data = line.split('!')[0]
|
data = line.split('!')[0]
|
||||||
data = data.split()
|
data = data.split()
|
||||||
freq, data = float(data[0]) * self.opts.factor, data[1:]
|
freq, data = round(float(data[0]) * self.opts.factor), data[1:]
|
||||||
data_len = len(data)
|
data_len = len(data)
|
||||||
|
|
||||||
# consistency checks
|
# consistency checks
|
||||||
|
|
|
@ -14,5 +14,5 @@
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
version = '0.2.1alpha1'
|
version = '0.2.1'
|
||||||
debug = False
|
debug = False
|
||||||
|
|
Ładowanie…
Reference in New Issue