From 33e1976233e2bd7794029003b7d9d2d52fbf25f1 Mon Sep 17 00:00:00 2001 From: awe Date: Thu, 26 Feb 2026 16:57:07 +0300 Subject: [PATCH] remove half junk from spectre --- calib_envelope.npy | Bin 3164 -> 3164 bytes rfg_adc_plotter/constants.py | 2 +- rfg_adc_plotter/processing/fourier.py | 7 +++---- rfg_adc_plotter/state/ring_buffer.py | 7 +++++++ 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/calib_envelope.npy b/calib_envelope.npy index 1628af64c25c6d2093545574ae784bd1e490841f..394f3f936a61f988a874964ec6d9aee01b5ff1ca 100644 GIT binary patch literal 3164 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 np.ndarray: """Построить частотную сетку (Гц) для текущей длины свипа.""" n = int(sweep_width) if n <= 0: - return np.zeros((0,), dtype=np.float64) + return np.zeros((0,), dtype=np.float128) if n == 1: return np.array([FREQ_MIN_GHZ * 1e9], dtype=np.float64) return np.linspace(FREQ_MIN_GHZ * 1e9, FREQ_MAX_GHZ * 1e9, n, dtype=np.float64) @@ -101,7 +101,6 @@ def unwrap_arccos_phase_continuous(x_norm: np.ndarray) -> np.ndarray: phi0 = np.arccos(x) out = np.empty_like(phi0, dtype=np.float64) - out[0] = float(phi0[0]) for i in range(1, phi0.size): base_phi = float(phi0[i]) prev = float(out[i - 1]) @@ -125,7 +124,7 @@ def unwrap_arccos_phase_continuous(x_norm: np.ndarray) -> np.ndarray: out[i] = prev if best_cand is None else float(best_cand) return out - + return phi0 def reconstruct_complex_spectrum_from_real_trace(sweep: np.ndarray) -> np.ndarray: """Восстановить комплексный спектр из вещественного следа через arccos+Euler.""" @@ -238,7 +237,7 @@ def compute_ifft_profile_from_sweep(sweep: Optional[np.ndarray]) -> tuple[np.nda n = min(depth_m.size, y.size) if n <= 0: return _fallback_depth_response(s.size, s) - return depth_m[:n].astype(np.float32, copy=False), y[:n].astype(np.float32, copy=False) + return depth_m[:n].astype(np.float128, copy=False), y[:n].astype(np.float128, copy=False) *20 except Exception as exc: # noqa: BLE001 logger.error("compute_ifft_profile_from_sweep failed: %r", exc) return _fallback_depth_response(np.asarray(sweep).size if sweep is not None else 1, sweep) diff --git a/rfg_adc_plotter/state/ring_buffer.py b/rfg_adc_plotter/state/ring_buffer.py index d7dc09b..52675e9 100644 --- a/rfg_adc_plotter/state/ring_buffer.py +++ b/rfg_adc_plotter/state/ring_buffer.py @@ -85,6 +85,13 @@ class RingBuffer: if n != depth_axis_m.size: depth_axis_m = depth_axis_m[:n] + # Для отображения храним только первую половину IFFT-профиля: + # вторая половина для текущей схемы симметрична и визуально избыточна. + n_keep = max(1, (n + 1) // 2) + fft_row = fft_row[:n_keep] + depth_axis_m = depth_axis_m[:n_keep] + n = n_keep + needs_reset = ( self.ring_fft is None or self.fft_depth_axis_m is None