new adc
This commit is contained in:
@ -23,6 +23,7 @@ class RingBuffer:
|
||||
self.ring: Optional[np.ndarray] = None
|
||||
self.ring_time: Optional[np.ndarray] = None
|
||||
self.ring_fft: Optional[np.ndarray] = None
|
||||
self.ring_fft_input: Optional[np.ndarray] = None
|
||||
self.x_shared: Optional[np.ndarray] = None
|
||||
self.distance_axis: Optional[np.ndarray] = None
|
||||
self.last_fft_mag: Optional[np.ndarray] = None
|
||||
@ -46,6 +47,7 @@ class RingBuffer:
|
||||
self.ring = None
|
||||
self.ring_time = None
|
||||
self.ring_fft = None
|
||||
self.ring_fft_input = None
|
||||
self.x_shared = None
|
||||
self.distance_axis = None
|
||||
self.last_fft_mag = None
|
||||
@ -63,13 +65,18 @@ class RingBuffer:
|
||||
self.ring = np.full((self.max_sweeps, self.width), np.nan, dtype=np.float32)
|
||||
self.ring_time = np.full((self.max_sweeps,), np.nan, dtype=np.float64)
|
||||
self.ring_fft = np.full((self.max_sweeps, self.fft_bins), np.nan, dtype=np.float32)
|
||||
self.ring_fft_input = np.full((self.max_sweeps, self.width), np.nan + 0j, dtype=np.complex64)
|
||||
self.head = 0
|
||||
changed = True
|
||||
elif target_width != self.width:
|
||||
new_ring = np.full((self.max_sweeps, target_width), np.nan, dtype=np.float32)
|
||||
new_fft_input = np.full((self.max_sweeps, target_width), np.nan + 0j, dtype=np.complex64)
|
||||
take = min(self.width, target_width)
|
||||
new_ring[:, :take] = self.ring[:, :take]
|
||||
if self.ring_fft_input is not None:
|
||||
new_fft_input[:, :take] = self.ring_fft_input[:, :take]
|
||||
self.ring = new_ring
|
||||
self.ring_fft_input = new_fft_input
|
||||
self.width = target_width
|
||||
changed = True
|
||||
|
||||
@ -106,12 +113,18 @@ class RingBuffer:
|
||||
|
||||
self.ring_fft.fill(np.nan)
|
||||
for row_idx in range(self.ring.shape[0]):
|
||||
sweep_row = self.ring[row_idx]
|
||||
if not np.any(np.isfinite(sweep_row)):
|
||||
fft_source_row = self.ring_fft_input[row_idx] if self.ring_fft_input is not None else self.ring[row_idx]
|
||||
if not np.any(np.isfinite(fft_source_row)):
|
||||
continue
|
||||
finite_idx = np.flatnonzero(np.isfinite(fft_source_row))
|
||||
if finite_idx.size <= 0:
|
||||
continue
|
||||
row_width = int(finite_idx[-1]) + 1
|
||||
fft_source = fft_source_row[:row_width]
|
||||
freqs = self.last_freqs[:row_width] if self.last_freqs is not None and self.last_freqs.size >= row_width else self.last_freqs
|
||||
fft_mag = compute_fft_mag_row(
|
||||
sweep_row,
|
||||
self.last_freqs,
|
||||
fft_source,
|
||||
freqs,
|
||||
self.fft_bins,
|
||||
mode=self.fft_mode,
|
||||
)
|
||||
@ -140,12 +153,18 @@ class RingBuffer:
|
||||
"""Backward-compatible wrapper for the old two-state FFT switch."""
|
||||
return self.set_fft_mode("symmetric" if enabled else "direct")
|
||||
|
||||
def push(self, sweep: np.ndarray, freqs: Optional[np.ndarray] = None) -> None:
|
||||
def push(
|
||||
self,
|
||||
sweep: np.ndarray,
|
||||
freqs: Optional[np.ndarray] = None,
|
||||
*,
|
||||
fft_input: Optional[np.ndarray] = None,
|
||||
) -> None:
|
||||
"""Push a processed sweep and refresh raw/FFT buffers."""
|
||||
if sweep is None or sweep.size == 0:
|
||||
return
|
||||
self.ensure_init(int(sweep.size))
|
||||
if self.ring is None or self.ring_time is None or self.ring_fft is None:
|
||||
if self.ring is None or self.ring_time is None or self.ring_fft is None or self.ring_fft_input is None:
|
||||
return
|
||||
|
||||
row = np.full((self.width,), np.nan, dtype=np.float32)
|
||||
@ -156,7 +175,13 @@ class RingBuffer:
|
||||
if freqs is not None:
|
||||
self.last_freqs = np.asarray(freqs, dtype=np.float64).copy()
|
||||
|
||||
fft_mag = compute_fft_mag_row(sweep, freqs, self.fft_bins, mode=self.fft_mode)
|
||||
fft_source = np.asarray(fft_input if fft_input is not None else sweep).reshape(-1)
|
||||
fft_row = np.full((self.width,), np.nan + 0j, dtype=np.complex64)
|
||||
fft_take = min(self.width, int(fft_source.size))
|
||||
fft_row[:fft_take] = np.asarray(fft_source[:fft_take], dtype=np.complex64)
|
||||
self.ring_fft_input[self.head, :] = fft_row
|
||||
|
||||
fft_mag = compute_fft_mag_row(fft_source, freqs, self.fft_bins, mode=self.fft_mode)
|
||||
self.ring_fft[self.head, :] = fft_mag
|
||||
self.last_fft_mag = np.asarray(fft_mag, dtype=np.float32).copy()
|
||||
self.last_fft_db = fft_mag_to_db(fft_mag)
|
||||
|
||||
@ -20,10 +20,13 @@ class RuntimeState:
|
||||
range_max_ghz: float = 0.0
|
||||
full_current_freqs: Optional[np.ndarray] = None
|
||||
full_current_sweep_raw: Optional[np.ndarray] = None
|
||||
full_current_fft_source: Optional[np.ndarray] = None
|
||||
full_current_aux_curves: SweepAuxCurves = None
|
||||
current_freqs: Optional[np.ndarray] = None
|
||||
current_distances: Optional[np.ndarray] = None
|
||||
current_sweep_raw: Optional[np.ndarray] = None
|
||||
current_fft_source: Optional[np.ndarray] = None
|
||||
current_fft_input: Optional[np.ndarray] = None
|
||||
current_aux_curves: SweepAuxCurves = None
|
||||
current_sweep_norm: Optional[np.ndarray] = None
|
||||
current_fft_mag: Optional[np.ndarray] = None
|
||||
|
||||
Reference in New Issue
Block a user