def test_zeropad(self): fs = 48000 duration = 100e-3 sig = Signal(1, duration, fs) sig.add_tone(100).zeropad(number=10) assert np.all(sig[:10] == sig[-10:]) assert np.all(sig[:10] == 0) sig = Signal(1, duration, fs) sig.add_tone(100).zeropad(number=[10, 5]) assert np.all(sig[:10] == 0) assert np.all(sig[-5:] == 0) sig = Signal(1, duration, fs) sig.add_tone(100).zeropad(duration=10e-3) n_zeros = audio.nsamples(10e-3, fs) assert np.all(sig[:n_zeros] == 0) assert np.all(sig[-n_zeros:] == 0) sig = Signal(1, duration, fs) sig.add_tone(100).zeropad(duration=[5e-3, 10e-3]) n_zeros_s = audio.nsamples(5e-3, fs) n_zeros_e = audio.nsamples(10e-3, fs) assert np.all(sig[:n_zeros_s] == 0) assert np.all(sig[-n_zeros_e:] == 0)
def test_nsamples(self): duration = 1 fs = 10 assert audio.nsamples(duration, fs) == 10 # test for directly using signal class sig = audio.Signal(1, 1, 10) assert audio.nsamples(sig) == 10
def test_gauss_fade_window(self): window = audio.gaussian_fade_window(np.zeros(1000), 100e-3, 1e3) n_window = 100 #test symmentry assert np.array_equal(window[:100], window[-100:][::-1]) #test starts at -60dB testing.assert_almost_equal(window[0], 0.001) #test setting cutoff window = audio.gaussian_fade_window(np.zeros(1000), 100e-3, 1e3, cutoff=-20) testing.assert_almost_equal(window[0], 0.1) # Test that the last sample in the window is not equal to 1 nsamp = audio.nsamples(200e-3, 1e3) window = audio.gaussian_fade_window(np.zeros(nsamp + 1), 100e-3 , 1e3) n_window = 100 assert window[int(nsamp / 2)] == 1 assert window[int(nsamp / 2 - 1)] != 1 assert window[int(nsamp / 2 + 1)] != 1 assert window[int(nsamp / 2 + 1)] == window[int(nsamp / 2 - 1)] # Test multichannel window window = audio.gaussian_fade_window(np.zeros([1000, 2]), 100e-3, 1e3) assert np.array_equal(window[:, 0], window[:, 1]) assert np.array_equal(window[:100, 0], window[-100:, 0][::-1]) sig = audio.Signal((2, 3), 1, 48000) win = audio.gaussian_fade_window(sig, 100e-3) assert win.shape == sig.shape testing.assert_array_equal (win[:, 1, 0], win[:, 0, 1])
def test_generate_noise(self): duration = 1 fs = 100e3 noise = audio.generate_noise(duration, fs) assert len(noise) == audio.nsamples(duration, fs) assert np.ndim(noise) == 1 # Test for whole spectrum spec = np.fft.fft(noise) assert np.all(~np.isclose(np.abs(spec)[1:], 0)) testing.assert_almost_equal(np.abs(spec[0]), 0) testing.assert_almost_equal(np.var(noise), 1) # # Test no offset testing.assert_almost_equal(noise.mean(), 0) # test seed noise1 = audio.generate_noise(duration, fs, seed=1) noise2 = audio.generate_noise(duration, fs, seed=1) noise3 = audio.generate_noise(duration, fs, seed=2) testing.assert_equal(noise1, noise2) assert ~np.all(noise1 == noise3) # test directly handing over signal sig = audio.Signal((2, 3), 1, 10) noise = audio.generate_noise(sig) assert noise.shape == (10, 2, 3) testing.assert_array_equal(noise[:, 0, :], noise[:, 1, :]) testing.assert_array_equal(noise[:, :, 0], noise[:, :, 1]) # test directly handing over signal noise = audio.generate_noise(1, 10, n_channels=(2, 3)) assert noise.shape == (10, 2, 3) testing.assert_array_equal(noise[:, 0, :], noise[:, 1, :]) testing.assert_array_equal(noise[:, :, 0], noise[:, :, 1]) # test multichannel noise = audio.generate_noise(1, 10, n_channels=(2, 3), ntype='pink') assert noise.shape == (10, 2, 3) testing.assert_array_equal(noise[:, 0, :], noise[:, 1, :]) testing.assert_array_equal(noise[:, :, 0], noise[:, :, 1])
def test_clip(self): sig = Signal(2, 1, 48000).add_noise() o_sig = sig.copy() sig.clip(0, 1) assert sig.n_samples == o_sig.n_samples # Test multi channel clipping (2 x 2 ) sig = Signal((2, 2), 1, 48000).add_noise() o_sig = sig.copy() sig.clip(0, 1) assert sig.n_samples == o_sig.n_samples sig = Signal(2, 1, 48000).add_noise() o_sig = sig.copy() sig.clip(0, 0.5) assert sig.n_samples == (o_sig.n_samples // 2) assert np.all(sig == o_sig[:o_sig.n_samples // 2, :]) assert sig.base == None sig = Signal(2, 1, 48000).add_noise() o_sig = sig.copy() sig.clip(0.5) assert sig.n_samples == (o_sig.n_samples // 2) assert np.all(sig == o_sig[o_sig.n_samples // 2:, :]) assert sig.base == None sig = Signal((2, 2), 1, 48000).add_noise() o_sig = sig.copy() sig.clip(0.5) assert sig.n_samples == (o_sig.n_samples // 2) assert np.all(sig == o_sig[o_sig.n_samples // 2:, :]) assert sig.base == None # test negative indexing sig = Signal(2, 1, 48000).add_noise() o_sig = sig.copy() n_samples = audio.nsamples(0.9, sig.fs) sig.clip(0, -0.1) assert sig.n_samples == n_samples assert np.all(sig == o_sig[:n_samples, :]) assert sig.base == None
def __new__(cls, n_channels, duration, fs, dtype=float): n_samples = audio.nsamples(duration, fs) if not np.ndim(n_channels): #if channels is only an integer if n_channels == 1: obj = super(BaseSignal, cls).__new__(cls, shape=(n_samples), dtype=dtype) else: obj = super(BaseSignal, cls).__new__(cls, shape=(n_samples, n_channels), dtype=dtype) else: obj = super(BaseSignal, cls).__new__(cls, shape=[n_samples] + list(n_channels), dtype=dtype) obj._fs = fs obj.fill(0) return obj
def test_cosine_fade_window(self): window = audio.cosine_fade_window(np.zeros(1000), 100e-3, 1e3) n_window = 100 #test symmentry assert np.array_equal(window[:100], window[-100:][::-1]) #test starts with 0 assert window[0] == 0 window = audio.cosine_fade_window(np.zeros(1000), 100e-3, 1e3) n_window = 100 #test if the window is a cosine curve of the right type cos_curve = np.concatenate([window[:100], window[-101:]]) sin = (0.5 * audio.generate_tone(0.2 + 1. / 1e3, 5, 1e3, start_phase=np.pi)) + 0.5 testing.assert_array_almost_equal(cos_curve, sin) # Test that the last sample in the window is not equal to 1 nsamp = audio.nsamples(200e-3, 1e3) window = audio.cosine_fade_window(np.zeros(nsamp + 1), 100e-3 , 1e3) n_window = 100 assert window[int(nsamp / 2)] == 1 assert window[int(nsamp / 2 - 1)] != 1 assert window[int(nsamp / 2 + 1)] != 1 assert window[int(nsamp / 2 + 1)] == window[int(nsamp / 2 - 1)] # Test multichannel window window = audio.cosine_fade_window(np.zeros([1000, 2]), 100e-3, 1e3) assert np.array_equal(window[:, 0], window[:, 1]) assert np.array_equal(window[:100, 0], window[-100:, 0][::-1]) sig = audio.Signal((2, 3), 1, 48000) win = audio.cosine_fade_window(sig, 100e-3) assert win.shape == sig.shape testing.assert_array_equal (win[:, 1, 0], win[:, 0, 1])