import numpy as np from rfg_adc_plotter.processing.fourier import ( compute_ifft_profile_from_sweep, reconstruct_complex_spectrum_from_real_trace, ) def test_reconstruct_complex_spectrum_arccos_mode_returns_complex128(): sweep = np.linspace(-3.0, 7.0, 128, dtype=np.float32) z = reconstruct_complex_spectrum_from_real_trace(sweep, complex_mode="arccos") assert z.dtype == np.complex128 assert z.shape == sweep.shape assert np.all(np.isfinite(np.real(z))) assert np.all(np.isfinite(np.imag(z))) def test_reconstruct_complex_spectrum_diff_mode_returns_complex128(): sweep = np.linspace(-1.0, 1.0, 128, dtype=np.float32) z = reconstruct_complex_spectrum_from_real_trace(sweep, complex_mode="diff") assert z.dtype == np.complex128 assert z.shape == sweep.shape assert np.all(np.isfinite(np.real(z))) assert np.all(np.isfinite(np.imag(z))) def test_reconstruct_complex_spectrum_diff_mode_projects_to_unit_circle(): sweep = np.sin(np.linspace(0.0, 6.0 * np.pi, 256)).astype(np.float32) z = reconstruct_complex_spectrum_from_real_trace(sweep, complex_mode="diff") mag = np.abs(z) assert np.all(np.isfinite(mag)) assert np.allclose(mag, np.ones_like(mag), atol=1e-5, rtol=0.0) def test_compute_ifft_profile_from_sweep_accepts_both_modes(): sweep = np.linspace(-5.0, 5.0, 257, dtype=np.float32) d1, y1 = compute_ifft_profile_from_sweep(sweep, complex_mode="arccos") d2, y2 = compute_ifft_profile_from_sweep(sweep, complex_mode="diff") assert d1.dtype == np.float32 and y1.dtype == np.float32 assert d2.dtype == np.float32 and y2.dtype == np.float32 assert d1.size == y1.size and d2.size == y2.size assert d1.size > 0 and d2.size > 0 assert np.all(np.diff(d1) >= 0.0) assert np.all(np.diff(d2) >= 0.0) def test_invalid_complex_mode_falls_back_deterministically_in_outer_wrapper(): sweep = np.linspace(-1.0, 1.0, 64, dtype=np.float32) depth, y = compute_ifft_profile_from_sweep(sweep, complex_mode="unknown") assert depth.dtype == np.float32 assert y.dtype == np.float32 assert depth.size == y.size assert depth.size > 0