last implement diff
This commit is contained in:
@ -24,6 +24,7 @@ class RingBuffer:
|
||||
self.max_sweeps = max_sweeps
|
||||
# Размер IFFT-профиля теперь динамический и определяется по первому успешному свипу.
|
||||
self.fft_bins = 0
|
||||
self.fft_complex_mode: str = "arccos"
|
||||
|
||||
# Инициализируются при первом свипе (ensure_init)
|
||||
self.ring: Optional[np.ndarray] = None # (max_sweeps, WF_WIDTH)
|
||||
@ -47,6 +48,26 @@ class RingBuffer:
|
||||
"""Legacy alias: старое имя поля (раньше было время в нс, теперь глубина в м)."""
|
||||
return self.fft_depth_axis_m
|
||||
|
||||
def set_fft_complex_mode(self, mode: str) -> bool:
|
||||
"""Выбрать режим реконструкции комплексного спектра для IFFT.
|
||||
|
||||
Возвращает True, если режим изменился (и FFT-буфер был сброшен).
|
||||
"""
|
||||
m = str(mode).strip().lower()
|
||||
if m not in ("arccos", "diff"):
|
||||
raise ValueError(f"Unsupported IFFT complex mode: {mode!r}")
|
||||
if m == self.fft_complex_mode:
|
||||
return False
|
||||
self.fft_complex_mode = m
|
||||
# Сбрасываем только FFT-зависимые структуры. Сырые ряды сохраняем.
|
||||
self.ring_fft = None
|
||||
self.fft_depth_axis_m = None
|
||||
self.fft_bins = 0
|
||||
self.last_fft_vals = None
|
||||
self.y_min_fft = None
|
||||
self.y_max_fft = None
|
||||
return True
|
||||
|
||||
def ensure_init(self, sweep_width: int):
|
||||
"""Инициализировать буферы при первом свипе. Повторные вызовы — no-op (кроме x_shared)."""
|
||||
if self.ring is None:
|
||||
@ -73,7 +94,10 @@ class RingBuffer:
|
||||
self._push_fft(s)
|
||||
|
||||
def _push_fft(self, s: np.ndarray):
|
||||
depth_axis_m, fft_row = compute_ifft_profile_from_sweep(s)
|
||||
depth_axis_m, fft_row = compute_ifft_profile_from_sweep(
|
||||
s,
|
||||
complex_mode=self.fft_complex_mode,
|
||||
)
|
||||
fft_row = np.asarray(fft_row, dtype=np.float32).ravel()
|
||||
depth_axis_m = np.asarray(depth_axis_m, dtype=np.float32).ravel()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user