import unittest import numpy as np import torch from training.preprocess.compute_yin import ( compute_yin, cumulativeMeanNormalizedDifferenceFunction, differenceFunction, getPitch, norm_interp_f0, ) # Create a class to test the ComputePitch class class TestComputeYin(unittest.TestCase): def setUp(self): np.random.seed(0) def test_difference_function(self): # Test the differenceFunction function with a simple example x = np.array([0.0, 1.0, 2.0, 3.0, 4.0]) N = len(x) tau_max = 3 # Test the output shape expected_shape = (tau_max,) actual_shape = differenceFunction(x, N, tau_max).shape self.assertTrue(actual_shape == expected_shape) # Test the output values expected_output = np.array([0.0, 4.0, 12.0]) actual_output = differenceFunction(x, N, tau_max) np.testing.assert_equal(actual_output, expected_output) # Test the function with a larger example x = np.random.randn(1000) N = len(x) tau_max = 100 # Test the output shape expected_shape = (tau_max,) actual_shape = differenceFunction(x, N, tau_max).shape self.assertTrue(actual_shape == expected_shape) # Test the output values expected_output = np.zeros(tau_max) for tau in range(1, tau_max): expected_output[tau] = np.sum((x[: N - tau] - x[tau:N]) ** 2) actual_output = differenceFunction(x, N, tau_max) np.testing.assert_allclose(actual_output, expected_output, rtol=1e-6, atol=1e-6) def test_get_pitch(self): # Test the getPitch function with a simple example cmdf = np.array([1.0, 0.5, 0.2, 0.1, 0.05]) tau_min = 1 tau_max = 5 harmo_th = 0.3 # Test the output value when there is a value below the threshold expected_output = 4 actual_output = getPitch(cmdf, tau_min, tau_max, harmo_th) self.assertEqual(actual_output, expected_output) # Test the output value when there are no values below the threshold cmdf = np.array([1.0, 0.9, 0.8, 0.7, 0.6]) expected_output = 0 actual_output = getPitch(cmdf, tau_min, tau_max, harmo_th) self.assertEqual(actual_output, expected_output) # Test the output value when there are no values below the threshold cmdf = np.random.rand(100) cmdf[tau_min:tau_max] = 0.5 expected_output = 0 actual_output = getPitch(cmdf, tau_min, tau_max, harmo_th) self.assertEqual(actual_output, expected_output) def test_cumulative_mean_normalized_difference_function(self): # Test the function with a simple example df = np.array([1, 2, 3, 4, 5]) N = len(df) # Test the output values expected_output = np.array([1.0, 1.0, 1.2, 1.333333, 1.428571]) actual_output = cumulativeMeanNormalizedDifferenceFunction(df, N) np.testing.assert_allclose(actual_output, expected_output, rtol=1e-6, atol=1e-6) def test_compute_yin(self): # Test the function with a simple example sig = torch.from_numpy(np.sin(2 * np.pi * 440 * np.arange(44100) / 44100)) sr = 44100 actual_output = compute_yin(sig, sr) # Check the result expected_output = np.load("mocks/test_compute_yin.npy") np.testing.assert_allclose(actual_output, expected_output) def test_norm_interp_f0(self): # Test the norm_interp_f0 function with a simple example f0 = np.array([0, 100, 0, 200, 0]) actual_output = norm_interp_f0(f0) expected_output = ( np.array([100, 100, 150, 200, 200]), np.array([True, False, True, False, True]), ) np.testing.assert_allclose(actual_output[0], expected_output[0]) # Test the norm_interp_f0 function with a zero-dimensional array np.testing.assert_array_equal(actual_output[1], expected_output[1])