peterf@2: #!/usr/bin/env python peterf@2: # CREATED:2013-03-08 15:25:18 by Brian McFee peterf@2: # unit tests for librosa.feature (feature.py) peterf@2: # peterf@2: # Run me as follows: peterf@2: # cd tests/ peterf@2: # nosetests -v peterf@2: # peterf@2: # This test suite verifies that librosa core routines match (numerically) the output peterf@2: # of various DPWE matlab implementations on a broad range of input parameters. peterf@2: # peterf@2: # All test data is generated by the Matlab script "makeTestData.m". peterf@2: # Each test loads in a .mat file which contains the input and desired output for a given peterf@2: # function. The test then runs the librosa implementation and verifies the results peterf@2: # against the desired output, typically via numpy.allclose(). peterf@2: # peterf@2: # CAVEATS: peterf@2: # peterf@2: # Currently, not all tests are exhaustive in parameter space. This is typically due peterf@2: # restricted functionality of the librosa implementations. Similarly, there is no peterf@2: # fuzz-testing here, so behavior on invalid inputs is not yet well-defined. peterf@2: # peterf@2: peterf@2: import librosa peterf@2: import os, glob peterf@2: import numpy, scipy.io peterf@2: peterf@2: from nose.tools import nottest peterf@2: peterf@2: #-- utilities --# peterf@2: def files(pattern): peterf@2: test_files = glob.glob(pattern) peterf@2: test_files.sort() peterf@2: return test_files peterf@2: peterf@2: def load(infile): peterf@2: DATA = scipy.io.loadmat(infile, chars_as_strings=True) peterf@2: return DATA peterf@2: #-- --# peterf@2: peterf@2: #-- Tests --# peterf@2: def test_hz_to_mel(): peterf@2: def __test_to_mel(infile): peterf@2: DATA = load(infile) peterf@2: z = librosa.hz_to_mel(DATA['f'], DATA['htk']) peterf@2: peterf@2: assert numpy.allclose(z, DATA['result']) peterf@2: peterf@2: for infile in files('data/feature-hz_to_mel-*.mat'): peterf@2: yield (__test_to_mel, infile) peterf@2: peterf@2: pass peterf@2: peterf@2: def test_mel_to_hz(): peterf@2: peterf@2: def __test_to_hz(infile): peterf@2: DATA = load(infile) peterf@2: z = librosa.mel_to_hz(DATA['f'], DATA['htk']) peterf@2: peterf@2: assert numpy.allclose(z, DATA['result']) peterf@2: peterf@2: for infile in files('data/feature-mel_to_hz-*.mat'): peterf@2: yield (__test_to_hz, infile) peterf@2: peterf@2: pass peterf@2: peterf@2: def test_hz_to_octs(): peterf@2: def __test_to_octs(infile): peterf@2: DATA = load(infile) peterf@2: z = librosa.hz_to_octs(DATA['f']) peterf@2: peterf@2: assert numpy.allclose(z, DATA['result']) peterf@2: peterf@2: for infile in files('data/feature-hz_to_octs-*.mat'): peterf@2: yield (__test_to_octs, infile) peterf@2: peterf@2: pass peterf@2: peterf@2: def test_melfb(): peterf@2: peterf@2: def __test(infile): peterf@2: DATA = load(infile) peterf@2: peterf@2: wts = librosa.filters.mel( DATA['sr'][0], peterf@2: DATA['nfft'][0], peterf@2: n_mels = DATA['nfilts'][0], peterf@2: fmin = DATA['fmin'][0], peterf@2: fmax = DATA['fmax'][0], peterf@2: htk = DATA['htk'][0]) peterf@2: peterf@2: # Our version only returns the real-valued part. peterf@2: # Pad out. peterf@2: wts = numpy.pad(wts, [ (0, 0), (0, int(DATA['nfft'][0]/2 - 1))], mode='constant') peterf@2: peterf@2: assert wts.shape == DATA['wts'].shape peterf@2: peterf@2: assert numpy.allclose(wts, DATA['wts']) peterf@2: peterf@2: for infile in files('data/feature-melfb-*.mat'): peterf@2: yield (__test, infile) peterf@2: pass peterf@2: peterf@2: def test_chromafb(): peterf@2: peterf@2: def __test(infile): peterf@2: DATA = load(infile) peterf@2: peterf@2: octwidth = DATA['octwidth'][0,0] peterf@2: if octwidth == 0: peterf@2: octwidth = None peterf@2: peterf@2: wts = librosa.filters.chroma( DATA['sr'][0,0], peterf@2: DATA['nfft'][0,0], peterf@2: DATA['nchroma'][0,0], peterf@2: A440 = DATA['a440'][0,0], peterf@2: ctroct = DATA['ctroct'][0,0], peterf@2: octwidth= octwidth) peterf@2: peterf@2: # Our version only returns the real-valued part. peterf@2: # Pad out. peterf@2: wts = numpy.pad(wts, [ (0, 0), (0, DATA['nfft'][0,0]/2 - 1)], mode='constant') peterf@2: peterf@2: assert wts.shape == DATA['wts'].shape peterf@2: peterf@2: assert numpy.allclose(wts, DATA['wts']) peterf@2: peterf@2: for infile in files('data/feature-chromafb-*.mat'): peterf@2: yield (__test, infile) peterf@2: pass