Compare commits
1 Commits
master
...
64c813bf02
| Author | SHA1 | Date | |
|---|---|---|---|
| 64c813bf02 |
@ -727,7 +727,7 @@ def main():
|
|||||||
line_calib_obj, = ax_line.plot([], [], lw=1, color="tab:red")
|
line_calib_obj, = ax_line.plot([], [], lw=1, color="tab:red")
|
||||||
line_norm_obj, = ax_line.plot([], [], lw=1, color="tab:green")
|
line_norm_obj, = ax_line.plot([], [], lw=1, color="tab:green")
|
||||||
ax_line.set_title("Сырые данные", pad=1)
|
ax_line.set_title("Сырые данные", pad=1)
|
||||||
ax_line.set_xlabel("ГГц")
|
ax_line.set_xlabel("F")
|
||||||
ax_line.set_ylabel("")
|
ax_line.set_ylabel("")
|
||||||
channel_text = ax_line.text(
|
channel_text = ax_line.text(
|
||||||
0.98,
|
0.98,
|
||||||
@ -743,8 +743,8 @@ def main():
|
|||||||
# Линейный график спектра текущего свипа
|
# Линейный график спектра текущего свипа
|
||||||
fft_line_obj, = ax_fft.plot([], [], lw=1)
|
fft_line_obj, = ax_fft.plot([], [], lw=1)
|
||||||
ax_fft.set_title("FFT", pad=1)
|
ax_fft.set_title("FFT", pad=1)
|
||||||
ax_fft.set_xlabel("Время")
|
ax_fft.set_xlabel("X")
|
||||||
ax_fft.set_ylabel("дБ")
|
ax_fft.set_ylabel("Амплитуда, дБ")
|
||||||
|
|
||||||
# Диапазон по Y для последнего свипа: авто по умолчанию (поддерживает отрицательные значения)
|
# Диапазон по Y для последнего свипа: авто по умолчанию (поддерживает отрицательные значения)
|
||||||
fixed_ylim: Optional[Tuple[float, float]] = None
|
fixed_ylim: Optional[Tuple[float, float]] = None
|
||||||
@ -768,7 +768,7 @@ def main():
|
|||||||
)
|
)
|
||||||
ax_img.set_title("Сырые данные", pad=12)
|
ax_img.set_title("Сырые данные", pad=12)
|
||||||
ax_img.set_xlabel("")
|
ax_img.set_xlabel("")
|
||||||
ax_img.set_ylabel("ГГц")
|
ax_img.set_ylabel("частота")
|
||||||
# Не показываем численные значения по времени на водопаде сырых данных
|
# Не показываем численные значения по времени на водопаде сырых данных
|
||||||
try:
|
try:
|
||||||
ax_img.tick_params(axis="x", labelbottom=False)
|
ax_img.tick_params(axis="x", labelbottom=False)
|
||||||
@ -845,15 +845,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.arange(width, dtype=np.int32)
|
||||||
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, 0, width - 1 if width > 0 else 1))
|
||||||
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(0, max(1, width - 1))
|
||||||
# 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))
|
||||||
@ -925,7 +925,7 @@ def main():
|
|||||||
# Окно Хэннинга
|
# Окно Хэннинга
|
||||||
win = np.hanning(take_fft).astype(np.float32)
|
win = np.hanning(take_fft).astype(np.float32)
|
||||||
fft_in[:take_fft] = seg * win
|
fft_in[:take_fft] = seg * win
|
||||||
spec = np.fft.ifft(fft_in)
|
spec = np.fft.rfft(fft_in)
|
||||||
mag = np.abs(spec).astype(np.float32)
|
mag = np.abs(spec).astype(np.float32)
|
||||||
fft_row = 20.0 * np.log10(mag + 1e-9)
|
fft_row = 20.0 * np.log10(mag + 1e-9)
|
||||||
if fft_row.shape[0] != bins:
|
if fft_row.shape[0] != bins:
|
||||||
@ -1028,8 +1028,8 @@ 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 постоянные под текущую ширину
|
||||||
ax_line.set_xlim(3.3, 14.3)
|
ax_line.set_xlim(0, max(1, current_sweep_raw.size - 1))
|
||||||
# Адаптивные Y-лимиты (если не задан --ylim)
|
# Адаптивные Y-лимиты (если не задан --ylim)
|
||||||
if fixed_ylim is None:
|
if fixed_ylim is None:
|
||||||
y0 = float(np.nanmin(current_sweep_raw))
|
y0 = float(np.nanmin(current_sweep_raw))
|
||||||
@ -1053,7 +1053,7 @@ def main():
|
|||||||
seg = np.nan_to_num(sweep_for_fft[:take_fft], nan=0.0).astype(np.float32, copy=False)
|
seg = np.nan_to_num(sweep_for_fft[:take_fft], nan=0.0).astype(np.float32, copy=False)
|
||||||
win = np.hanning(take_fft).astype(np.float32)
|
win = np.hanning(take_fft).astype(np.float32)
|
||||||
fft_in[:take_fft] = seg * win
|
fft_in[:take_fft] = seg * win
|
||||||
spec = np.fft.ifft(fft_in)
|
spec = np.fft.rfft(fft_in)
|
||||||
mag = np.abs(spec).astype(np.float32)
|
mag = np.abs(spec).astype(np.float32)
|
||||||
fft_vals = 20.0 * np.log10(mag + 1e-9)
|
fft_vals = 20.0 * np.log10(mag + 1e-9)
|
||||||
xs_fft = freq_shared
|
xs_fft = freq_shared
|
||||||
@ -1062,7 +1062,7 @@ def main():
|
|||||||
fft_line_obj.set_data(xs_fft[: fft_vals.size], fft_vals)
|
fft_line_obj.set_data(xs_fft[: fft_vals.size], fft_vals)
|
||||||
# Авто-диапазон по Y для спектра
|
# Авто-диапазон по Y для спектра
|
||||||
if np.isfinite(np.nanmin(fft_vals)) and np.isfinite(np.nanmax(fft_vals)):
|
if np.isfinite(np.nanmin(fft_vals)) and np.isfinite(np.nanmax(fft_vals)):
|
||||||
ax_fft.set_xlim(0, max(1, xs_fft.size - 1) * 1.5)
|
ax_fft.set_xlim(0, max(1, xs_fft.size - 1))
|
||||||
ax_fft.set_ylim(float(np.nanmin(fft_vals)), float(np.nanmax(fft_vals)))
|
ax_fft.set_ylim(float(np.nanmin(fft_vals)), float(np.nanmax(fft_vals)))
|
||||||
|
|
||||||
# Обновление водопада
|
# Обновление водопада
|
||||||
@ -1188,7 +1188,7 @@ def run_pyqtgraph(args):
|
|||||||
curve = p_line.plot(pen=pg.mkPen((80, 120, 255), width=1))
|
curve = p_line.plot(pen=pg.mkPen((80, 120, 255), width=1))
|
||||||
curve_calib = p_line.plot(pen=pg.mkPen((220, 60, 60), width=1))
|
curve_calib = p_line.plot(pen=pg.mkPen((220, 60, 60), width=1))
|
||||||
curve_norm = p_line.plot(pen=pg.mkPen((60, 180, 90), width=1))
|
curve_norm = p_line.plot(pen=pg.mkPen((60, 180, 90), width=1))
|
||||||
p_line.setLabel("bottom", "ГГц")
|
p_line.setLabel("bottom", "X")
|
||||||
p_line.setLabel("left", "Y")
|
p_line.setLabel("left", "Y")
|
||||||
ch_text = pg.TextItem("", anchor=(1, 1))
|
ch_text = pg.TextItem("", anchor=(1, 1))
|
||||||
ch_text.setZValue(10)
|
ch_text.setZValue(10)
|
||||||
@ -1203,7 +1203,7 @@ def run_pyqtgraph(args):
|
|||||||
p_img.getAxis("bottom").setStyle(showValues=False)
|
p_img.getAxis("bottom").setStyle(showValues=False)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
p_img.setLabel("left", "ГГц")
|
p_img.setLabel("left", "X (0 снизу)")
|
||||||
img = pg.ImageItem()
|
img = pg.ImageItem()
|
||||||
p_img.addItem(img)
|
p_img.addItem(img)
|
||||||
|
|
||||||
@ -1211,8 +1211,8 @@ def run_pyqtgraph(args):
|
|||||||
p_fft = win.addPlot(row=1, col=0, title="FFT")
|
p_fft = win.addPlot(row=1, col=0, title="FFT")
|
||||||
p_fft.showGrid(x=True, y=True, alpha=0.3)
|
p_fft.showGrid(x=True, y=True, alpha=0.3)
|
||||||
curve_fft = p_fft.plot(pen=pg.mkPen((255, 120, 80), width=1))
|
curve_fft = p_fft.plot(pen=pg.mkPen((255, 120, 80), width=1))
|
||||||
p_fft.setLabel("bottom", "Время")
|
p_fft.setLabel("bottom", "Бин")
|
||||||
p_fft.setLabel("left", "дБ")
|
p_fft.setLabel("left", "Амплитуда, дБ")
|
||||||
|
|
||||||
# Водопад спектров (справа-снизу)
|
# Водопад спектров (справа-снизу)
|
||||||
p_spec = win.addPlot(row=1, col=1, title="B-scan (дБ)")
|
p_spec = win.addPlot(row=1, col=1, title="B-scan (дБ)")
|
||||||
@ -1293,15 +1293,14 @@ 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.arange(width, dtype=np.int32)
|
||||||
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
|
||||||
img.setImage(ring.T, autoLevels=False)
|
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=(0, max(1, width - 1)), padding=0)
|
||||||
p_img.setRange(xRange=(0, max_sweeps - 1), yRange=(3.3, 14.3), padding=0)
|
p_line.setXRange(0, max(1, width - 1), padding=0)
|
||||||
p_line.setXRange(3.3, 14.3, 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)
|
||||||
@ -1361,7 +1360,7 @@ def run_pyqtgraph(args):
|
|||||||
seg = np.nan_to_num(s[:take_fft], nan=0.0).astype(np.float32, copy=False)
|
seg = np.nan_to_num(s[:take_fft], nan=0.0).astype(np.float32, copy=False)
|
||||||
win = np.hanning(take_fft).astype(np.float32)
|
win = np.hanning(take_fft).astype(np.float32)
|
||||||
fft_in[:take_fft] = seg * win
|
fft_in[:take_fft] = seg * win
|
||||||
spec = np.fft.ifft(fft_in)
|
spec = np.fft.rfft(fft_in)
|
||||||
mag = np.abs(spec).astype(np.float32)
|
mag = np.abs(spec).astype(np.float32)
|
||||||
fft_row = 20.0 * np.log10(mag + 1e-9)
|
fft_row = 20.0 * np.log10(mag + 1e-9)
|
||||||
if fft_row.shape[0] != bins:
|
if fft_row.shape[0] != bins:
|
||||||
@ -1447,14 +1446,13 @@ def run_pyqtgraph(args):
|
|||||||
seg = np.nan_to_num(sweep_for_fft[:take_fft], nan=0.0).astype(np.float32, copy=False)
|
seg = np.nan_to_num(sweep_for_fft[:take_fft], nan=0.0).astype(np.float32, copy=False)
|
||||||
win = np.hanning(take_fft).astype(np.float32)
|
win = np.hanning(take_fft).astype(np.float32)
|
||||||
fft_in[:take_fft] = seg * win
|
fft_in[:take_fft] = seg * win
|
||||||
spec = np.fft.ifft(fft_in)
|
spec = np.fft.rfft(fft_in)
|
||||||
mag = np.abs(spec).astype(np.float32)
|
mag = np.abs(spec).astype(np.float32)
|
||||||
fft_vals = 20.0 * np.log10(mag + 1e-9)
|
fft_vals = 20.0 * np.log10(mag + 1e-9)
|
||||||
xs_fft = freq_shared
|
xs_fft = freq_shared
|
||||||
if fft_vals.size > xs_fft.size:
|
if fft_vals.size > xs_fft.size:
|
||||||
fft_vals = fft_vals[: xs_fft.size]
|
fft_vals = fft_vals[: xs_fft.size]
|
||||||
curve_fft.setData(xs_fft[: fft_vals.size], fft_vals)
|
curve_fft.setData(xs_fft[: fft_vals.size], fft_vals)
|
||||||
p_fft.setXRange(0, max(1, xs_fft.size - 1) * 1.5, padding=0)
|
|
||||||
p_fft.setYRange(float(np.nanmin(fft_vals)), float(np.nanmax(fft_vals)), padding=0)
|
p_fft.setYRange(float(np.nanmin(fft_vals)), float(np.nanmax(fft_vals)), padding=0)
|
||||||
|
|
||||||
if changed and ring is not None:
|
if changed and ring is not None:
|
||||||
|
|||||||
Reference in New Issue
Block a user