fixed frequency calibration constants: now on lines 55-75 calibration variables tweaked to match initial and calibrated frequency ranges
This commit is contained in:
@ -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,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user