cut the range feature
This commit is contained in:
@ -6,6 +6,7 @@ import numpy as np
|
||||
import unittest
|
||||
|
||||
from rfg_adc_plotter.constants import FFT_LEN, SWEEP_FREQ_MAX_GHZ, SWEEP_FREQ_MIN_GHZ
|
||||
from rfg_adc_plotter.gui.pyqtgraph_backend import apply_working_range
|
||||
from rfg_adc_plotter.processing.calibration import (
|
||||
build_calib_envelope,
|
||||
calibrate_freqs,
|
||||
@ -100,6 +101,24 @@ class ProcessingTests(unittest.TestCase):
|
||||
with self.assertRaises(ValueError):
|
||||
load_calib_envelope(path)
|
||||
|
||||
def test_apply_working_range_crops_sweep_to_selected_band(self):
|
||||
freqs = np.linspace(3.3, 14.3, 12, dtype=np.float64)
|
||||
sweep = np.arange(12, dtype=np.float32)
|
||||
cropped_freqs, cropped_sweep = apply_working_range(freqs, sweep, 5.0, 9.0)
|
||||
|
||||
self.assertGreater(cropped_freqs.size, 0)
|
||||
self.assertEqual(cropped_freqs.shape, cropped_sweep.shape)
|
||||
self.assertGreaterEqual(float(np.min(cropped_freqs)), 5.0)
|
||||
self.assertLessEqual(float(np.max(cropped_freqs)), 9.0)
|
||||
|
||||
def test_apply_working_range_returns_empty_when_no_points_match(self):
|
||||
freqs = np.linspace(3.3, 14.3, 12, dtype=np.float64)
|
||||
sweep = np.arange(12, dtype=np.float32)
|
||||
cropped_freqs, cropped_sweep = apply_working_range(freqs, sweep, 20.0, 21.0)
|
||||
|
||||
self.assertEqual(cropped_freqs.shape, (0,))
|
||||
self.assertEqual(cropped_sweep.shape, (0,))
|
||||
|
||||
def test_fft_helpers_return_expected_shapes(self):
|
||||
sweep = np.sin(np.linspace(0.0, 4.0 * np.pi, 128)).astype(np.float32)
|
||||
freqs = np.linspace(3.3, 14.3, 128, dtype=np.float64)
|
||||
@ -113,34 +132,44 @@ class ProcessingTests(unittest.TestCase):
|
||||
|
||||
def test_symmetric_ifft_spectrum_has_zero_gap_and_mirrored_band(self):
|
||||
sweep = np.linspace(1.0, 2.0, 128, dtype=np.float32)
|
||||
freqs = np.linspace(SWEEP_FREQ_MIN_GHZ, SWEEP_FREQ_MAX_GHZ, 128, dtype=np.float64)
|
||||
freqs = np.linspace(4.0, 10.0, 128, dtype=np.float64)
|
||||
spectrum = build_symmetric_ifft_spectrum(sweep, freqs, fft_len=FFT_LEN)
|
||||
|
||||
self.assertIsNotNone(spectrum)
|
||||
freq_axis = np.linspace(-SWEEP_FREQ_MAX_GHZ, SWEEP_FREQ_MAX_GHZ, FFT_LEN, dtype=np.float64)
|
||||
neg_idx_all = np.flatnonzero(freq_axis <= (-SWEEP_FREQ_MIN_GHZ))
|
||||
pos_idx_all = np.flatnonzero(freq_axis >= SWEEP_FREQ_MIN_GHZ)
|
||||
freq_axis = np.linspace(-10.0, 10.0, FFT_LEN, dtype=np.float64)
|
||||
neg_idx_all = np.flatnonzero(freq_axis <= (-4.0))
|
||||
pos_idx_all = np.flatnonzero(freq_axis >= 4.0)
|
||||
band_len = int(min(neg_idx_all.size, pos_idx_all.size))
|
||||
neg_idx = neg_idx_all[:band_len]
|
||||
pos_idx = pos_idx_all[-band_len:]
|
||||
zero_mask = (freq_axis > (-SWEEP_FREQ_MIN_GHZ)) & (freq_axis < SWEEP_FREQ_MIN_GHZ)
|
||||
zero_mask = (freq_axis > (-4.0)) & (freq_axis < 4.0)
|
||||
|
||||
self.assertTrue(np.allclose(spectrum[zero_mask], 0.0))
|
||||
self.assertTrue(np.allclose(spectrum[neg_idx], spectrum[pos_idx][::-1]))
|
||||
|
||||
def test_positive_only_centered_spectrum_keeps_zeros_until_positive_min(self):
|
||||
sweep = np.linspace(1.0, 2.0, 128, dtype=np.float32)
|
||||
freqs = np.linspace(SWEEP_FREQ_MIN_GHZ, SWEEP_FREQ_MAX_GHZ, 128, dtype=np.float64)
|
||||
freqs = np.linspace(4.0, 10.0, 128, dtype=np.float64)
|
||||
spectrum = build_positive_only_centered_ifft_spectrum(sweep, freqs, fft_len=FFT_LEN)
|
||||
|
||||
self.assertIsNotNone(spectrum)
|
||||
freq_axis = np.linspace(-SWEEP_FREQ_MAX_GHZ, SWEEP_FREQ_MAX_GHZ, FFT_LEN, dtype=np.float64)
|
||||
zero_mask = freq_axis < SWEEP_FREQ_MIN_GHZ
|
||||
pos_idx = np.flatnonzero(freq_axis >= SWEEP_FREQ_MIN_GHZ)
|
||||
freq_axis = np.linspace(-10.0, 10.0, FFT_LEN, dtype=np.float64)
|
||||
zero_mask = freq_axis < 4.0
|
||||
pos_idx = np.flatnonzero(freq_axis >= 4.0)
|
||||
|
||||
self.assertTrue(np.allclose(spectrum[zero_mask], 0.0))
|
||||
self.assertTrue(np.any(np.abs(spectrum[pos_idx]) > 0.0))
|
||||
|
||||
def test_symmetric_distance_axis_uses_windowed_frequency_bounds(self):
|
||||
freqs = np.linspace(4.0, 10.0, 128, dtype=np.float64)
|
||||
axis = compute_distance_axis(freqs, 513, mode="symmetric")
|
||||
df_hz = (2.0 * 10.0 / max(1, FFT_LEN - 1)) * 1e9
|
||||
expected_step = 299_792_458.0 / (2.0 * FFT_LEN * df_hz)
|
||||
|
||||
self.assertEqual(axis.shape, (513,))
|
||||
self.assertTrue(np.all(np.diff(axis) >= 0.0))
|
||||
self.assertAlmostEqual(float(axis[1] - axis[0]), expected_step, places=15)
|
||||
|
||||
def test_peak_helpers_find_reference_and_peak_boxes(self):
|
||||
xs = np.linspace(0.0, 10.0, 200)
|
||||
ys = np.exp(-((xs - 5.0) ** 2) / 0.4) * 10.0 + 1.0
|
||||
|
||||
@ -70,6 +70,19 @@ class RingBufferTests(unittest.TestCase):
|
||||
self.assertEqual(ring.last_fft_db.shape, (ring.fft_bins,))
|
||||
self.assertIsNotNone(ring.distance_axis)
|
||||
|
||||
def test_ring_buffer_reset_clears_cached_history(self):
|
||||
ring = RingBuffer(max_sweeps=2)
|
||||
ring.push(np.linspace(0.0, 1.0, 64, dtype=np.float32), np.linspace(4.0, 10.0, 64))
|
||||
|
||||
ring.reset()
|
||||
|
||||
self.assertIsNone(ring.ring)
|
||||
self.assertIsNone(ring.ring_fft)
|
||||
self.assertIsNone(ring.distance_axis)
|
||||
self.assertIsNone(ring.last_fft_db)
|
||||
self.assertEqual(ring.width, 0)
|
||||
self.assertEqual(ring.head, 0)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user