Files
3d_audio/lib_audio_dsp/test/utils/test_utils_python.py

117 lines
3.0 KiB
Python
Raw Normal View History

2025-12-11 09:43:42 +08:00
# Copyright 2024-2025 XMOS LIMITED.
# This Software is subject to the terms of the XMOS Public Licence: Version 1.
import pytest
import numpy as np
import audio_dsp.dsp.utils as utils
import audio_dsp.dsp.types as types
# seed RNG to avoid collection failures
np.random.seed(0)
@pytest.mark.parametrize('x', (2*np.random.rand(100)-1)*2**64)
def test_float_s32_float(x):
x_s32 = types.float_s32(float(x))
x2 = float(x_s32)
tol = 2**x_s32.exp
assert np.isclose(x, x2, rtol=2**-31, atol=tol)
@pytest.mark.parametrize('x, Q', np.stack(((2*np.random.rand(100)-1),
np.random.randint(0, 30, size=100)),
axis=-1))
def test_float_s32_float_Q(x, Q):
x_s32 = types.float_s32(float(x), Q_sig=Q)
x2 = float(x_s32)
tol = 2**-Q
assert np.isclose(x, x2, rtol=2**-31, atol=tol)
@pytest.mark.parametrize('x', (2*np.random.rand(100)-1)*2**64)
def test_float_s32_abs(x):
x_s32 = types.float_s32(float(x))
x2 = float(abs(x_s32))
tol = 2**x_s32.exp
assert np.isclose(abs(x), x2, rtol=2**-31, atol=tol)
@pytest.mark.parametrize("x, y", (2*np.random.rand(100, 2)-1)*2**30)
def test_float_s32_mult(x, y):
x_s32 = types.float_s32(float(x))
y_s32 = types.float_s32(float(y))
xy_s32 = x_s32*y_s32
xy = float(xy_s32)
tol = 2**xy_s32.exp
assert np.isclose(x*y, xy, rtol=2**-29, atol=tol)
@pytest.mark.parametrize("x, y", (2*np.random.rand(100, 2)-1)*2**30)
def test_float_s32_div(x, y):
x_s32 = types.float_s32(float(x))
y_s32 = types.float_s32(float(y))
xy_s32 = x_s32/y_s32
xy = float(xy_s32)
tol = 2**xy_s32.exp
assert np.isclose(x/y, xy, rtol=2**-29, atol=tol)
@pytest.mark.parametrize("x, y", (2*np.random.rand(100, 2)-1)*2**30)
def test_float_s32_add(x, y):
x_s32 = types.float_s32(float(x))
y_s32 = types.float_s32(float(y))
xy_s32 = x_s32 + y_s32
xy = float(xy_s32)
tol = 2**(max(x_s32.exp, y_s32.exp) + 2)
assert np.isclose(x + y, xy, rtol=2**-29, atol=tol)
@pytest.mark.parametrize("x, y", (2*np.random.rand(100, 2)-1)*2**30)
def test_float_s32_subt(x, y):
x_s32 = types.float_s32(float(x))
y_s32 = types.float_s32(float(y))
xy_s32 = x_s32-y_s32
xy = float(xy_s32)
tol = 2**(max(x_s32.exp, y_s32.exp) + 1)
assert np.isclose(x-y, xy, rtol=2**-29, atol=tol)
@pytest.mark.parametrize("x, y", (2*np.random.rand(100, 2)-1)*2**30)
def test_float_s32_gt(x, y):
x_s32 = types.float_s32(float(x))
y_s32 = types.float_s32(float(y))
xy_s32 = x_s32 > y_s32
xy = x > y
assert xy == xy_s32
@pytest.mark.parametrize("x, y", (2*np.random.rand(100, 2)-1)*2**30)
def test_float_s32_lt(x, y):
x_s32 = types.float_s32(float(x))
y_s32 = types.float_s32(float(y))
xy_s32 = x_s32 < y_s32
xy = x < y
assert xy == xy_s32
if __name__ == "__main__":
for n in range(100):
# test_float_s32_float((2*np.random.rand(1)-1)*2**32)
test_float_s32_add((2*np.random.rand(1)-1)*2**27,
(2*np.random.rand(1)-1)*2**27)