diff --git a/rfg_vna_viewer.py b/rfg_vna_viewer.py index 6949cd0..c55b2cf 100644 --- a/rfg_vna_viewer.py +++ b/rfg_vna_viewer.py @@ -202,13 +202,16 @@ def build_gui(): p_norm.setXLink(p_raw) c_norm_amp = p_norm.plot(pen=pg.mkPen((80, 120, 255), width=1)) - # Row 3: normalized phase + # Row 3: normalized phase + linear fit + deviation p_ph = win.addPlot(row=3, col=0, title="Нормированная фаза arg(S)") p_ph.showGrid(x=True, y=True, alpha=0.3) p_ph.setLabel("bottom", "Частота", units="ГГц") p_ph.setLabel("left", "Фаза", units="рад") p_ph.setXLink(p_raw) - c_ph = p_ph.plot(pen=pg.mkPen((230, 180, 40), width=1)) + p_ph.addLegend(offset=(10, 10)) + c_ph = p_ph.plot(pen=pg.mkPen((230, 180, 40), width=1), name="Фаза") + c_ph_line = p_ph.plot(pen=pg.mkPen((180, 180, 180), width=1, style=QtCore.Qt.DashLine), name="Лин. прибл.") + c_ph_dev = p_ph.plot(pen=pg.mkPen((255, 100, 200), width=1), name="Отклонение") # Row 4: FFT distance p_fft = win.addPlot(row=4, col=0, title="FFT — расстояние") @@ -217,15 +220,17 @@ def build_gui(): p_fft.setLabel("left", "Магнитуда", units="дБ") c_fft = p_fft.plot(pen=pg.mkPen((60, 200, 80), width=1)) - return app, win, (c_main_amp, c_ref_amp, c_norm_ch1, c_norm_ch2, c_norm_amp, c_ph, c_fft) + plots = [p_raw, p_ch, p_norm, p_ph, p_fft] + curves = (c_main_amp, c_ref_amp, c_norm_ch1, c_norm_ch2, c_norm_amp, c_ph, c_ph_line, c_ph_dev, c_fft) + return app, win, curves, plots # --------------------------------------------------------------------------- # Update loop # --------------------------------------------------------------------------- -def make_update(reader, parser, assembler, curves): - c_main_amp, c_ref_amp, c_norm_ch1, c_norm_ch2, c_norm_amp, c_ph, c_fft = curves - state = {"ref_phase_first": None} +def make_update(reader, parser, assembler, curves, plots): + c_main_amp, c_ref_amp, c_norm_ch1, c_norm_ch2, c_norm_amp, c_ph, c_ph_line, c_ph_dev, c_fft = curves + state = {"ref_phase_first": None, "axes_locked": False} queue = deque(maxlen=64) def update(): @@ -269,9 +274,21 @@ def make_update(reader, parser, assembler, curves): c_norm_amp.setData(freqs_ghz, norm_amp) c_ph.setData(freqs_ghz, phase) + # Linear fit (line through first and last point) + deviation + line = np.linspace(phase[0], phase[-1], len(phase)) + deviation = phase - line + c_ph_line.setData(freqs_ghz, line) + c_ph_dev.setData(freqs_ghz, deviation) + fft_db = 20.0 * np.log10(fft_mag + 1e-12) c_fft.setData(fft_dist, fft_db) + # Lock axes after first sweep + if not state["axes_locked"]: + state["axes_locked"] = True + for p in plots: + p.enableAutoRange(False) + return update @@ -283,9 +300,9 @@ def main(): reader = DataReader(path) parser = LegacyBinaryParser(batch_events=True) assembler = SweepAssembler(fancy=False, apply_inversion=False) - app, win, curves = build_gui() + app, win, curves, plots = build_gui() - update = make_update(reader, parser, assembler, curves) + update = make_update(reader, parser, assembler, curves, plots) timer = QtCore.QTimer() timer.timeout.connect(update) timer.start(TIMER_MS)