Showing the changes to python (9 of 20 files). Show all
Unified · Split
| @@ -2,20 +2,27 @@ · 1 unmodified line | |||
| 2 | 2 | ||
| 3 | import sys | 3 | import sys |
| 4 | from aubio import source, pvoc, mfcc | 4 | from aubio import source, pvoc, mfcc |
| 5 | from numpy import vstack, zeros | 5 | from numpy import vstack, zeros, diff |
| 6 | 6 | ||
| 7 | win_s = 512 # fft size | ||
| 8 | hop_s = win_s // 4 # hop size | ||
| 9 | n_filters = 40 # must be 40 for mfcc | 7 | n_filters = 40 # must be 40 for mfcc |
| 10 | n_coeffs = 13 | 8 | n_coeffs = 13 |
| 11 | samplerate = 44100 | ||
| 12 | 9 | ||
| 13 | if len(sys.argv) < 2: | 10 | if len(sys.argv) < 2: |
| 14 | print("Usage: %s <source_filename>" % sys.argv[0]) | 11 | print("Usage: %s <source_filename> [samplerate] [win_s] [hop_s] [mode]" % sys.argv[0]) |
| 12 | print(" where [mode] can be 'delta' or 'ddelta' for first and second derivatives") | ||
| 15 | sys.exit(1) | 13 | sys.exit(1) |
| 16 | 14 | ||
| 17 | source_filename = sys.argv[1] | 15 | source_filename = sys.argv[1] |
| 18 | 16 | ||
| 17 | if len(sys.argv) > 2: samplerate = int(sys.argv[2]) | ||
| 18 | else: samplerate = 0 | ||
| 19 | if len(sys.argv) > 3: win_s = int(sys.argv[3]) | ||
| 20 | else: win_s = 512 | ||
| 21 | if len(sys.argv) > 4: hop_s = int(sys.argv[4]) | ||
| 22 | else: hop_s = win_s // 4 | ||
| 23 | if len(sys.argv) > 5: mode = sys.argv[5] | ||
| 24 | else: mode = "default" | ||
| 25 | |||
| 19 | samplerate = 0 | 26 | samplerate = 0 |
| 20 | if len( sys.argv ) > 2: samplerate = int(sys.argv[2]) | 27 | if len( sys.argv ) > 2: samplerate = int(sys.argv[2]) |
| 21 | 28 | ||
| @@ -48,18 +55,28 @@ get_waveform_plot( source_filename, samplerate, block_size = hop_s, ax = wave) · 26 unmodified lines | |||
| 48 | wave.xaxis.set_visible(False) | 55 | wave.xaxis.set_visible(False) |
| 49 | wave.yaxis.set_visible(False) | 56 | wave.yaxis.set_visible(False) |
| 50 | 57 | ||
| 58 | # compute first and second derivatives | ||
| 59 | if mode in ["delta", "ddelta"]: | ||
| 60 | mfccs = diff(mfccs, axis = 0) | ||
| 61 | if mode == "ddelta": | ||
| 62 | mfccs = diff(mfccs, axis = 0) | ||
| 63 | |||
| 51 | all_times = arange(mfccs.shape[0]) * hop_s | 64 | all_times = arange(mfccs.shape[0]) * hop_s |
| 52 | n_coeffs = mfccs.shape[1] | 65 | n_coeffs = mfccs.shape[1] |
| 53 | for i in range(n_coeffs): | 66 | for i in range(n_coeffs): |
| 54 | ax = plt.axes ( [0.1, 0.75 - ((i+1) * 0.65 / n_coeffs), 0.8, 0.65 / n_coeffs], sharex = wave ) | 67 | ax = plt.axes ( [0.1, 0.75 - ((i+1) * 0.65 / n_coeffs), 0.8, 0.65 / n_coeffs], sharex = wave ) |
| 55 | ax.xaxis.set_visible(False) | 68 | ax.xaxis.set_visible(False) |
| 56 | ax.yaxis.set_visible(False) | 69 | ax.set_yticks([]) |
| 70 | ax.set_ylabel('%d' % i) | ||
| 57 | ax.plot(all_times, mfccs.T[i]) | 71 | ax.plot(all_times, mfccs.T[i]) |
| 58 | 72 | ||
| 59 | # add time to the last axis | 73 | # add time to the last axis |
| 60 | set_xlabels_sample2time( ax, frames_read, samplerate) | 74 | set_xlabels_sample2time( ax, frames_read, samplerate) |
| 61 | 75 | ||
| 62 | #plt.ylabel('spectral descriptor value') | 76 | #plt.ylabel('spectral descriptor value') |
| 63 | ax.xaxis.set_visible(True) | 77 | ax.xaxis.set_visible(True) |
| 64 | wave.set_title('MFCC for %s' % source_filename) | 78 | title = 'MFCC for %s' % source_filename |
| 79 | if mode == "delta": title = mode + " " + title | ||
| 80 | elif mode == "ddelta": title = "double-delta" + " " + title | ||
| 81 | wave.set_title(title) | ||
| 65 | plt.show() | 82 | plt.show() |
| @@ -256,6 +256,22 @@ static struct PyModuleDef moduledef = { · 255 unmodified lines | |||
| 256 | }; | 256 | }; |
| 257 | #endif | 257 | #endif |
| 258 | 258 | ||
| 259 | void | ||
| 260 | aubio_log_function(int level, const char *message, void *data) | ||
| 261 | { | ||
| 262 | // remove trailing \n | ||
| 263 | char *pos; | ||
| 264 | if ((pos=strchr(message, '\n')) != NULL) { | ||
| 265 | *pos = '\0'; | ||
| 266 | } | ||
| 267 | // warning or error | ||
| 268 | if (level == AUBIO_LOG_ERR) { | ||
| 269 | PyErr_Format(PyExc_RuntimeError, "%s", message); | ||
| 270 | } else { | ||
| 271 | PyErr_WarnEx(PyExc_UserWarning, message, 1); | ||
| 272 | } | ||
| 273 | } | ||
| 274 | |||
| 259 | static PyObject * | 275 | static PyObject * |
| 260 | initaubio (void) | 276 | initaubio (void) |
| 261 | { | 277 | { |
| @@ -315,6 +331,8 @@ initaubio (void) · 53 unmodified lines | |||
| 315 | // add ufunc | 331 | // add ufunc |
| 316 | add_ufuncs(m); | 332 | add_ufuncs(m); |
| 317 | 333 | ||
| 334 | aubio_log_set_level_function(AUBIO_LOG_ERR, aubio_log_function, NULL); | ||
| 335 | aubio_log_set_level_function(AUBIO_LOG_WRN, aubio_log_function, NULL); | ||
| 318 | return m; | 336 | return m; |
| 319 | } | 337 | } |
| 320 | 338 | ||
| @@ -51,11 +51,8 @@ Py_fft_init (Py_fft * self, PyObject * args, PyObject * kwds) · 50 unmodified lines | |||
| 51 | { | 51 | { |
| 52 | self->o = new_aubio_fft (self->win_s); | 52 | self->o = new_aubio_fft (self->win_s); |
| 53 | if (self->o == NULL) { | 53 | if (self->o == NULL) { |
| 54 | PyErr_Format(PyExc_RuntimeError, | 54 | // PyErr_Format(PyExc_RuntimeError, ...) was set above by new_ which called |
| 55 | "error creating fft with win_s=%d " | 55 | // AUBIO_ERR when failing |
| 56 | "(should be a power of 2 greater than 1; " | ||
| 57 | "try recompiling aubio with --enable-fftw3)", | ||
| 58 | self->win_s); | ||
| 59 | return -1; | 56 | return -1; |
| 60 | } | 57 | } |
| 61 | 58 | ||
| @@ -66,9 +66,8 @@ Py_pvoc_init (Py_pvoc * self, PyObject * args, PyObject * kwds) · 65 unmodified lines | |||
| 66 | { | 66 | { |
| 67 | self->o = new_aubio_pvoc ( self->win_s, self->hop_s); | 67 | self->o = new_aubio_pvoc ( self->win_s, self->hop_s); |
| 68 | if (self->o == NULL) { | 68 | if (self->o == NULL) { |
| 69 | PyErr_Format(PyExc_RuntimeError, | 69 | // PyErr_Format(PyExc_RuntimeError, ...) was set above by new_ which called |
| 70 | "failed creating pvoc with win_s=%d, hop_s=%d", | 70 | // AUBIO_ERR when failing |
| 71 | self->win_s, self->hop_s); | ||
| 72 | return -1; | 71 | return -1; |
| 73 | } | 72 | } |
| 74 | 73 | ||
| @@ -140,8 +140,8 @@ Py_source_init (Py_source * self, PyObject * args, PyObject * kwds) · 139 unmodified lines | |||
| 140 | { | 140 | { |
| 141 | self->o = new_aubio_source ( self->uri, self->samplerate, self->hop_size ); | 141 | self->o = new_aubio_source ( self->uri, self->samplerate, self->hop_size ); |
| 142 | if (self->o == NULL) { | 142 | if (self->o == NULL) { |
| 143 | PyErr_Format (PyExc_RuntimeError, "error creating source with \"%s\"", | 143 | // PyErr_Format(PyExc_RuntimeError, ...) was set above by new_ which called |
| 144 | self->uri); | 144 | // AUBIO_ERR when failing |
| 145 | return -1; | 145 | return -1; |
| 146 | } | 146 | } |
| 147 | self->samplerate = aubio_source_get_samplerate ( self->o ); | 147 | self->samplerate = aubio_source_get_samplerate ( self->o ); |
| @@ -65,7 +65,8 @@ def add_local_aubio_sources(ext): · 64 unmodified lines | |||
| 65 | for define_macro in ['HAVE_STDLIB_H', 'HAVE_STDIO_H', | 65 | for define_macro in ['HAVE_STDLIB_H', 'HAVE_STDIO_H', |
| 66 | 'HAVE_MATH_H', 'HAVE_STRING_H', | 66 | 'HAVE_MATH_H', 'HAVE_STRING_H', |
| 67 | 'HAVE_C99_VARARGS_MACROS', | 67 | 'HAVE_C99_VARARGS_MACROS', |
| 68 | 'HAVE_LIMITS_H', 'HAVE_MEMCPY_HACKS']: | 68 | 'HAVE_LIMITS_H', 'HAVE_STDARG_H', |
| 69 | 'HAVE_MEMCPY_HACKS']: | ||
| 69 | ext.define_macros += [(define_macro, 1)] | 70 | ext.define_macros += [(define_macro, 1)] |
| 70 | 71 | ||
| 71 | # loof for additional packages | 72 | # loof for additional packages |
| @@ -98,7 +98,7 @@ class aubio_alpha_norm(TestCase): · 97 unmodified lines | |||
| 98 | x = np.random.rand(1024).astype(float_type) | 98 | x = np.random.rand(1024).astype(float_type) |
| 99 | alpha = np.random.rand() * 5. | 99 | alpha = np.random.rand() * 5. |
| 100 | x_alpha_norm = (np.sum(np.abs(x)**alpha)/len(x))**(1/alpha) | 100 | x_alpha_norm = (np.sum(np.abs(x)**alpha)/len(x))**(1/alpha) |
| 101 | assert_almost_equal(alpha_norm(x, alpha), x_alpha_norm, decimal = 5) | 101 | assert_almost_equal(alpha_norm(x, alpha), x_alpha_norm, decimal = 4) |
| 102 | 102 | ||
| 103 | class aubio_zero_crossing_rate_test(TestCase): | 103 | class aubio_zero_crossing_rate_test(TestCase): |
| 104 | 104 | ||
| @@ -6,6 +6,9 @@ from numpy.testing import TestCase · 5 unmodified lines | |||
| 6 | from aubio import source | 6 | from aubio import source |
| 7 | from utils import list_all_sounds | 7 | from utils import list_all_sounds |
| 8 | 8 | ||
| 9 | import warnings | ||
| 10 | warnings.filterwarnings('ignore', category=UserWarning, append=True) | ||
| 11 | |||
| 9 | list_of_sounds = list_all_sounds('sounds') | 12 | list_of_sounds = list_all_sounds('sounds') |
| 10 | samplerates = [0, 44100, 8000, 32000] | 13 | samplerates = [0, 44100, 8000, 32000] |
| 11 | hop_sizes = [512, 1024, 64] | 14 | hop_sizes = [512, 1024, 64] |
| @@ -22,7 +25,8 @@ for soundfile in list_of_sounds: · 10 unmodified lines | |||
| 22 | class aubio_source_test_case_base(TestCase): | 25 | class aubio_source_test_case_base(TestCase): |
| 23 | 26 | ||
| 24 | def setUp(self): | 27 | def setUp(self): |
| 25 | if not len(list_of_sounds): self.skipTest('add some sound files in \'python/tests/sounds\'') | 28 | if not len(list_of_sounds): |
| 29 | self.skipTest('add some sound files in \'python/tests/sounds\'') | ||
| 26 | self.default_test_sound = list_of_sounds[0] | 30 | self.default_test_sound = list_of_sounds[0] |
| 27 | 31 | ||
| 28 | class aubio_source_test_case(aubio_source_test_case_base): | 32 | class aubio_source_test_case(aubio_source_test_case_base): |
| @@ -225,10 +225,8 @@ class aubio_specdesc_wrong(TestCase): · 224 unmodified lines | |||
| 225 | specdesc("default", -10) | 225 | specdesc("default", -10) |
| 226 | 226 | ||
| 227 | def test_unknown(self): | 227 | def test_unknown(self): |
| 228 | # FIXME should fail? | 228 | with self.assertRaises(RuntimeError): |
| 229 | with self.assertRaises(ValueError): | ||
| 230 | specdesc("unknown", 512) | 229 | specdesc("unknown", 512) |
| 231 | self.skipTest('todo: new_specdesc should fail on wrong method') | ||
| 232 | 230 | ||
| 233 | if __name__ == '__main__': | 231 | if __name__ == '__main__': |
| 234 | main() | 232 | main() |