fixed frequency calibration constants: now on lines 55-75 calibration variables tweaked to match initial and calibrated frequency ranges

This commit is contained in:
2026-03-04 17:15:15 +03:00
parent da144a6269
commit 553f1aae12

View File

@ -34,6 +34,8 @@ import numpy as np
WF_WIDTH = 1000 # максимальное число точек в ряду водопада WF_WIDTH = 1000 # максимальное число точек в ряду водопада
FFT_LEN = 1024 # длина БПФ для спектра/водопада спектров FFT_LEN = 1024 # длина БПФ для спектра/водопада спектров
SWEEP_FREQ_MIN_GHZ = 3.3
SWEEP_FREQ_MAX_GHZ = 14.3
LOG_BASE = 10.0 LOG_BASE = 10.0
LOG_SCALER = 0.001 # int32 значения приходят в fixed-point лог-шкале с шагом 1e-3 LOG_SCALER = 0.001 # int32 значения приходят в fixed-point лог-шкале с шагом 1e-3
LOG_POSTSCALER = 1000 LOG_POSTSCALER = 1000
@ -48,7 +50,27 @@ SweepInfo = Dict[str, Any]
SweepData = Dict[str, np.ndarray] SweepData = Dict[str, np.ndarray]
SweepAuxCurves = Optional[Tuple[np.ndarray, np.ndarray]] SweepAuxCurves = Optional[Tuple[np.ndarray, np.ndarray]]
SweepPacket = Tuple[np.ndarray, SweepInfo, SweepAuxCurves] 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: def _format_status_kv(data: Mapping[str, Any]) -> str:
@ -140,6 +162,10 @@ def calibrate_freqs(sweep: Mapping[str, Any]) -> SweepData:
tmp = [] tmp = []
C = np.asarray(CALIBRATION_C, dtype=np.float64) C = np.asarray(CALIBRATION_C, dtype=np.float64)
for f in F: for f in F:
val = C[0] + (f**1) * C[1] + (f**2) * C[2] val = C[0] + (f**1) * C[1] + (f**2) * C[2]
tmp.append(val) tmp.append(val)
@ -1499,15 +1525,15 @@ def main():
if ring is not None: if ring is not None:
return return
width = WF_WIDTH 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 = np.full((max_sweeps, width), np.nan, dtype=np.float32)
ring_time = np.full((max_sweeps,), np.nan, dtype=np.float64) ring_time = np.full((max_sweeps,), np.nan, dtype=np.float64)
head = 0 head = 0
# Обновляем изображение под новые размеры: время по X (горизонталь), X по Y # Обновляем изображение под новые размеры: время по X (горизонталь), X по Y
img_obj.set_data(np.zeros((width, max_sweeps), dtype=np.float32)) 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_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 # FFT буферы: время по X, бин по Y
ring_fft = np.full((max_sweeps, fft_bins), np.nan, dtype=np.float32) 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)) img_fft_obj.set_data(np.zeros((fft_bins, max_sweeps), dtype=np.float32))
@ -1623,7 +1649,7 @@ def main():
drained += 1 drained += 1
calibrated = calibrate_freqs( 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, "I": s,
} }
) )
@ -1764,11 +1790,11 @@ def main():
line_norm_obj.set_data(xs[: current_sweep_norm.size], current_sweep_norm) line_norm_obj.set_data(xs[: current_sweep_norm.size], current_sweep_norm)
else: else:
line_norm_obj.set_data([], []) 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]): 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))) ax_line.set_xlim(float(np.nanmin(xs)), float(np.nanmax(xs)))
else: else:
ax_line.set_xlim(3.3, 14.3) ax_line.set_xlim(SWEEP_FREQ_MIN_GHZ, SWEEP_FREQ_MAX_GHZ)
# Адаптивные Y-лимиты (если не задан --ylim) # Адаптивные Y-лимиты (если не задан --ylim)
if fixed_ylim is None: if fixed_ylim is None:
y_series = [current_sweep_raw, last_calib_sweep, current_sweep_norm] y_series = [current_sweep_raw, last_calib_sweep, current_sweep_norm]
@ -2232,15 +2258,15 @@ def run_pyqtgraph(args):
if ring is not None: if ring is not None:
return return
width = WF_WIDTH 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 = np.full((max_sweeps, width), np.nan, dtype=np.float32)
ring_time = np.full((max_sweeps,), np.nan, dtype=np.float64) ring_time = np.full((max_sweeps,), np.nan, dtype=np.float64)
head = 0 head = 0
# Водопад: время по оси X, X по оси Y (ось Y: 3.3..14.3 ГГц) # Водопад: время по оси X, X по оси Y (ось Y: номинальный диапазон свипа)
img.setImage(ring.T, autoLevels=False) img.setImage(ring.T, autoLevels=False)
img.setRect(0, 3.3, max_sweeps, 14.3 - 3.3) 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=(3.3, 14.3), padding=0) p_img.setRange(xRange=(0, max_sweeps - 1), yRange=(SWEEP_FREQ_MIN_GHZ, SWEEP_FREQ_MAX_GHZ), padding=0)
p_line.setXRange(3.3, 14.3, padding=0) p_line.setXRange(SWEEP_FREQ_MIN_GHZ, SWEEP_FREQ_MAX_GHZ, padding=0)
# FFT: время по оси X, бин по оси Y # FFT: время по оси X, бин по оси Y
ring_fft = np.full((max_sweeps, fft_bins), np.nan, dtype=np.float32) ring_fft = np.full((max_sweeps, fft_bins), np.nan, dtype=np.float32)
img_fft.setImage(ring_fft.T, autoLevels=False) img_fft.setImage(ring_fft.T, autoLevels=False)
@ -2364,7 +2390,7 @@ def run_pyqtgraph(args):
drained += 1 drained += 1
calibrated = calibrate_freqs( 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, "I": s,
} }
) )