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