From 553f1aae126c5d8215f9e14126fa0e5777cfce70 Mon Sep 17 00:00:00 2001 From: Theodor Chikin Date: Wed, 4 Mar 2026 17:15:15 +0300 Subject: [PATCH] fixed frequency calibration constants: now on lines 55-75 calibration variables tweaked to match initial and calibrated frequency ranges --- RFG_ADC_dataplotter.py | 52 +++++++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/RFG_ADC_dataplotter.py b/RFG_ADC_dataplotter.py index d783641..4bfdb7d 100755 --- a/RFG_ADC_dataplotter.py +++ b/RFG_ADC_dataplotter.py @@ -34,6 +34,8 @@ import numpy as np WF_WIDTH = 1000 # максимальное число точек в ряду водопада FFT_LEN = 1024 # длина БПФ для спектра/водопада спектров +SWEEP_FREQ_MIN_GHZ = 3.3 +SWEEP_FREQ_MAX_GHZ = 14.3 LOG_BASE = 10.0 LOG_SCALER = 0.001 # int32 значения приходят в fixed-point лог-шкале с шагом 1e-3 LOG_POSTSCALER = 1000 @@ -48,7 +50,27 @@ SweepInfo = Dict[str, Any] SweepData = Dict[str, np.ndarray] SweepAuxCurves = Optional[Tuple[np.ndarray, np.ndarray]] SweepPacket = Tuple[np.ndarray, SweepInfo, SweepAuxCurves] -CALIBRATION_C = np.asarray([0.0, 1.0, 0.025], dtype=np.float64) + + +CALIBRATION_C_BASE = np.asarray([0.0, 1.0, 0.025], dtype=np.float64) +_f0 = float(SWEEP_FREQ_MIN_GHZ) +_f1 = float(SWEEP_FREQ_MAX_GHZ) +_p0 = float(CALIBRATION_C_BASE[0] + CALIBRATION_C_BASE[1] * _f0 + CALIBRATION_C_BASE[2] * (_f0 ** 2)) +_p1 = float(CALIBRATION_C_BASE[0] + CALIBRATION_C_BASE[1] * _f1 + CALIBRATION_C_BASE[2] * (_f1 ** 2)) +if np.isfinite(_p0) and np.isfinite(_p1) and _p1 != _p0: + _cal_b = (_f1 - _f0) / (_p1 - _p0) + _cal_a = _f0 - _cal_b * _p0 + CALIBRATION_C = np.asarray( + [ + _cal_a + _cal_b * CALIBRATION_C_BASE[0], + _cal_b * CALIBRATION_C_BASE[1], + _cal_b * CALIBRATION_C_BASE[2], + ], + dtype=np.float64, + ) +else: + CALIBRATION_C = CALIBRATION_C_BASE.copy() + def _format_status_kv(data: Mapping[str, Any]) -> str: @@ -140,6 +162,10 @@ def calibrate_freqs(sweep: Mapping[str, Any]) -> SweepData: tmp = [] C = np.asarray(CALIBRATION_C, dtype=np.float64) + + + + for f in F: val = C[0] + (f**1) * C[1] + (f**2) * C[2] tmp.append(val) @@ -1499,15 +1525,15 @@ def main(): if ring is not None: return width = WF_WIDTH - x_shared = np.linspace(3.3, 14.3, width, dtype=np.float32) + x_shared = np.linspace(SWEEP_FREQ_MIN_GHZ, SWEEP_FREQ_MAX_GHZ, width, dtype=np.float32) ring = np.full((max_sweeps, width), np.nan, dtype=np.float32) ring_time = np.full((max_sweeps,), np.nan, dtype=np.float64) head = 0 # Обновляем изображение под новые размеры: время по X (горизонталь), X по Y img_obj.set_data(np.zeros((width, max_sweeps), dtype=np.float32)) - img_obj.set_extent((0, max_sweeps - 1, 3.3, 14.3)) + img_obj.set_extent((0, max_sweeps - 1, SWEEP_FREQ_MIN_GHZ, SWEEP_FREQ_MAX_GHZ)) ax_img.set_xlim(0, max_sweeps - 1) - ax_img.set_ylim(3.3, 14.3) + ax_img.set_ylim(SWEEP_FREQ_MIN_GHZ, SWEEP_FREQ_MAX_GHZ) # FFT буферы: время по X, бин по Y ring_fft = np.full((max_sweeps, fft_bins), np.nan, dtype=np.float32) img_fft_obj.set_data(np.zeros((fft_bins, max_sweeps), dtype=np.float32)) @@ -1623,7 +1649,7 @@ def main(): drained += 1 calibrated = calibrate_freqs( { - "F": np.linspace(3.3, 14.3, s.size, dtype=np.float64), + "F": np.linspace(SWEEP_FREQ_MIN_GHZ, SWEEP_FREQ_MAX_GHZ, s.size, dtype=np.float64), "I": s, } ) @@ -1764,11 +1790,11 @@ def main(): line_norm_obj.set_data(xs[: current_sweep_norm.size], current_sweep_norm) else: line_norm_obj.set_data([], []) - # Лимиты по X: 3.3 ГГц .. 14.3 ГГц + # Лимиты по X: номинальный диапазон свипа if isinstance(xs, np.ndarray) and xs.size > 0 and np.isfinite(xs[0]) and np.isfinite(xs[-1]): ax_line.set_xlim(float(np.nanmin(xs)), float(np.nanmax(xs))) else: - ax_line.set_xlim(3.3, 14.3) + ax_line.set_xlim(SWEEP_FREQ_MIN_GHZ, SWEEP_FREQ_MAX_GHZ) # Адаптивные Y-лимиты (если не задан --ylim) if fixed_ylim is None: y_series = [current_sweep_raw, last_calib_sweep, current_sweep_norm] @@ -2232,15 +2258,15 @@ def run_pyqtgraph(args): if ring is not None: return width = WF_WIDTH - x_shared = np.linspace(3.3, 14.3, width, dtype=np.float32) + x_shared = np.linspace(SWEEP_FREQ_MIN_GHZ, SWEEP_FREQ_MAX_GHZ, width, dtype=np.float32) ring = np.full((max_sweeps, width), np.nan, dtype=np.float32) ring_time = np.full((max_sweeps,), np.nan, dtype=np.float64) head = 0 - # Водопад: время по оси X, X по оси Y (ось Y: 3.3..14.3 ГГц) + # Водопад: время по оси X, X по оси Y (ось Y: номинальный диапазон свипа) img.setImage(ring.T, autoLevels=False) - img.setRect(0, 3.3, max_sweeps, 14.3 - 3.3) - p_img.setRange(xRange=(0, max_sweeps - 1), yRange=(3.3, 14.3), padding=0) - p_line.setXRange(3.3, 14.3, padding=0) + img.setRect(0, SWEEP_FREQ_MIN_GHZ, max_sweeps, SWEEP_FREQ_MAX_GHZ - SWEEP_FREQ_MIN_GHZ) + p_img.setRange(xRange=(0, max_sweeps - 1), yRange=(SWEEP_FREQ_MIN_GHZ, SWEEP_FREQ_MAX_GHZ), padding=0) + p_line.setXRange(SWEEP_FREQ_MIN_GHZ, SWEEP_FREQ_MAX_GHZ, padding=0) # FFT: время по оси X, бин по оси Y ring_fft = np.full((max_sweeps, fft_bins), np.nan, dtype=np.float32) img_fft.setImage(ring_fft.T, autoLevels=False) @@ -2364,7 +2390,7 @@ def run_pyqtgraph(args): drained += 1 calibrated = calibrate_freqs( { - "F": np.linspace(3.3, 14.3, s.size, dtype=np.float64), + "F": np.linspace(SWEEP_FREQ_MIN_GHZ, SWEEP_FREQ_MAX_GHZ, s.size, dtype=np.float64), "I": s, } )