diff --git a/auglib/core/transform.py b/auglib/core/transform.py index 808ca87..ac051bf 100644 --- a/auglib/core/transform.py +++ b/auglib/core/transform.py @@ -3261,16 +3261,16 @@ def _pink_noise(self, samples: int) -> np.ndarray: def psd(f): return 1 / np.where(f == 0, float("inf"), np.sqrt(f)) - white_noise = np.fft.rfft(np.random.randn(samples)) + white_noise = np.fft.rfft(np.random.randn(samples + 1)) # Normalized pink noise shape - pink_shape = psd(np.fft.rfftfreq(samples)) + pink_shape = psd(np.fft.rfftfreq(samples + 1)) pink_shape = pink_shape / np.sqrt(np.mean(pink_shape**2)) white_noise_shaped = white_noise * pink_shape pink_noise = np.fft.irfft(white_noise_shaped) - return np.atleast_2d(pink_noise) + return np.atleast_2d(pink_noise[:samples]) class Prepend(Base): diff --git a/tests/test_transform_pink_noise.py b/tests/test_transform_pink_noise.py index 4a34ee3..7174d36 100644 --- a/tests/test_transform_pink_noise.py +++ b/tests/test_transform_pink_noise.py @@ -74,3 +74,16 @@ def test_pink_noise(duration, sampling_rate, gain_db, snr_db): assert noise.shape == expected_noise.shape assert noise.dtype == expected_noise.dtype np.testing.assert_almost_equal(noise, expected_noise) + + +@pytest.mark.parametrize( + "signal", + [ + # Failing signal size, + # https://github.com/audeering/auglib/issues/23 + np.ones((1, 30045)), + ] +) +def test_pink_noise_issue23(signal): + transform = auglib.transform.PinkNoise() + transform(signal)