117 lines
3.0 KiB
Python
117 lines
3.0 KiB
Python
|
|
# 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)
|