def test_extractor_without_sink(): ex = Extractor(A()) sc = ArraySource(list(range(10)), blocksize=1, overlap=0, samplerate=1) for i, res in enumerate(ex.extract(sc)): assert i == res['A'] ex.reset() assert ex.featureset['A']._started is False
def test_array_source(): a = ArraySource(list(range(10)), blocksize=2, overlap=1, samplerate=1) last = 0 for i, b in enumerate(a): data, index = b assert len(b) == 2 assert last == data[0] last = data[-1]
def test_extractor_with_sink(): ex = Extractor(A(), A(name='hidden_a').hide()) sc = ArraySource(list(range(10)), blocksize=1, overlap=0, samplerate=1) sk = DefaultDictSink() ex.extract(sc, sk) assert list(sk['results']['A']) == list(range(10)) assert any(sk['hiddenfeatures']) assert any(sk['features'])
def test_windowed_signal(): block = np.ones(10) sc = ArraySource(block, samplerate=1) wsf = WindowedSignal(window='hanning', size=10) wsf.on_start(sc) res = wsf.process((block, 0), {}) assert np.allclose(res, wsf.w) block = np.ones((10, 2)) sc = ArraySource(block, samplerate=1, blocksize=10) wsf = WindowedSignal(window='blackman') wsf.on_start(sc) res = wsf.process((block, 0), {}) assert np.allclose(res, wsf.w) sc = ArraySource(block, samplerate=1, blocksize=10) wsf = WindowedSignal(window='rect') wsf.on_start(sc) res = wsf.process((block, 0), {}) assert np.allclose(res, wsf.w)
def test_abstract_preprocess(): with pytest.raises(TypeError): Preprocess() class P(Preprocess): def process(self, data): return data src = ArraySource(np.ones((10, 2)), samplerate=10) pp = P(src) list(pp)
def test_spectral_features_no_window_branch(): from sigfeat.feature.spectral import AbsRfft features = [ AbsRfft(window=False), SpectralCentroid(), SpectralFlatness(), SpectralFlux(), SpectralCrestFactor(), SpectralRolloff(), ] etr = Extractor(*features) x = np.sin(1000 * 2 * np.pi * np.linspace(0, 1, 44100)) src = ArraySource(np.tile(x, (2, 1)).T, samplerate=44100, blocksize=2048, overlap=1024) etr.extract(src, DefaultDictSink())
def test_delta(): class A(Feature): def process(self, data, res): return float(data[0]) ex = Extractor( Delta(A()), Delta(A(), order=2) ) x = np.arange(0.0, 10.0, 2) src = ArraySource(x, samplerate=1, blocksize=1, channels=1) snk = ex.extract(src, DefaultDictSink()) res = snk['results'] assert np.allclose(np.array(res['A']).flatten(), x) assert np.mean(np.array(res['dA']).flatten()[1:]) == 2.0 assert np.mean(np.array(res['ddA']).flatten()[2:]) == 0.0 assert res['dA'][0] is None assert res['ddA'][0] is None
def test_spectral_features(): features = [ SpectralCentroid(), SpectralFlatness(), SpectralFlux(), SpectralCrestFactor(), SpectralRolloff(), SpectralSpread(), SpectralSkewness(), SpectralKurtosis(), SpectralSlope(), ] etr = Extractor(*features) x = np.sin(1000 * 2 * np.pi * np.linspace(0, 1, 44100)) src = ArraySource(x, samplerate=44100, blocksize=2048, overlap=1024) snk = etr.extract(src, DefaultDictSink()) res = snk['results'] assert abs(1 - np.median(res['SpectralCentroid']) / 1000) < 1e-3 assert abs(np.median(res['SpectralFlatness'])) < 1e-3
def test_temporal_features(): features = [ CrestFactor(), ZeroCrossingRate(), StatMoments(), CentroidAbsSignal(), FlatnessAbsSignal(), RootMeanSquare(), Peak(), Kurtosis(), Skewness(), StandardDeviation(), ] ex = Extractor(*features) x = np.sin(1000*2*np.pi*np.linspace(0, 1, 44100)) src = ArraySource(x, samplerate=44100, blocksize=4096) snk = ex.extract(src, DefaultDictSink()) res = snk['results'] assert abs(np.median(res['CrestFactor'])-2**0.5) < 1e-3 assert abs(1-np.median(res['ZeroCrossingRate'])/2000.0) < 1e-2 assert abs(2**-0.5-np.median(res['RootMeanSquare'])) < 1e-3 assert abs(1-np.median(res['Peak'])) < 1e-4
from sigfeat import feature as fts t = np.linspace(0, 2, 2*44100) # x = np.sin(2*np.pi*1000*t) x = chirp( t, f0=1000, t1=2, f1=4000, method='log' ) src = ArraySource( np.tile(x, (2, 1)).T, samplerate=44100, blocksize=2048, overlap=1024) features = ( fts.Index(), fts.RootMeanSquare(), fts.Peak(), fts.CrestFactor(), fts.ZeroCrossingRate(), fts.SpectralFlux(), fts.SpectralCentroid(), fts.SpectralFlatness(), fts.SpectralCrestFactor(), )
def mkas(): return ArraySource(np.random.randn(44100), samplerate=44100, blocksize=2048, overlap=1024)
def test_sum_mix(): src = ArraySource(np.ones((10, 2)), samplerate=10, blocksize=1) pp = SumMix(src) for data in pp: assert data[0] == 2.0
def test_mean_mix(): src = ArraySource(np.ones((10, 2)), channels=2, samplerate=10, blocksize=1) pp = MeanMix(src) for data in pp: assert data[0] == 1.0