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