Mercurial > hg > vamp-aubio-plugins
changeset 69:ecaaac755073
plugins/Mfcc.{cpp,h}: added first Mfcc drafts
author | Paul Brossier <piem@piem.org> |
---|---|
date | Wed, 28 Jan 2015 13:26:09 +0100 |
parents | 43e22cc4992d |
children | c49a58161590 |
files | plugins/Mfcc.cpp plugins/Mfcc.h |
diffstat | 2 files changed, 329 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/Mfcc.cpp Wed Jan 28 13:26:09 2015 +0100 @@ -0,0 +1,248 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Vamp feature extraction plugins using Paul Brossier's Aubio library. + + Copyright (C) 2006-2015 Paul Brossier <piem@aubio.org> + + This file is part of vamp-aubio. + + vamp-aubio is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + vamp-aubio is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with aubio. If not, see <http://www.gnu.org/licenses/>. + +*/ + +#include <math.h> +#include "Mfcc.h" + +using std::string; +using std::vector; +using std::cerr; +using std::endl; + +Mfcc::Mfcc(float inputSampleRate) : + Plugin(inputSampleRate), + m_ibuf(0), // input fvec_t, set in initialise + m_pvoc(0), // aubio_pvoc_t, set in reset + m_ispec(0), // cvec_t, set in initialise + m_mfcc(0), // aubio_mfcc_t, set in reset + m_ovec(0), // output fvec_t, set in initialise + m_nfilters(40), // parameter + m_ncoeffs(13), // parameter + m_stepSize(0), // host parameter + m_blockSize(0) // host parameter +{ +} + +Mfcc::~Mfcc() +{ + if (m_mfcc) del_aubio_mfcc(m_mfcc); + if (m_pvoc) del_aubio_pvoc(m_pvoc); + if (m_ibuf) del_fvec(m_ibuf); + if (m_ispec) del_cvec(m_ispec); + if (m_ovec) del_fvec(m_ovec); +} + +string +Mfcc::getIdentifier() const +{ + return "aubiomfcc"; +} + +string +Mfcc::getName() const +{ + return "Aubio Mfcc Extractor"; +} + +string +Mfcc::getDescription() const +{ + return "Extract Mel-Frequency Cepstrum Coefficients"; +} + +string +Mfcc::getMaker() const +{ + return "Paul Brossier"; +} + +int +Mfcc::getPluginVersion() const +{ + return 3; +} + +string +Mfcc::getCopyright() const +{ + return "GPL"; +} + +bool +Mfcc::initialise(size_t channels, size_t stepSize, size_t blockSize) +{ + if (channels != 1) { + std::cerr << "Mfcc::initialise: channels must be 1" << std::endl; + return false; + } + + m_stepSize = stepSize; + m_blockSize = blockSize; + + m_ibuf = new_fvec(stepSize); + m_ispec = new_cvec(blockSize); + m_ovec = new_fvec(m_ncoeffs); + + reset(); + + return true; +} + +void +Mfcc::reset() +{ + if (m_pvoc) del_aubio_pvoc(m_pvoc); + if (m_mfcc) del_aubio_mfcc(m_mfcc); + + m_pvoc = new_aubio_pvoc(m_blockSize, m_stepSize); + + m_mfcc = new_aubio_mfcc(m_blockSize, m_nfilters, m_ncoeffs, + lrintf(m_inputSampleRate)); + +} + +size_t +Mfcc::getPreferredStepSize() const +{ + return 128; +} + +size_t +Mfcc::getPreferredBlockSize() const +{ + return 512; +} + +Mfcc::ParameterList +Mfcc::getParameterDescriptors() const +{ + ParameterList list; + + ParameterDescriptor desc; + desc.identifier = "nfilters"; + desc.name = "Number of filters"; + desc.description = "Size of filterbank used to compute MFCCs"; + desc.minValue = 10; + desc.maxValue = 100; + desc.defaultValue = 40; + desc.isQuantized = true; + desc.quantizeStep = 1; + list.push_back(desc); + + desc = ParameterDescriptor(); + desc.identifier = "ncoeffs"; + desc.name = "Number of coefficients"; + desc.description = "Number of output coefficients to compute"; + desc.minValue = 1; + desc.maxValue = 100; + desc.defaultValue = 13; + desc.isQuantized = true; + desc.quantizeStep = 1; + list.push_back(desc); + + return list; +} + +float +Mfcc::getParameter(std::string param) const +{ + if (param == "ncoeffs") { + return m_ncoeffs; + } else if (param == "nfilters") { + return m_nfilters; + } else { + return 0.0; + } +} + +void +Mfcc::setParameter(std::string param, float value) +{ + if (param == "nfilters") { + m_nfilters = lrintf(value); + } else if (param == "ncoeffs") { + m_ncoeffs = lrintf(value); + } +} + +Mfcc::OutputList +Mfcc::getOutputDescriptors() const +{ + OutputList list; + + OutputDescriptor d; + d.identifier = "mfcc"; + d.name = "Mfcc"; + d.description = "List of detected Mel-Frequency Cepstrum Coefficients"; + d.unit = ""; + d.hasFixedBinCount = true; + d.binCount = m_ncoeffs; + d.isQuantized = true; + d.sampleType = OutputDescriptor::FixedSampleRate; + d.sampleRate = m_inputSampleRate / m_stepSize; + list.push_back(d); + + return list; +} + +Mfcc::FeatureSet +Mfcc::process(const float *const *inputBuffers, + Vamp::RealTime timestamp) +{ + FeatureSet returnFeatures; + + if (m_stepSize == 0) { + std::cerr << "Mfcc::process: Mfcc plugin not initialised" << std::endl; + return returnFeatures; + } + if (m_ncoeffs == 0) { + std::cerr << "Mfcc::process: Mfcc plugin not initialised" << std::endl; + return returnFeatures; + } + + for (size_t i = 0; i < m_stepSize; ++i) { + fvec_set_sample(m_ibuf, inputBuffers[0][i], i); + } + + aubio_pvoc_do(m_pvoc, m_ibuf, m_ispec); + aubio_mfcc_do(m_mfcc, m_ispec, m_ovec); + + Feature feature; + //feature.hasTimestamp = false; + feature.timestamp = timestamp; + for (uint_t i = 0; i < m_ovec->length; i++) { + float value = m_ovec->data[i]; + feature.values.push_back(value); + } + + returnFeatures[0].push_back(feature); + return returnFeatures; +} + +Mfcc::FeatureSet +Mfcc::getRemainingFeatures() +{ + return FeatureSet(); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/Mfcc.h Wed Jan 28 13:26:09 2015 +0100 @@ -0,0 +1,81 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Vamp feature extraction plugins using Paul Brossier's Aubio library. + + Copyright (C) 2006-2015 Paul Brossier <piem@aubio.org> + + This file is part of vamp-aubio. + + vamp-aubio is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + vamp-aubio is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with aubio. If not, see <http://www.gnu.org/licenses/>. + + +*/ + +#ifndef _MFCC_PLUGIN_H_ +#define _MFCC_PLUGIN_H_ + +#include <vamp-sdk/Plugin.h> +#include <aubio/aubio.h> + +#include "Types.h" + +class Mfcc : public Vamp::Plugin +{ +public: + Mfcc(float inputSampleRate); + virtual ~Mfcc(); + + bool initialise(size_t channels, size_t stepSize, size_t blockSize); + void reset(); + + InputDomain getInputDomain() const { return TimeDomain; } + + std::string getIdentifier() const; + std::string getName() const; + std::string getDescription() const; + std::string getMaker() const; + int getPluginVersion() const; + std::string getCopyright() const; + + ParameterList getParameterDescriptors() const; + float getParameter(std::string) const; + void setParameter(std::string, float); + + size_t getPreferredStepSize() const; + size_t getPreferredBlockSize() const; + + OutputList getOutputDescriptors() const; + + FeatureSet process(const float *const *inputBuffers, + Vamp::RealTime timestamp); + + FeatureSet getRemainingFeatures(); + +protected: + fvec_t *m_ibuf; + aubio_pvoc_t *m_pvoc; + cvec_t *m_ispec; + aubio_mfcc_t *m_mfcc; + fvec_t *m_ovec; + + size_t m_nfilters; + size_t m_ncoeffs; + + size_t m_stepSize; + size_t m_blockSize; +}; + + +#endif