piem@69: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ piem@69: piem@69: /* piem@69: Vamp feature extraction plugins using Paul Brossier's Aubio library. piem@69: piem@69: Copyright (C) 2006-2015 Paul Brossier piem@69: piem@110: This file is part of vamp-aubio-plugins. piem@69: piem@69: vamp-aubio is free software: you can redistribute it and/or modify piem@69: it under the terms of the GNU General Public License as published by piem@69: the Free Software Foundation, either version 3 of the License, or piem@69: (at your option) any later version. piem@69: piem@69: vamp-aubio is distributed in the hope that it will be useful, piem@69: but WITHOUT ANY WARRANTY; without even the implied warranty of piem@69: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the piem@69: GNU General Public License for more details. piem@69: piem@69: You should have received a copy of the GNU General Public License piem@69: along with aubio. If not, see . piem@69: piem@69: */ piem@69: piem@69: #include piem@69: #include "Mfcc.h" piem@69: piem@69: using std::string; piem@69: using std::vector; piem@69: using std::cerr; piem@69: using std::endl; piem@69: piem@69: Mfcc::Mfcc(float inputSampleRate) : piem@69: Plugin(inputSampleRate), piem@69: m_ibuf(0), // input fvec_t, set in initialise piem@69: m_pvoc(0), // aubio_pvoc_t, set in reset piem@69: m_ispec(0), // cvec_t, set in initialise piem@69: m_mfcc(0), // aubio_mfcc_t, set in reset piem@69: m_ovec(0), // output fvec_t, set in initialise piem@69: m_nfilters(40), // parameter piem@69: m_ncoeffs(13), // parameter piem@69: m_stepSize(0), // host parameter piem@69: m_blockSize(0) // host parameter piem@69: { piem@69: } piem@69: piem@69: Mfcc::~Mfcc() piem@69: { piem@69: if (m_mfcc) del_aubio_mfcc(m_mfcc); piem@69: if (m_pvoc) del_aubio_pvoc(m_pvoc); piem@69: if (m_ibuf) del_fvec(m_ibuf); piem@69: if (m_ispec) del_cvec(m_ispec); piem@69: if (m_ovec) del_fvec(m_ovec); piem@69: } piem@69: piem@69: string piem@69: Mfcc::getIdentifier() const piem@69: { piem@69: return "aubiomfcc"; piem@69: } piem@69: piem@69: string piem@69: Mfcc::getName() const piem@69: { piem@69: return "Aubio Mfcc Extractor"; piem@69: } piem@69: piem@69: string piem@69: Mfcc::getDescription() const piem@69: { piem@69: return "Extract Mel-Frequency Cepstrum Coefficients"; piem@69: } piem@69: piem@69: string piem@69: Mfcc::getMaker() const piem@69: { piem@69: return "Paul Brossier"; piem@69: } piem@69: piem@69: int piem@69: Mfcc::getPluginVersion() const piem@69: { piem@69: return 3; piem@69: } piem@69: piem@69: string piem@69: Mfcc::getCopyright() const piem@69: { piem@69: return "GPL"; piem@69: } piem@69: piem@69: bool piem@69: Mfcc::initialise(size_t channels, size_t stepSize, size_t blockSize) piem@69: { piem@69: if (channels != 1) { piem@69: std::cerr << "Mfcc::initialise: channels must be 1" << std::endl; piem@69: return false; piem@69: } piem@69: piem@69: m_stepSize = stepSize; piem@69: m_blockSize = blockSize; piem@69: piem@69: m_ibuf = new_fvec(stepSize); piem@69: m_ispec = new_cvec(blockSize); piem@69: m_ovec = new_fvec(m_ncoeffs); piem@69: piem@69: reset(); piem@69: piem@69: return true; piem@69: } piem@69: piem@69: void piem@69: Mfcc::reset() piem@69: { piem@69: if (m_pvoc) del_aubio_pvoc(m_pvoc); piem@69: if (m_mfcc) del_aubio_mfcc(m_mfcc); piem@69: piem@69: m_pvoc = new_aubio_pvoc(m_blockSize, m_stepSize); piem@69: piem@69: m_mfcc = new_aubio_mfcc(m_blockSize, m_nfilters, m_ncoeffs, piem@69: lrintf(m_inputSampleRate)); piem@69: piem@69: } piem@69: piem@69: size_t piem@69: Mfcc::getPreferredStepSize() const piem@69: { piem@69: return 128; piem@69: } piem@69: piem@69: size_t piem@69: Mfcc::getPreferredBlockSize() const piem@69: { piem@69: return 512; piem@69: } piem@69: piem@69: Mfcc::ParameterList piem@69: Mfcc::getParameterDescriptors() const piem@69: { piem@69: ParameterList list; piem@69: piem@69: ParameterDescriptor desc; piem@69: desc.identifier = "nfilters"; piem@69: desc.name = "Number of filters"; piem@96: desc.description = "Size of mel filterbank used to compute MFCCs (fixed to 40 for now)"; piem@96: desc.minValue = 40; piem@96: desc.maxValue = 40; piem@69: desc.defaultValue = 40; piem@69: desc.isQuantized = true; piem@69: desc.quantizeStep = 1; piem@69: list.push_back(desc); piem@69: piem@69: desc = ParameterDescriptor(); piem@69: desc.identifier = "ncoeffs"; piem@69: desc.name = "Number of coefficients"; piem@69: desc.description = "Number of output coefficients to compute"; piem@69: desc.minValue = 1; piem@69: desc.maxValue = 100; piem@69: desc.defaultValue = 13; piem@69: desc.isQuantized = true; piem@69: desc.quantizeStep = 1; piem@69: list.push_back(desc); piem@69: piem@69: return list; piem@69: } piem@69: piem@69: float piem@69: Mfcc::getParameter(std::string param) const piem@69: { piem@69: if (param == "ncoeffs") { piem@69: return m_ncoeffs; piem@69: } else if (param == "nfilters") { piem@69: return m_nfilters; piem@69: } else { piem@69: return 0.0; piem@69: } piem@69: } piem@69: piem@69: void piem@69: Mfcc::setParameter(std::string param, float value) piem@69: { piem@69: if (param == "nfilters") { piem@69: m_nfilters = lrintf(value); piem@69: } else if (param == "ncoeffs") { piem@69: m_ncoeffs = lrintf(value); piem@69: } piem@69: } piem@69: piem@69: Mfcc::OutputList piem@69: Mfcc::getOutputDescriptors() const piem@69: { piem@69: OutputList list; piem@69: piem@69: OutputDescriptor d; piem@69: d.identifier = "mfcc"; piem@79: d.name = "Mel-Frequency Cepstrum Coefficients"; piem@69: d.description = "List of detected Mel-Frequency Cepstrum Coefficients"; piem@69: d.unit = ""; piem@69: d.hasFixedBinCount = true; piem@69: d.binCount = m_ncoeffs; piem@69: d.isQuantized = true; piem@143: d.quantizeStep = 1.0; piem@143: d.sampleType = OutputDescriptor::OneSamplePerStep; piem@69: list.push_back(d); piem@69: piem@69: return list; piem@69: } piem@69: piem@69: Mfcc::FeatureSet piem@69: Mfcc::process(const float *const *inputBuffers, piem@134: UNUSED Vamp::RealTime timestamp) piem@69: { piem@69: FeatureSet returnFeatures; piem@69: piem@69: if (m_stepSize == 0) { piem@69: std::cerr << "Mfcc::process: Mfcc plugin not initialised" << std::endl; piem@69: return returnFeatures; piem@69: } piem@69: if (m_ncoeffs == 0) { piem@69: std::cerr << "Mfcc::process: Mfcc plugin not initialised" << std::endl; piem@69: return returnFeatures; piem@69: } piem@69: piem@69: for (size_t i = 0; i < m_stepSize; ++i) { piem@69: fvec_set_sample(m_ibuf, inputBuffers[0][i], i); piem@69: } piem@69: piem@69: aubio_pvoc_do(m_pvoc, m_ibuf, m_ispec); piem@69: aubio_mfcc_do(m_mfcc, m_ispec, m_ovec); piem@69: piem@69: Feature feature; piem@69: for (uint_t i = 0; i < m_ovec->length; i++) { piem@69: float value = m_ovec->data[i]; piem@69: feature.values.push_back(value); piem@69: } piem@69: piem@69: returnFeatures[0].push_back(feature); piem@69: return returnFeatures; piem@69: } piem@69: piem@69: Mfcc::FeatureSet piem@69: Mfcc::getRemainingFeatures() piem@69: { piem@69: return FeatureSet(); piem@69: } piem@69: