From 415084e66bd673d15f364fea311c3a478388334d Mon Sep 17 00:00:00 2001 From: awe Date: Wed, 11 Feb 2026 13:21:37 +0300 Subject: [PATCH] graph upd --- RFG_ADC_dataplotter.py | 46 ++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/RFG_ADC_dataplotter.py b/RFG_ADC_dataplotter.py index b3ab06d..4940020 100755 --- a/RFG_ADC_dataplotter.py +++ b/RFG_ADC_dataplotter.py @@ -610,7 +610,7 @@ def main(): line_calib_obj, = ax_line.plot([], [], lw=1, color="tab:red") line_norm_obj, = ax_line.plot([], [], lw=1, color="tab:green") ax_line.set_title("Сырые данные", pad=1) - ax_line.set_xlabel("F") + ax_line.set_xlabel("ГГц") ax_line.set_ylabel("") channel_text = ax_line.text( 0.98, @@ -626,8 +626,8 @@ def main(): # Линейный график спектра текущего свипа fft_line_obj, = ax_fft.plot([], [], lw=1) ax_fft.set_title("FFT", pad=1) - ax_fft.set_xlabel("X") - ax_fft.set_ylabel("Амплитуда, дБ") + ax_fft.set_xlabel("Время") + ax_fft.set_ylabel("дБ") # Диапазон по Y для последнего свипа: авто по умолчанию (поддерживает отрицательные значения) fixed_ylim: Optional[Tuple[float, float]] = None @@ -651,7 +651,7 @@ def main(): ) ax_img.set_title("Сырые данные", pad=12) ax_img.set_xlabel("") - ax_img.set_ylabel("частота") + ax_img.set_ylabel("ГГц") # Не показываем численные значения по времени на водопаде сырых данных try: ax_img.tick_params(axis="x", labelbottom=False) @@ -734,15 +734,15 @@ def main(): if ring is not None: return width = WF_WIDTH - x_shared = np.arange(width, dtype=np.int32) + x_shared = np.linspace(3.3, 14.3, 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, 0, width - 1 if width > 0 else 1)) + img_obj.set_extent((0, max_sweeps - 1, 3.3, 14.3)) ax_img.set_xlim(0, max_sweeps - 1) - ax_img.set_ylim(0, max(1, width - 1)) + ax_img.set_ylim(3.3, 14.3) # 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)) @@ -814,7 +814,7 @@ def main(): # Окно Хэннинга win = np.hanning(take_fft).astype(np.float32) fft_in[:take_fft] = seg * win - spec = np.fft.rfft(fft_in) + spec = np.fft.ifft(fft_in) mag = np.abs(spec).astype(np.float32) fft_row = 20.0 * np.log10(mag + 1e-9) if fft_row.shape[0] != bins: @@ -917,8 +917,8 @@ def main(): line_norm_obj.set_data(xs[: current_sweep_norm.size], current_sweep_norm) else: line_norm_obj.set_data([], []) - # Лимиты по X постоянные под текущую ширину - ax_line.set_xlim(0, max(1, current_sweep_raw.size - 1)) + # Лимиты по X: 3.3 ГГц .. 14.3 ГГц + ax_line.set_xlim(3.3, 14.3) # Адаптивные Y-лимиты (если не задан --ylim) if fixed_ylim is None: y0 = float(np.nanmin(current_sweep_raw)) @@ -942,7 +942,7 @@ def main(): 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) fft_in[:take_fft] = seg * win - spec = np.fft.rfft(fft_in) + spec = np.fft.ifft(fft_in) mag = np.abs(spec).astype(np.float32) fft_vals = 20.0 * np.log10(mag + 1e-9) xs_fft = freq_shared @@ -951,7 +951,7 @@ def main(): fft_line_obj.set_data(xs_fft[: fft_vals.size], fft_vals) # Авто-диапазон по Y для спектра 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)) + ax_fft.set_xlim(0, max(1, xs_fft.size - 1) * 1.5) ax_fft.set_ylim(float(np.nanmin(fft_vals)), float(np.nanmax(fft_vals))) # Обновление водопада @@ -1077,7 +1077,7 @@ def run_pyqtgraph(args): 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_norm = p_line.plot(pen=pg.mkPen((60, 180, 90), width=1)) - p_line.setLabel("bottom", "X") + p_line.setLabel("bottom", "ГГц") p_line.setLabel("left", "Y") ch_text = pg.TextItem("", anchor=(1, 1)) ch_text.setZValue(10) @@ -1092,7 +1092,7 @@ def run_pyqtgraph(args): p_img.getAxis("bottom").setStyle(showValues=False) except Exception: pass - p_img.setLabel("left", "X (0 снизу)") + p_img.setLabel("left", "ГГц") img = pg.ImageItem() p_img.addItem(img) @@ -1100,8 +1100,8 @@ def run_pyqtgraph(args): p_fft = win.addPlot(row=1, col=0, title="FFT") p_fft.showGrid(x=True, y=True, alpha=0.3) curve_fft = p_fft.plot(pen=pg.mkPen((255, 120, 80), width=1)) - p_fft.setLabel("bottom", "Бин") - p_fft.setLabel("left", "Амплитуда, дБ") + p_fft.setLabel("bottom", "Время") + p_fft.setLabel("left", "дБ") # Водопад спектров (справа-снизу) p_spec = win.addPlot(row=1, col=1, title="B-scan (дБ)") @@ -1188,14 +1188,15 @@ def run_pyqtgraph(args): if ring is not None: return width = WF_WIDTH - x_shared = np.arange(width, dtype=np.int32) + x_shared = np.linspace(3.3, 14.3, 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 + # Водопад: время по оси X, X по оси Y (ось Y: 3.3..14.3 ГГц) img.setImage(ring.T, autoLevels=False) - p_img.setRange(xRange=(0, max_sweeps - 1), yRange=(0, max(1, width - 1)), padding=0) - p_line.setXRange(0, max(1, width - 1), padding=0) + 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) # FFT: время по оси X, бин по оси Y ring_fft = np.full((max_sweeps, fft_bins), np.nan, dtype=np.float32) img_fft.setImage(ring_fft.T, autoLevels=False) @@ -1255,7 +1256,7 @@ def run_pyqtgraph(args): seg = np.nan_to_num(s[:take_fft], nan=0.0).astype(np.float32, copy=False) win = np.hanning(take_fft).astype(np.float32) fft_in[:take_fft] = seg * win - spec = np.fft.rfft(fft_in) + spec = np.fft.ifft(fft_in) mag = np.abs(spec).astype(np.float32) fft_row = 20.0 * np.log10(mag + 1e-9) if fft_row.shape[0] != bins: @@ -1341,13 +1342,14 @@ def run_pyqtgraph(args): 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) fft_in[:take_fft] = seg * win - spec = np.fft.rfft(fft_in) + spec = np.fft.ifft(fft_in) mag = np.abs(spec).astype(np.float32) fft_vals = 20.0 * np.log10(mag + 1e-9) xs_fft = freq_shared if fft_vals.size > xs_fft.size: fft_vals = fft_vals[: xs_fft.size] 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) if changed and ring is not None: