32 lines
1.2 KiB
Python
32 lines
1.2 KiB
Python
import numpy as np
|
|
|
|
from galileo_rx.fixed_point.fixed_fft import FixedRadix2Fft
|
|
from galileo_rx.fixed_point.formats import FixedFormat
|
|
|
|
|
|
def test_fixed_fft_impulse_and_scaling() -> None:
|
|
values = np.zeros(16, dtype=np.complex128)
|
|
values[0] = 0.5
|
|
model = FixedRadix2Fft(FixedFormat(20, 17))
|
|
result = model.forward(values)
|
|
np.testing.assert_allclose(result.dequantize(), np.fft.fft(values) / values.size, atol=4 * model.data_format.lsb)
|
|
assert result.overflow_count == 0
|
|
|
|
|
|
def test_fixed_fft_random_vector_and_inverse() -> None:
|
|
rng = np.random.default_rng(91)
|
|
values = 0.1 * (rng.standard_normal(32) + 1j * rng.standard_normal(32))
|
|
model = FixedRadix2Fft(FixedFormat(24, 19))
|
|
spectrum = model.forward(values).dequantize()
|
|
np.testing.assert_allclose(spectrum, np.fft.fft(values) / values.size, atol=2e-5)
|
|
restored = model.inverse(spectrum).dequantize()
|
|
# IFFT of the already 1/N-scaled forward spectrum is x/N.
|
|
np.testing.assert_allclose(restored, values / values.size, atol=2e-5)
|
|
|
|
|
|
def test_fixed_fft_rejects_non_power_of_two() -> None:
|
|
import pytest
|
|
|
|
with pytest.raises(ValueError, match="power of two"):
|
|
FixedRadix2Fft().forward(np.ones(12))
|