Changes in / [a95b386:75f9fff]
- Files:
-
- 3 deleted
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified Makefile ¶
ra95b386 r75f9fff 232 232 uninstall_python \ 233 233 check_clean_python 234 235 coverage_cycle: coverage_zero_counters coverage_report236 237 coverage_zero_counters:238 lcov --zerocounters --directory .239 234 240 235 coverage: export CFLAGS=--coverage … … 250 245 lcov -a build/coverage_python.info -a build/coverage_lib.info -o build/coverage.info 251 246 252 # make sure we don't build the doc, which builds a temporary python module253 coverage_report: export WAFOPTS += --disable-docs254 247 coverage_report: coverage 255 248 genhtml build/coverage.info --output-directory lcov_html -
TabularUnified doc/py_utils.rst ¶
ra95b386 r75f9fff 28 28 29 29 .. autofunction:: miditofreq 30 31 .. python/ext/py-musicutils.h32 33 .. autofunction:: meltohz34 35 .. autofunction:: hztomel36 30 37 31 .. python/ext/aubiomodule.c -
TabularUnified python/ext/aubiomodule.c ¶
ra95b386 r75f9fff 373 373 {"shift", Py_aubio_shift, METH_VARARGS, Py_aubio_shift_doc}, 374 374 {"ishift", Py_aubio_ishift, METH_VARARGS, Py_aubio_ishift_doc}, 375 {"hztomel", Py_aubio_hztomel, METH_VARARGS|METH_KEYWORDS, Py_aubio_hztomel_doc},376 {"meltohz", Py_aubio_meltohz, METH_VARARGS|METH_KEYWORDS, Py_aubio_meltohz_doc},377 {"hztomel_htk", Py_aubio_hztomel_htk, METH_VARARGS, Py_aubio_hztomel_htk_doc},378 {"meltohz_htk", Py_aubio_meltohz_htk, METH_VARARGS, Py_aubio_meltohz_htk_doc},379 375 {NULL, NULL, 0, NULL} /* Sentinel */ 380 376 }; -
TabularUnified python/ext/py-filterbank.c ¶
ra95b386 r75f9fff 139 139 &(self->freqs), samplerate); 140 140 if (err > 0) { 141 if (PyErr_Occurred() == NULL) { 142 PyErr_SetString (PyExc_ValueError, "error running set_triangle_bands"); 143 } else { 144 // change the RuntimeError into ValueError 145 PyObject *type, *value, *traceback; 146 PyErr_Fetch(&type, &value, &traceback); 147 PyErr_Restore(PyExc_ValueError, value, traceback); 148 } 141 PyErr_SetString (PyExc_ValueError, 142 "error when running set_triangle_bands"); 149 143 return NULL; 150 144 } … … 157 151 uint_t err = 0; 158 152 159 smpl_t samplerate;160 if (!PyArg_ParseTuple (args, AUBIO_NPY_SMPL_CHR, &samplerate)) {153 uint_t samplerate; 154 if (!PyArg_ParseTuple (args, "I", &samplerate)) { 161 155 return NULL; 162 156 } … … 164 158 err = aubio_filterbank_set_mel_coeffs_slaney (self->o, samplerate); 165 159 if (err > 0) { 166 if (PyErr_Occurred() == NULL) { 167 PyErr_SetString (PyExc_ValueError, "error running set_mel_coeffs_slaney"); 168 } else { 169 // change the RuntimeError into ValueError 170 PyObject *type, *value, *traceback; 171 PyErr_Fetch(&type, &value, &traceback); 172 PyErr_Restore(PyExc_ValueError, value, traceback); 173 } 174 return NULL; 175 } 176 Py_RETURN_NONE; 177 } 178 179 static PyObject * 180 Py_filterbank_set_mel_coeffs (Py_filterbank * self, PyObject *args) 181 { 182 uint_t err = 0; 183 184 smpl_t samplerate; 185 smpl_t freq_min; 186 smpl_t freq_max; 187 if (!PyArg_ParseTuple (args, AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR 188 AUBIO_NPY_SMPL_CHR, &samplerate, &freq_min, &freq_max)) { 189 return NULL; 190 } 191 192 err = aubio_filterbank_set_mel_coeffs (self->o, samplerate, 193 freq_min, freq_max); 194 if (err > 0) { 195 if (PyErr_Occurred() == NULL) { 196 PyErr_SetString (PyExc_ValueError, "error running set_mel_coeffs"); 197 } else { 198 // change the RuntimeError into ValueError 199 PyObject *type, *value, *traceback; 200 PyErr_Fetch(&type, &value, &traceback); 201 PyErr_Restore(PyExc_ValueError, value, traceback); 202 } 203 return NULL; 204 } 205 Py_RETURN_NONE; 206 } 207 208 static PyObject * 209 Py_filterbank_set_mel_coeffs_htk (Py_filterbank * self, PyObject *args) 210 { 211 uint_t err = 0; 212 213 smpl_t samplerate; 214 smpl_t freq_min; 215 smpl_t freq_max; 216 if (!PyArg_ParseTuple (args, AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR 217 AUBIO_NPY_SMPL_CHR, &samplerate, &freq_min, &freq_max)) { 218 return NULL; 219 } 220 221 err = aubio_filterbank_set_mel_coeffs_htk (self->o, samplerate, 222 freq_min, freq_max); 223 if (err > 0) { 224 if (PyErr_Occurred() == NULL) { 225 PyErr_SetString (PyExc_ValueError, "error running set_mel_coeffs_htk"); 226 } else { 227 // change the RuntimeError into ValueError 228 PyObject *type, *value, *traceback; 229 PyErr_Fetch(&type, &value, &traceback); 230 PyErr_Restore(PyExc_ValueError, value, traceback); 231 } 160 PyErr_SetString (PyExc_ValueError, 161 "error when running set_mel_coeffs_slaney"); 232 162 return NULL; 233 163 } … … 264 194 return (PyObject *)PyAubio_CFmatToArray( 265 195 aubio_filterbank_get_coeffs (self->o) ); 266 }267 268 static PyObject *269 Py_filterbank_set_power(Py_filterbank *self, PyObject *args)270 {271 uint_t power;272 273 if (!PyArg_ParseTuple (args, "I", &power)) {274 return NULL;275 }276 if(aubio_filterbank_set_power (self->o, power)) {277 if (PyErr_Occurred() == NULL) {278 PyErr_SetString (PyExc_ValueError,279 "error running filterbank.set_power");280 } else {281 // change the RuntimeError into ValueError282 PyObject *type, *value, *traceback;283 PyErr_Fetch(&type, &value, &traceback);284 PyErr_Restore(PyExc_ValueError, value, traceback);285 }286 return NULL;287 }288 Py_RETURN_NONE;289 }290 291 static PyObject *292 Py_filterbank_set_norm(Py_filterbank *self, PyObject *args)293 {294 uint_t playing;295 296 if (!PyArg_ParseTuple (args, "I", &playing)) {297 return NULL;298 }299 if(aubio_filterbank_set_norm (self->o, playing)) {300 if (PyErr_Occurred() == NULL) {301 PyErr_SetString (PyExc_ValueError,302 "error running filterbank.set_power");303 } else {304 // change the RuntimeError into ValueError305 PyObject *type, *value, *traceback;306 PyErr_Fetch(&type, &value, &traceback);307 PyErr_Restore(PyExc_ValueError, value, traceback);308 }309 return NULL;310 }311 Py_RETURN_NONE;312 196 } 313 197 … … 317 201 {"set_mel_coeffs_slaney", (PyCFunction) Py_filterbank_set_mel_coeffs_slaney, 318 202 METH_VARARGS, "set coefficients of filterbank as in Auditory Toolbox"}, 319 {"set_mel_coeffs", (PyCFunction) Py_filterbank_set_mel_coeffs,320 METH_VARARGS, "set coefficients of filterbank to linearly spaced mel scale"},321 {"set_mel_coeffs_htk", (PyCFunction) Py_filterbank_set_mel_coeffs_htk,322 METH_VARARGS, "set coefficients of filterbank to linearly spaced mel scale"},323 203 {"get_coeffs", (PyCFunction) Py_filterbank_get_coeffs, 324 204 METH_NOARGS, "get coefficients of filterbank"}, 325 205 {"set_coeffs", (PyCFunction) Py_filterbank_set_coeffs, 326 206 METH_VARARGS, "set coefficients of filterbank"}, 327 {"set_power", (PyCFunction) Py_filterbank_set_power,328 METH_VARARGS, "set power applied to filterbank input spectrum"},329 {"set_norm", (PyCFunction) Py_filterbank_set_norm,330 METH_VARARGS, "set norm applied to filterbank input spectrum"},331 207 {NULL} 332 208 }; -
TabularUnified python/ext/py-musicutils.c ¶
ra95b386 r75f9fff 182 182 return (PyObject *) PyAubio_CFvecToArray(&vec); 183 183 } 184 185 PyObject*186 Py_aubio_hztomel(PyObject *self, PyObject *args, PyObject *kwds)187 {188 smpl_t v;189 PyObject *htk = NULL;190 static char *kwlist[] = {"f", "htk", NULL};191 if (!PyArg_ParseTupleAndKeywords(args, kwds, AUBIO_NPY_SMPL_CHR "|O",192 kwlist, &v, &htk))193 {194 return NULL;195 }196 if (htk != NULL && PyObject_IsTrue(htk) == 1)197 return Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_hztomel_htk(v));198 else199 return Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_hztomel(v));200 }201 202 PyObject*203 Py_aubio_meltohz(PyObject *self, PyObject *args, PyObject *kwds)204 {205 smpl_t v;206 PyObject *htk = NULL;207 static char *kwlist[] = {"m", "htk", NULL};208 if (!PyArg_ParseTupleAndKeywords(args, kwds, AUBIO_NPY_SMPL_CHR "|O",209 kwlist, &v, &htk))210 {211 return NULL;212 }213 if (htk != NULL && PyObject_IsTrue(htk) == 1)214 return Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_meltohz_htk(v));215 else216 return Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_meltohz(v));217 }218 219 PyObject*220 Py_aubio_hztomel_htk(PyObject *self, PyObject *args)221 {222 smpl_t v;223 if (!PyArg_ParseTuple(args, AUBIO_NPY_SMPL_CHR, &v)) {224 return NULL;225 }226 return Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_hztomel_htk(v));227 }228 229 PyObject*230 Py_aubio_meltohz_htk(PyObject *self, PyObject *args)231 {232 smpl_t v;233 if (!PyArg_ParseTuple(args, AUBIO_NPY_SMPL_CHR, &v)) {234 return NULL;235 }236 return Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_meltohz_htk(v));237 } -
TabularUnified python/ext/py-musicutils.h ¶
ra95b386 r75f9fff 301 301 PyObject * Py_aubio_ishift(PyObject *self, PyObject *args); 302 302 303 static char Py_aubio_hztomel_doc[] = ""304 "hztomel(f, htk=False)\n"305 "\n"306 "Convert a scalar from frequency to mel scale.\n"307 "\n"308 "Parameters\n"309 "----------\n"310 "m : float\n"311 " input frequency, in Hz\n"312 "htk : bool\n"313 " if `True`, use Htk mel scale instead of Slaney.\n"314 "\n"315 "Returns\n"316 "-------\n"317 "float\n"318 " output mel\n"319 "\n"320 "See Also\n"321 "--------\n"322 "meltohz\n"323 "";324 PyObject * Py_aubio_hztomel(PyObject *self, PyObject *args);325 326 static char Py_aubio_meltohz_doc[] = ""327 "meltohz(m, htk=False)\n"328 "\n"329 "Convert a scalar from mel scale to frequency.\n"330 "\n"331 "Parameters\n"332 "----------\n"333 "m : float\n"334 " input mel\n"335 "htk : bool\n"336 " if `True`, use Htk mel scale instead of Slaney.\n"337 "\n"338 "Returns\n"339 "-------\n"340 "float\n"341 " output frequency, in Hz\n"342 "\n"343 "See Also\n"344 "--------\n"345 "hztomel\n"346 "";347 PyObject * Py_aubio_meltohz(PyObject *self, PyObject *args);348 349 static char Py_aubio_hztomel_htk_doc[] = ""350 "hztomel_htk(m)\n"351 "\n"352 "Same as `hztomel(m, htk=True)`\n"353 "\n"354 "See Also\n"355 "--------\n"356 "hztomel\n"357 "";358 PyObject * Py_aubio_hztomel_htk(PyObject *self, PyObject *args);359 360 static char Py_aubio_meltohz_htk_doc[] = ""361 "meltohz_htk(m)\n"362 "\n"363 "Same as `meltohz(m, htk=True)`\n"364 "\n"365 "See Also\n"366 "--------\n"367 "meltohz\n"368 "";369 PyObject * Py_aubio_meltohz_htk(PyObject *self, PyObject *args);370 371 303 #endif /* PY_AUBIO_MUSICUTILS_H */ -
TabularUnified python/lib/gen_code.py ¶
ra95b386 r75f9fff 463 463 """.format(**self.__dict__) 464 464 for set_param in self.prototypes['set']: 465 params = get_params_types_names(set_param)[1:] 466 param = self.shortname.split('_set_')[-1] 467 paramdecls = "".join([""" 468 {0} {1};""".format(p['type'], p['name']) for p in params]) 465 params = get_params_types_names(set_param)[1] 466 paramtype = params['type'] 469 467 method_name = get_name(set_param) 470 468 param = method_name.split('aubio_'+self.shortname+'_set_')[-1] 471 refs = ", ".join(["&%s" % p['name'] for p in params]) 472 paramlist = ", ".join(["%s" % p['name'] for p in params]) 473 if len(params): 474 paramlist = "," + paramlist 475 pyparamtypes = ''.join([pyargparse_chars[p['type']] for p in params]) 469 pyparamtype = pyargparse_chars[paramtype] 476 470 out += """ 477 471 static PyObject * … … 479 473 {{ 480 474 uint_t err = 0; 481 {paramdecls} 482 """.format(param = param, paramdecls = paramdecls, **self.__dict__) 483 484 if len(refs) and len(pyparamtypes): 485 out += """ 486 487 if (!PyArg_ParseTuple (args, "{pyparamtypes}", {refs})) {{ 475 {paramtype} {param}; 476 477 if (!PyArg_ParseTuple (args, "{pyparamtype}", &{param})) {{ 488 478 return NULL; 489 479 }} 490 """.format(pyparamtypes = pyparamtypes, refs = refs) 491 492 out += """ 493 err = aubio_{shortname}_set_{param} (self->o {paramlist}); 480 err = aubio_{shortname}_set_{param} (self->o, {param}); 494 481 495 482 if (err > 0) {{ … … 506 493 Py_RETURN_NONE; 507 494 }} 508 """.format(param = param, refs = refs, paramdecls = paramdecls, 509 pyparamtypes = pyparamtypes, paramlist = paramlist, **self.__dict__) 495 """.format(param = param, paramtype = paramtype, pyparamtype = pyparamtype, **self.__dict__) 510 496 return out 511 497 -
TabularUnified python/tests/test_fft.py ¶
ra95b386 r75f9fff 142 142 assert_almost_equal ( r[1:], 0) 143 143 144 class aubio_fft_odd_sizes(TestCase):145 146 def test_reconstruct_with_odd_size(self):147 win_s = 29148 self.recontruct(win_s, 'odd sizes not supported')149 150 def test_reconstruct_with_radix15(self):151 win_s = 2 ** 4 * 15152 self.recontruct(win_s, 'radix 15 supported')153 154 def test_reconstruct_with_radix5(self):155 win_s = 2 ** 4 * 5156 self.recontruct(win_s, 'radix 5 supported')157 158 def test_reconstruct_with_radix3(self):159 win_s = 2 ** 4 * 3160 self.recontruct(win_s, 'radix 3 supported')161 162 def recontruct(self, win_s, skipMessage):163 try:164 f = fft(win_s)165 except RuntimeError:166 self.skipTest(skipMessage)167 input_signal = fvec(win_s)168 input_signal[win_s//2] = 1169 c = f(input_signal)170 output_signal = f.rdo(c)171 assert_almost_equal(input_signal, output_signal)172 173 class aubio_fft_wrong_params(TestCase):174 175 144 def test_large_input_timegrain(self): 176 145 win_s = 1024 … … 201 170 f.rdo(s) 202 171 172 class aubio_fft_wrong_params(TestCase): 173 203 174 def test_wrong_buf_size(self): 204 175 win_s = -1 205 176 with self.assertRaises(ValueError): 206 177 fft(win_s) 178 179 def test_buf_size_not_power_of_two(self): 180 # when compiled with fftw3, aubio supports non power of two fft sizes 181 win_s = 320 182 try: 183 with self.assertRaises(RuntimeError): 184 fft(win_s) 185 except AssertionError: 186 self.skipTest('creating aubio.fft with size %d did not fail' % win_s) 207 187 208 188 def test_buf_size_too_small(self): -
TabularUnified python/tests/test_filterbank_mel.py ¶
ra95b386 r75f9fff 110 110 111 111 112 def test_triangle_freqs_without_norm(self):113 """make sure set_triangle_bands works without """114 samplerate = 22050115 freq_list = fvec([0, 100, 1000, 10000])116 f = filterbank(len(freq_list) - 2, 1024)117 f.set_norm(0)118 f.set_triangle_bands(freq_list, samplerate)119 expected = f.get_coeffs()120 f.set_norm(1)121 f.set_triangle_bands(fvec(freq_list), samplerate)122 assert_almost_equal(f.get_coeffs().T,123 expected.T * 2. / (freq_list[2:] - freq_list[:-2]))124 125 def test_triangle_freqs_wrong_norm(self):126 f = filterbank(10, 1024)127 with self.assertRaises(ValueError):128 f.set_norm(-1)129 130 def test_triangle_freqs_with_power(self):131 f = filterbank(9, 1024)132 freqs = fvec([40, 80, 200, 400, 800, 1600, 3200, 6400, 12800, 15000,133 24000])134 f.set_power(2)135 f.set_triangle_bands(freqs, 48000)136 spec = cvec(1024)137 spec.norm[:] = .1138 expected = fvec([0.02070313, 0.02138672, 0.02127604, 0.02135417,139 0.02133301, 0.02133301, 0.02133311, 0.02133334, 0.02133345])140 expected /= 100.141 assert_almost_equal(f(spec), expected)142 143 def test_mel_coeffs(self):144 f = filterbank(40, 1024)145 f.set_mel_coeffs(44100, 0, 44100 / 2)146 147 def test_zero_fmax(self):148 f = filterbank(40, 1024)149 f.set_mel_coeffs(44100, 0, 0)150 151 def test_wrong_mel_coeffs(self):152 f = filterbank(40, 1024)153 with self.assertRaises(ValueError):154 f.set_mel_coeffs_slaney(0)155 with self.assertRaises(ValueError):156 f.set_mel_coeffs(44100, 0, -44100 / 2)157 with self.assertRaises(ValueError):158 f.set_mel_coeffs(44100, -0.1, 44100 / 2)159 with self.assertRaises(ValueError):160 f.set_mel_coeffs(-44100, 0.1, 44100 / 2)161 with self.assertRaises(ValueError):162 f.set_mel_coeffs_htk(-1, 0, 0)163 164 def test_mel_coeffs_htk(self):165 f = filterbank(40, 1024)166 f.set_mel_coeffs_htk(44100, 0, 44100 / 2)167 168 169 112 if __name__ == '__main__': 170 113 from unittest import main -
TabularUnified src/io/source_avcodec.c ¶
ra95b386 r75f9fff 90 90 sint_t selected_stream; 91 91 uint_t eof; 92 uint_t multi; 92 93 }; 93 94 94 95 // create or re-create the context when _do or _do_multi is called 95 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s); 96 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s, 97 uint_t multi); 96 98 // actually read a frame 97 99 void aubio_source_avcodec_readframe(aubio_source_avcodec_t *s, … … 283 285 s->avFrame = avFrame; 284 286 285 aubio_source_avcodec_reset_resampler(s); 287 // default to mono output 288 aubio_source_avcodec_reset_resampler(s, 0); 286 289 287 290 if (s->avr == NULL) goto beach; 288 291 289 292 s->eof = 0; 293 s->multi = 0; 290 294 291 295 //av_log_set_level(AV_LOG_QUIET); … … 300 304 } 301 305 302 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s) 306 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s, 307 uint_t multi) 303 308 { 304 309 // create or reset resampler to/from mono/multi-channel 305 if ( s->avr == NULL) {310 if ( (multi != s->multi) || (s->avr == NULL) ) { 306 311 int err; 307 312 int64_t input_layout = av_get_default_channel_layout(s->input_channels); 308 int64_t output_layout = av_get_default_channel_layout(s->input_channels); 313 uint_t output_channels = multi ? s->input_channels : 1; 314 int64_t output_layout = av_get_default_channel_layout(output_channels); 309 315 #ifdef HAVE_AVRESAMPLE 310 316 AVAudioResampleContext *avr = avresample_alloc_context(); 317 AVAudioResampleContext *oldavr = s->avr; 311 318 #elif defined(HAVE_SWRESAMPLE) 312 319 SwrContext *avr = swr_alloc(); 320 SwrContext *oldavr = s->avr; 313 321 #endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */ 314 322 … … 338 346 } 339 347 s->avr = avr; 348 if (oldavr != NULL) { 349 #ifdef HAVE_AVRESAMPLE 350 avresample_close( oldavr ); 351 #elif defined(HAVE_SWRESAMPLE) 352 swr_close ( oldavr ); 353 #endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */ 354 av_free ( oldavr ); 355 oldavr = NULL; 356 } 357 s->multi = multi; 340 358 } 341 359 } … … 478 496 void aubio_source_avcodec_do(aubio_source_avcodec_t * s, fvec_t * read_data, 479 497 uint_t * read) { 480 uint_t i , j;498 uint_t i; 481 499 uint_t end = 0; 482 500 uint_t total_wrote = 0; 501 // switch from multi 502 if (s->multi == 1) aubio_source_avcodec_reset_resampler(s, 0); 483 503 while (total_wrote < s->hop_size) { 484 504 end = MIN(s->read_samples - s->read_index, s->hop_size - total_wrote); 485 505 for (i = 0; i < end; i++) { 486 read_data->data[i + total_wrote] = 0.; 487 for (j = 0; j < s->input_channels; j++) { 488 read_data->data[i + total_wrote] += 489 s->output[(i + s->read_index) * s->input_channels + j]; 490 } 491 read_data->data[i + total_wrote] *= 1./s->input_channels; 506 read_data->data[i + total_wrote] = s->output[i + s->read_index]; 492 507 } 493 508 total_wrote += end; … … 517 532 uint_t end = 0; 518 533 uint_t total_wrote = 0; 534 // switch from mono 535 if (s->multi == 0) aubio_source_avcodec_reset_resampler(s, 1); 519 536 while (total_wrote < s->hop_size) { 520 537 end = MIN(s->read_samples - s->read_index, s->hop_size - total_wrote); -
TabularUnified src/mathutils.c ¶
ra95b386 r75f9fff 388 388 } 389 389 390 void391 fvec_mul (fvec_t *o, smpl_t val)392 {393 uint_t j;394 for (j = 0; j < o->length; j++) {395 o->data[j] *= val;396 }397 }398 399 390 void fvec_adapt_thres(fvec_t * vec, fvec_t * tmp, 400 391 uint_t post, uint_t pre) { -
TabularUnified src/mathutils.h ¶
ra95b386 r75f9fff 193 193 */ 194 194 void fvec_add (fvec_t * v, smpl_t c); 195 196 /** multiply each elements of a vector by a scalar197 198 \param v vector to add constant to199 \param s constant to scale v with200 201 */202 void fvec_mul (fvec_t * v, smpl_t s);203 195 204 196 /** remove the minimum value of the vector to each elements -
TabularUnified src/musicutils.h ¶
ra95b386 r75f9fff 87 87 smpl_t aubio_freqtobin (smpl_t freq, smpl_t samplerate, smpl_t fftsize); 88 88 89 /** convert frequency (Hz) to mel90 91 \param freq input frequency, in Hz92 93 \return output mel94 95 Converts a scalar from the frequency domain to the mel scale using Slaney96 Auditory Toolbox's implementation:97 98 If \f$ f < 1000 \f$, \f$ m = 3 f / 200 \f$.99 100 If \f$ f >= 1000 \f$, \f$ m = 1000 + 27 \frac{{ln}(f) - ln(1000))}101 {{ln}(6400) - ln(1000)}102 \f$103 104 See also105 --------106 107 aubio_meltohz(), aubio_hztomel_htk().108 109 */110 smpl_t aubio_hztomel (smpl_t freq);111 112 /** convert mel to frequency (Hz)113 114 \param mel input mel115 116 \return output frequency, in Hz117 118 Converts a scalar from the mel scale to the frequency domain using Slaney119 Auditory Toolbox's implementation:120 121 If \f$ f < 1000 \f$, \f$ f = 200 m/3 \f$.122 123 If \f$ f \geq 1000 \f$, \f$ f = 1000 + \left(\frac{6400}{1000}\right)124 ^{\frac{m - 1000}{27}} \f$125 126 See also127 --------128 129 aubio_hztomel(), aubio_meltohz_htk().130 131 References132 ----------133 134 Malcolm Slaney, *Auditory Toolbox Version 2, Technical Report #1998-010*135 https://engineering.purdue.edu/~malcolm/interval/1998-010/136 137 */138 smpl_t aubio_meltohz (smpl_t mel);139 140 /** convert frequency (Hz) to mel141 142 \param freq input frequency, in Hz143 144 \return output mel145 146 Converts a scalar from the frequency domain to the mel scale, using the147 equation defined by O'Shaughnessy, as implemented in the HTK speech148 recognition toolkit:149 150 \f$ m = 1127 + ln(1 + \frac{f}{700}) \f$151 152 See also153 --------154 155 aubio_meltohz_htk(), aubio_hztomel().156 157 References158 ----------159 160 Douglas O'Shaughnessy (1987). *Speech communication: human and machine*.161 Addison-Wesley. p. 150. ISBN 978-0-201-16520-3.162 163 HTK Speech Recognition Toolkit: http://htk.eng.cam.ac.uk/164 165 */166 smpl_t aubio_hztomel_htk (smpl_t freq);167 168 /** convert mel to frequency (Hz)169 170 \param mel input mel171 172 \return output frequency, in Hz173 174 Converts a scalar from the mel scale to the frequency domain, using the175 equation defined by O'Shaughnessy, as implemented in the HTK speech176 recognition toolkit:177 178 \f$ f = 700 * {e}^\left(\frac{f}{1127} - 1\right) \f$179 180 See also181 --------182 183 aubio_hztomel_htk(), aubio_meltohz().184 185 */186 smpl_t aubio_meltohz_htk (smpl_t mel);187 188 89 /** convert frequency (Hz) to midi value (0-128) */ 189 90 smpl_t aubio_freqtomidi (smpl_t freq); -
TabularUnified src/spectral/fft.c ¶
ra95b386 r75f9fff 90 90 #define aubio_vDSP_vsadd vDSP_vsadd 91 91 #define aubio_vDSP_vsmul vDSP_vsmul 92 #define aubio_vDSP_create_fftsetup vDSP_create_fftsetup 93 #define aubio_vDSP_destroy_fftsetup vDSP_destroy_fftsetup 92 94 #define aubio_DSPComplex DSPComplex 93 95 #define aubio_DSPSplitComplex DSPSplitComplex 94 #define aubio_vDSP_DFT_Setup vDSP_DFT_Setup 95 #define aubio_vDSP_DFT_zrop_CreateSetup vDSP_DFT_zrop_CreateSetup 96 #define aubio_vDSP_DFT_Execute vDSP_DFT_Execute 97 #define aubio_vDSP_DFT_DestroySetup vDSP_DFT_DestroySetup 96 #define aubio_FFTSetup FFTSetup 98 97 #define aubio_vvsqrt vvsqrtf 99 98 #else … … 105 104 #define aubio_vDSP_vsadd vDSP_vsaddD 106 105 #define aubio_vDSP_vsmul vDSP_vsmulD 106 #define aubio_vDSP_create_fftsetup vDSP_create_fftsetupD 107 #define aubio_vDSP_destroy_fftsetup vDSP_destroy_fftsetupD 107 108 #define aubio_DSPComplex DSPDoubleComplex 108 109 #define aubio_DSPSplitComplex DSPDoubleSplitComplex 109 #define aubio_vDSP_DFT_Setup vDSP_DFT_SetupD 110 #define aubio_vDSP_DFT_zrop_CreateSetup vDSP_DFT_zrop_CreateSetupD 111 #define aubio_vDSP_DFT_Execute vDSP_DFT_ExecuteD 112 #define aubio_vDSP_DFT_DestroySetup vDSP_DFT_DestroySetupD 110 #define aubio_FFTSetup FFTSetupD 113 111 #define aubio_vvsqrt vvsqrt 114 112 #endif /* HAVE_AUBIO_DOUBLE */ … … 155 153 156 154 #elif defined HAVE_ACCELERATE // using ACCELERATE 157 aubio_vDSP_DFT_Setup fftSetupFwd;158 aubio_ vDSP_DFT_Setup fftSetupBwd;155 int log2fftsize; 156 aubio_FFTSetup fftSetup; 159 157 aubio_DSPSplitComplex spec; 160 158 smpl_t *in, *out; … … 213 211 214 212 #elif defined HAVE_ACCELERATE // using ACCELERATE 215 {216 uint_t radix = winsize;217 uint_t order = 0;218 while ((radix / 2) * 2 == radix) {219 radix /= 2;220 order++;221 }222 if (order < 4 || (radix != 1 && radix != 3 && radix != 5 && radix != 15)) {223 AUBIO_ERR("fft: vDSP/Accelerate supports FFT with sizes = "224 "f * 2 ** n, where n > 4 and f in [1, 3, 5, 15], but requested %d. "225 "Use the closest power of two, or try recompiling aubio with "226 "--enable-fftw3.\n", winsize);227 goto beach;228 }229 }230 213 s->winsize = winsize; 231 214 s->fft_size = winsize; 232 215 s->compspec = new_fvec(winsize); 216 s->log2fftsize = aubio_power_of_two_order(s->fft_size); 233 217 s->in = AUBIO_ARRAY(smpl_t, s->fft_size); 234 218 s->out = AUBIO_ARRAY(smpl_t, s->fft_size); 235 219 s->spec.realp = AUBIO_ARRAY(smpl_t, s->fft_size/2); 236 220 s->spec.imagp = AUBIO_ARRAY(smpl_t, s->fft_size/2); 237 s->fftSetupFwd = aubio_vDSP_DFT_zrop_CreateSetup(NULL, 238 s->fft_size, vDSP_DFT_FORWARD); 239 s->fftSetupBwd = aubio_vDSP_DFT_zrop_CreateSetup(s->fftSetupFwd, 240 s->fft_size, vDSP_DFT_INVERSE); 221 s->fftSetup = aubio_vDSP_create_fftsetup(s->log2fftsize, FFT_RADIX2); 241 222 242 223 #elif defined HAVE_INTEL_IPP // using Intel IPP … … 312 293 AUBIO_FREE(s->spec.realp); 313 294 AUBIO_FREE(s->spec.imagp); 314 aubio_vDSP_DFT_DestroySetup(s->fftSetupBwd); 315 aubio_vDSP_DFT_DestroySetup(s->fftSetupFwd); 295 aubio_vDSP_destroy_fftsetup(s->fftSetup); 316 296 317 297 #elif defined HAVE_INTEL_IPP // using Intel IPP … … 371 351 aubio_vDSP_ctoz((aubio_DSPComplex*)s->in, 2, &s->spec, 1, s->fft_size/2); 372 352 // compute the FFT 373 aubio_vDSP_DFT_Execute(s->fftSetupFwd, s->spec.realp, s->spec.imagp, 374 s->spec.realp, s->spec.imagp); 353 aubio_vDSP_fft_zrip(s->fftSetup, &s->spec, 1, s->log2fftsize, FFT_FORWARD); 375 354 // convert from vDSP complex split to [ r0, r1, ..., rN, iN-1, .., i2, i1] 376 355 compspec->data[0] = s->spec.realp[0]; … … 440 419 aubio_vDSP_ctoz((aubio_DSPComplex*)s->out, 2, &s->spec, 1, s->fft_size/2); 441 420 // compute the FFT 442 aubio_vDSP_DFT_Execute(s->fftSetupBwd, s->spec.realp, s->spec.imagp, 443 s->spec.realp, s->spec.imagp); 421 aubio_vDSP_fft_zrip(s->fftSetup, &s->spec, 1, s->log2fftsize, FFT_INVERSE); 444 422 // convert result to real output 445 423 aubio_vDSP_ztoc(&s->spec, 1, (aubio_DSPComplex*)output->data, 2, s->fft_size/2); … … 516 494 } 517 495 #endif 518 #ifdef HAVE_FFTW3 519 // for even length only, make sure last element is 0 or PI 520 if (2 * (compspec->length / 2) == compspec->length) { 521 #endif 522 if (compspec->data[compspec->length/2] < 0) { 523 spectrum->phas[spectrum->length - 1] = PI; 524 } else { 525 spectrum->phas[spectrum->length - 1] = 0.; 526 } 527 #ifdef HAVE_FFTW3 496 if (compspec->data[compspec->length/2] < 0) { 497 spectrum->phas[spectrum->length - 1] = PI; 528 498 } else { 529 i = spectrum->length - 1; 530 spectrum->phas[i] = ATAN2(compspec->data[compspec->length-i], 531 compspec->data[i]); 532 } 533 #endif 499 spectrum->phas[spectrum->length - 1] = 0.; 500 } 534 501 } 535 502 … … 541 508 + SQR(compspec->data[compspec->length - i]) ); 542 509 } 543 #ifdef HAVE_FFTW3 544 // for even length, make sure last element is > 0 545 if (2 * (compspec->length / 2) == compspec->length) { 546 #endif 547 spectrum->norm[spectrum->length-1] = 548 ABS(compspec->data[compspec->length/2]); 549 #ifdef HAVE_FFTW3 550 } else { 551 i = spectrum->length - 1; 552 spectrum->norm[i] = SQRT(SQR(compspec->data[i]) 553 + SQR(compspec->data[compspec->length - i]) ); 554 } 555 #endif 510 spectrum->norm[spectrum->length-1] = 511 ABS(compspec->data[compspec->length/2]); 556 512 } 557 513 -
TabularUnified src/spectral/filterbank.c ¶
ra95b386 r75f9fff 24 24 #include "fmat.h" 25 25 #include "cvec.h" 26 #include "vecutils.h"27 26 #include "spectral/filterbank.h" 28 27 #include "mathutils.h" … … 34 33 uint_t n_filters; 35 34 fmat_t *filters; 36 smpl_t norm;37 smpl_t power;38 35 }; 39 36 … … 48 45 /* allocate filter tables, a matrix of length win_s and of height n_filters */ 49 46 fb->filters = new_fmat (n_filters, win_s / 2 + 1); 50 51 fb->norm = 1;52 53 fb->power = 1;54 47 55 48 return fb; … … 75 68 tmp.data = in->norm; 76 69 77 if (f->power != 1.) fvec_pow(&tmp, f->power);78 79 70 fmat_vecmul(f->filters, &tmp, out); 80 71 … … 94 85 return 0; 95 86 } 96 97 uint_t98 aubio_filterbank_set_norm (aubio_filterbank_t *f, smpl_t norm)99 {100 if (norm != 0 && norm != 1) return AUBIO_FAIL;101 f->norm = norm;102 return AUBIO_OK;103 }104 105 smpl_t106 aubio_filterbank_get_norm (aubio_filterbank_t *f)107 {108 return f->norm;109 }110 111 uint_t112 aubio_filterbank_set_power (aubio_filterbank_t *f, smpl_t power)113 {114 f->power = power;115 return AUBIO_OK;116 }117 118 smpl_t119 aubio_filterbank_get_power (aubio_filterbank_t *f)120 {121 return f->norm;122 } -
TabularUnified src/spectral/filterbank.h ¶
ra95b386 r75f9fff 84 84 uint_t aubio_filterbank_set_coeffs (aubio_filterbank_t * f, const fmat_t * filters); 85 85 86 /** set norm parameter87 88 \param f filterbank object, as returned by new_aubio_filterbank()89 \param norm `1` to norm the filters, `0` otherwise.90 91 If set to `0`, the filters will not be normalized. If set to `1`,92 each filter will be normalized to one. Defaults to `1`.93 94 This function should be called *before* setting the filters with one of95 aubio_filterbank_set_triangle_bands(), aubio_filterbank_set_mel_coeffs(),96 aubio_filterbank_set_mel_coeffs_htk(), or97 aubio_filterbank_set_mel_coeffs_slaney().98 99 */100 uint_t aubio_filterbank_set_norm (aubio_filterbank_t *f, smpl_t norm);101 102 /** get norm parameter103 104 \param f filterbank object, as returned by new_aubio_filterbank()105 \returns `1` if norm is set, `0` otherwise. Defaults to `1`.106 107 */108 smpl_t aubio_filterbank_get_norm (aubio_filterbank_t *f);109 110 /** set power parameter111 112 \param f filterbank object, as returned by new_aubio_filterbank()113 \param power Raise norm of the input spectrum norm to this power before114 computing filterbank. Defaults to `1`.115 116 */117 uint_t aubio_filterbank_set_power (aubio_filterbank_t *f, smpl_t power);118 119 /** get power parameter120 121 \param f filterbank object, as returned by new_aubio_filterbank()122 \return current power parameter. Defaults to `1`.123 124 */125 smpl_t aubio_filterbank_get_power (aubio_filterbank_t *f);126 127 86 #ifdef __cplusplus 128 87 } -
TabularUnified src/spectral/filterbank_mel.c ¶
ra95b386 r75f9fff 91 91 92 92 /* compute triangle heights so that each triangle has unit area */ 93 if (aubio_filterbank_get_norm(fb)) { 94 for (fn = 0; fn < n_filters; fn++) { 95 triangle_heights->data[fn] = 96 2. / (upper_freqs->data[fn] - lower_freqs->data[fn]); 97 } 98 } else { 99 fvec_ones (triangle_heights); 93 for (fn = 0; fn < n_filters; fn++) { 94 triangle_heights->data[fn] = 95 2. / (upper_freqs->data[fn] - lower_freqs->data[fn]); 100 96 } 101 97 … … 122 118 123 119 /* compute positive slope step size */ 124 riseInc = triangle_heights->data[fn] 125 / (center_freqs->data[fn] - lower_freqs->data[fn]); 120 riseInc = 121 triangle_heights->data[fn] / 122 (center_freqs->data[fn] - lower_freqs->data[fn]); 126 123 127 124 /* compute coefficients in positive slope */ … … 137 134 138 135 /* compute negative slope step size */ 139 downInc = triangle_heights->data[fn] 140 / (upper_freqs->data[fn] - center_freqs->data[fn]); 136 downInc = 137 triangle_heights->data[fn] / 138 (upper_freqs->data[fn] - center_freqs->data[fn]); 141 139 142 140 /* compute coefficents in negative slope */ … … 171 169 smpl_t samplerate) 172 170 { 171 uint_t retval; 172 173 173 /* Malcolm Slaney parameters */ 174 const smpl_t lowestFrequency = 133.3333; 175 const smpl_t linearSpacing = 66.66666666; 176 const smpl_t logSpacing = 1.0711703; 177 178 const uint_t linearFilters = 13; 179 const uint_t logFilters = 27; 180 const uint_t n_filters = linearFilters + logFilters; 181 182 uint_t fn, retval; 174 smpl_t lowestFrequency = 133.3333; 175 smpl_t linearSpacing = 66.66666666; 176 smpl_t logSpacing = 1.0711703; 177 178 uint_t linearFilters = 13; 179 uint_t logFilters = 27; 180 uint_t n_filters = linearFilters + logFilters; 181 182 uint_t fn; /* filter counter */ 183 183 184 smpl_t lastlinearCF; 184 185 185 186 /* buffers to compute filter frequencies */ 186 fvec_t *freqs; 187 188 if (samplerate <= 0) { 189 AUBIO_ERR("filterbank: set_mel_coeffs_slaney samplerate should be > 0\n"); 190 return AUBIO_FAIL; 191 } 192 193 freqs = new_fvec (n_filters + 2); 187 fvec_t *freqs = new_fvec (n_filters + 2); 194 188 195 189 /* first step: fill all the linear filter frequencies */ … … 213 207 return retval; 214 208 } 215 216 static uint_t aubio_filterbank_check_freqs (aubio_filterbank_t *fb UNUSED,217 smpl_t samplerate, smpl_t *freq_min, smpl_t *freq_max)218 {219 if (samplerate <= 0) {220 AUBIO_ERR("filterbank: set_mel_coeffs samplerate should be > 0\n");221 return AUBIO_FAIL;222 }223 if (*freq_max < 0) {224 AUBIO_ERR("filterbank: set_mel_coeffs freq_max should be > 0\n");225 return AUBIO_FAIL;226 } else if (*freq_max == 0) {227 *freq_max = samplerate / 2.;228 }229 if (*freq_min < 0) {230 AUBIO_ERR("filterbank: set_mel_coeffs freq_min should be > 0\n");231 return AUBIO_FAIL;232 }233 return AUBIO_OK;234 }235 236 uint_t237 aubio_filterbank_set_mel_coeffs (aubio_filterbank_t * fb, smpl_t samplerate,238 smpl_t freq_min, smpl_t freq_max)239 {240 uint_t m, retval;241 smpl_t start = freq_min, end = freq_max, step;242 fvec_t *freqs;243 fmat_t *coeffs = aubio_filterbank_get_coeffs(fb);244 uint_t n_bands = coeffs->height;245 246 if (aubio_filterbank_check_freqs(fb, samplerate, &start, &end)) {247 return AUBIO_FAIL;248 }249 250 start = aubio_hztomel(start);251 end = aubio_hztomel(end);252 253 freqs = new_fvec(n_bands + 2);254 step = (end - start) / (n_bands + 1);255 256 for (m = 0; m < n_bands + 2; m++)257 {258 freqs->data[m] = MIN(aubio_meltohz(start + step * m), samplerate/2.);259 }260 261 retval = aubio_filterbank_set_triangle_bands (fb, freqs, samplerate);262 263 /* destroy vector used to store frequency limits */264 del_fvec (freqs);265 return retval;266 }267 268 uint_t269 aubio_filterbank_set_mel_coeffs_htk (aubio_filterbank_t * fb, smpl_t samplerate,270 smpl_t freq_min, smpl_t freq_max)271 {272 uint_t m, retval;273 smpl_t start = freq_min, end = freq_max, step;274 fvec_t *freqs;275 fmat_t *coeffs = aubio_filterbank_get_coeffs(fb);276 uint_t n_bands = coeffs->height;277 278 if (aubio_filterbank_check_freqs(fb, samplerate, &start, &end)) {279 return AUBIO_FAIL;280 }281 282 start = aubio_hztomel_htk(start);283 end = aubio_hztomel_htk(end);284 285 freqs = new_fvec (n_bands + 2);286 step = (end - start) / (n_bands + 1);287 288 for (m = 0; m < n_bands + 2; m++)289 {290 freqs->data[m] = MIN(aubio_meltohz_htk(start + step * m), samplerate/2.);291 }292 293 retval = aubio_filterbank_set_triangle_bands (fb, freqs, samplerate);294 295 /* destroy vector used to store frequency limits */296 del_fvec (freqs);297 return retval;298 } -
TabularUnified src/spectral/filterbank_mel.h ¶
ra95b386 r75f9fff 56 56 57 57 \param fb filterbank object 58 \param samplerate audio sampling rate , in Hz58 \param samplerate audio sampling rate 59 59 60 The filter coefficients are built to match exactlyMalcolm Slaney's Auditory61 Toolbox implementation (see file mfcc.m). The number of filters should be 40.60 The filter coefficients are built according to Malcolm Slaney's Auditory 61 Toolbox, available online at the following address (see file mfcc.m): 62 62 63 References64 ----------65 66 Malcolm Slaney, *Auditory Toolbox Version 2, Technical Report #1998-010*67 63 https://engineering.purdue.edu/~malcolm/interval/1998-010/ 68 64 … … 71 67 smpl_t samplerate); 72 68 73 /** Mel filterbank initialization74 75 \param fb filterbank object76 \param samplerate audio sampling rate77 \param fmin start frequency, in Hz78 \param fmax end frequency, in Hz79 80 The filterbank will be initialized with bands linearly spaced in the mel81 scale, from `fmin` to `fmax`.82 83 References84 ----------85 86 Malcolm Slaney, *Auditory Toolbox Version 2, Technical Report #1998-010*87 https://engineering.purdue.edu/~malcolm/interval/1998-010/88 89 */90 uint_t aubio_filterbank_set_mel_coeffs(aubio_filterbank_t * fb,91 smpl_t samplerate, smpl_t fmin, smpl_t fmax);92 93 /** Mel filterbank initialization94 95 \param fb filterbank object96 \param samplerate audio sampling rate97 \param fmin start frequency, in Hz98 \param fmax end frequency, in Hz99 100 The bank of filters will be initalized to to cover linearly spaced bands in101 the Htk mel scale, from `fmin` to `fmax`.102 103 References104 ----------105 106 Douglas O'Shaughnessy (1987). *Speech communication: human and machine*.107 Addison-Wesley. p. 150. ISBN 978-0-201-16520-3.108 109 HTK Speech Recognition Toolkit: http://htk.eng.cam.ac.uk/110 111 */112 uint_t aubio_filterbank_set_mel_coeffs_htk(aubio_filterbank_t * fb,113 smpl_t samplerate, smpl_t fmin, smpl_t fmax);114 115 69 #ifdef __cplusplus 116 70 } -
TabularUnified src/spectral/mfcc.c ¶
ra95b386 r75f9fff 52 52 fvec_t *output; 53 53 #endif 54 smpl_t scale;55 54 }; 56 55 … … 76 75 /* filterbank allocation */ 77 76 mfcc->fb = new_aubio_filterbank (n_filters, mfcc->win_s); 78 if (n_filters == 40) 79 aubio_filterbank_set_mel_coeffs_slaney (mfcc->fb, samplerate); 80 else 81 aubio_filterbank_set_mel_coeffs(mfcc->fb, samplerate, 82 0, samplerate/2.); 77 aubio_filterbank_set_mel_coeffs_slaney (mfcc->fb, samplerate); 83 78 84 79 /* allocating buffers */ … … 102 97 mfcc->output = new_fvec (n_filters); 103 98 #endif 104 105 mfcc->scale = 1.;106 99 107 100 return mfcc; … … 135 128 fvec_t tmp; 136 129 #endif 137 138 130 /* compute filterbank */ 139 131 aubio_filterbank_do (mf->fb, in, mf->in_dct); … … 142 134 fvec_log10 (mf->in_dct); 143 135 144 if (mf->scale != 1) fvec_mul (mf->in_dct, mf->scale); 136 /* raise power */ 137 //fvec_pow (mf->in_dct, 3.); 145 138 146 139 /* compute mfccs */ … … 158 151 return; 159 152 } 160 161 uint_t aubio_mfcc_set_power (aubio_mfcc_t *mf, smpl_t power)162 {163 return aubio_filterbank_set_power(mf->fb, power);164 }165 166 uint_t aubio_mfcc_get_power (aubio_mfcc_t *mf)167 {168 return aubio_filterbank_get_power(mf->fb);169 }170 171 uint_t aubio_mfcc_set_scale (aubio_mfcc_t *mf, smpl_t scale)172 {173 mf->scale = scale;174 return AUBIO_OK;175 }176 177 uint_t aubio_mfcc_get_scale (aubio_mfcc_t *mf)178 {179 return mf->scale;180 }181 182 uint_t aubio_mfcc_set_mel_coeffs (aubio_mfcc_t *mf, smpl_t freq_min,183 smpl_t freq_max)184 {185 return aubio_filterbank_set_mel_coeffs(mf->fb, mf->samplerate,186 freq_min, freq_max);187 }188 189 uint_t aubio_mfcc_set_mel_coeffs_htk (aubio_mfcc_t *mf, smpl_t freq_min,190 smpl_t freq_max)191 {192 return aubio_filterbank_set_mel_coeffs_htk(mf->fb, mf->samplerate,193 freq_min, freq_max);194 }195 196 uint_t aubio_mfcc_set_mel_coeffs_slaney (aubio_mfcc_t *mf)197 {198 return aubio_filterbank_set_mel_coeffs_slaney (mf->fb, mf->samplerate);199 } -
TabularUnified src/spectral/mfcc.h ¶
ra95b386 r75f9fff 74 74 void aubio_mfcc_do (aubio_mfcc_t * mf, const cvec_t * in, fvec_t * out); 75 75 76 /** set power parameter77 78 \param mf mfcc object, as returned by new_aubio_mfcc()79 \param power Raise norm of the input spectrum norm to this power before80 computing filterbank. Defaults to `1`.81 82 See aubio_filterbank_set_power().83 84 */85 uint_t aubio_mfcc_set_power (aubio_mfcc_t *mf, smpl_t power);86 87 /** get power parameter88 89 \param mf mfcc object, as returned by new_aubio_mfcc()90 \return current power parameter. Defaults to `1`.91 92 See aubio_filterbank_get_power().93 94 */95 uint_t aubio_mfcc_get_power (aubio_mfcc_t *mf);96 97 /** set scaling parameter98 99 \param mf mfcc object, as returned by new_aubio_mfcc()100 \param scale Scaling value to apply.101 102 Scales the output of the filterbank after taking its logarithm and before103 computing the DCT. Defaults to `1`.104 105 */106 uint_t aubio_mfcc_set_scale (aubio_mfcc_t *mf, smpl_t scale);107 108 /** get scaling parameter109 110 \param mf mfcc object, as returned by new_aubio_mfcc()111 \return current scaling parameter. Defaults to `1`.112 113 */114 uint_t aubio_mfcc_get_scale (aubio_mfcc_t *mf);115 116 /** Mel filterbank initialization117 118 \param mf mfcc object119 \param fmin start frequency, in Hz120 \param fmax end frequency, in Hz121 122 The filterbank will be initialized with bands linearly spaced in the mel123 scale, from `fmin` to `fmax`.124 125 See also126 --------127 128 aubio_filterbank_set_mel_coeffs()129 130 */131 uint_t aubio_mfcc_set_mel_coeffs (aubio_mfcc_t *mf,132 smpl_t fmin, smpl_t fmax);133 134 /** Mel filterbank initialization135 136 \param mf mfcc object137 \param fmin start frequency, in Hz138 \param fmax end frequency, in Hz139 140 The bank of filters will be initalized to to cover linearly spaced bands in141 the Htk mel scale, from `fmin` to `fmax`.142 143 See also144 --------145 146 aubio_filterbank_set_mel_coeffs_htk()147 148 */149 uint_t aubio_mfcc_set_mel_coeffs_htk (aubio_mfcc_t *mf,150 smpl_t fmin, smpl_t fmax);151 152 /** Mel filterbank initialization (Auditory Toolbox's parameters)153 154 \param mf mfcc object155 \param samplerate audio sampling rate, in Hz156 157 The filter coefficients are built to match exactly Malcolm Slaney's Auditory158 Toolbox implementation. The number of filters should be 40.159 160 This is the default filterbank when `mf` was created with `n_filters = 40`.161 162 See also163 --------164 165 aubio_filterbank_set_mel_coeffs_slaney()166 167 */168 uint_t aubio_mfcc_set_mel_coeffs_slaney (aubio_mfcc_t *mf);169 170 76 #ifdef __cplusplus 171 77 } -
TabularUnified tests/src/spectral/test-filterbank.c ¶
ra95b386 r75f9fff 11 11 // create filterbank object 12 12 aubio_filterbank_t *o = new_aubio_filterbank (n_filters, win_s); 13 14 smpl_t power = aubio_filterbank_get_power(o);15 smpl_t norm = aubio_filterbank_get_norm(o);16 if (aubio_filterbank_set_power(o, power)) {17 return 1;18 }19 if (aubio_filterbank_set_norm(o, norm)) {20 return 1;21 }22 13 23 14 // apply filterbank ten times
Note: See TracChangeset
for help on using the changeset viewer.