annotate YinVampFreqConstrained.cpp @ 64:e291f3657872 tony tony_v0.5

Didn't intend to commit the build in debug mode
author Chris Cannam
date Wed, 02 Apr 2014 10:37:49 +0100
parents 60eb8771d340
children
rev   line source
matthiasm@49 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
matthiasm@49 2
matthiasm@49 3 /*
matthiasm@49 4 pYIN - A fundamental frequency estimator for monophonic audio
matthiasm@49 5 Centre for Digital Music, Queen Mary, University of London.
matthiasm@49 6
matthiasm@49 7 This program is free software; you can redistribute it and/or
matthiasm@49 8 modify it under the terms of the GNU General Public License as
matthiasm@49 9 published by the Free Software Foundation; either version 2 of the
matthiasm@49 10 License, or (at your option) any later version. See the file
matthiasm@49 11 COPYING included with this distribution for more information.
matthiasm@49 12 */
matthiasm@49 13
matthiasm@49 14 #include "YinVampFreqConstrained.h"
matthiasm@49 15 #include "MonoNote.h"
matthiasm@49 16
matthiasm@49 17 #include "vamp-sdk/FFT.h"
matthiasm@49 18
matthiasm@49 19 #include <vector>
matthiasm@49 20 #include <algorithm>
matthiasm@49 21
matthiasm@49 22 #include <cstdio>
matthiasm@49 23 #include <cmath>
matthiasm@49 24 #include <complex>
matthiasm@49 25
matthiasm@49 26 using std::string;
matthiasm@49 27 using std::vector;
matthiasm@49 28 using Vamp::RealTime;
matthiasm@49 29
matthiasm@49 30
matthiasm@49 31 YinVampFreqConstrained::YinVampFreqConstrained(float inputSampleRate) :
matthiasm@49 32 Plugin(inputSampleRate),
matthiasm@49 33 m_channels(0),
matthiasm@49 34 m_stepSize(256),
matthiasm@49 35 m_blockSize(2048),
matthiasm@49 36 m_fmin(40),
matthiasm@49 37 m_fmax(1000),
matthiasm@49 38 m_yin(2048, inputSampleRate, 0.0),
matthiasm@49 39 m_yinFmin(100.f),
matthiasm@49 40 m_yinFmax(400.f)
matthiasm@49 41 {
matthiasm@49 42 }
matthiasm@49 43
matthiasm@49 44 YinVampFreqConstrained::~YinVampFreqConstrained()
matthiasm@49 45 {
matthiasm@49 46 }
matthiasm@49 47
matthiasm@49 48 string
matthiasm@49 49 YinVampFreqConstrained::getIdentifier() const
matthiasm@49 50 {
matthiasm@49 51 return "yinfc";
matthiasm@49 52 }
matthiasm@49 53
matthiasm@49 54 string
matthiasm@49 55 YinVampFreqConstrained::getName() const
matthiasm@49 56 {
matthiasm@49 57 return "Frequency-constrained Yin";
matthiasm@49 58 }
matthiasm@49 59
matthiasm@49 60 string
matthiasm@49 61 YinVampFreqConstrained::getDescription() const
matthiasm@49 62 {
matthiasm@49 63 return "A vamp implementation of the Yin algorithm for monophonic frequency estimation with frequency constraints.";
matthiasm@49 64 }
matthiasm@49 65
matthiasm@49 66 string
matthiasm@49 67 YinVampFreqConstrained::getMaker() const
matthiasm@49 68 {
matthiasm@49 69 return "Matthias Mauch";
matthiasm@49 70 }
matthiasm@49 71
matthiasm@49 72 int
matthiasm@49 73 YinVampFreqConstrained::getPluginVersion() const
matthiasm@49 74 {
matthiasm@49 75 // Increment this each time you release a version that behaves
matthiasm@49 76 // differently from the previous one
matthiasm@49 77 return 1;
matthiasm@49 78 }
matthiasm@49 79
matthiasm@49 80 string
matthiasm@49 81 YinVampFreqConstrained::getCopyright() const
matthiasm@49 82 {
matthiasm@49 83 return "GPL";
matthiasm@49 84 }
matthiasm@49 85
matthiasm@49 86 YinVampFreqConstrained::InputDomain
matthiasm@49 87 YinVampFreqConstrained::getInputDomain() const
matthiasm@49 88 {
matthiasm@49 89 return TimeDomain;
matthiasm@49 90 }
matthiasm@49 91
matthiasm@49 92 size_t
matthiasm@49 93 YinVampFreqConstrained::getPreferredBlockSize() const
matthiasm@49 94 {
matthiasm@49 95 return 2048;
matthiasm@49 96 }
matthiasm@49 97
matthiasm@49 98 size_t
matthiasm@49 99 YinVampFreqConstrained::getPreferredStepSize() const
matthiasm@49 100 {
matthiasm@49 101 return 256;
matthiasm@49 102 }
matthiasm@49 103
matthiasm@49 104 size_t
matthiasm@49 105 YinVampFreqConstrained::getMinChannelCount() const
matthiasm@49 106 {
matthiasm@49 107 return 1;
matthiasm@49 108 }
matthiasm@49 109
matthiasm@49 110 size_t
matthiasm@49 111 YinVampFreqConstrained::getMaxChannelCount() const
matthiasm@49 112 {
matthiasm@49 113 return 1;
matthiasm@49 114 }
matthiasm@49 115
matthiasm@49 116 YinVampFreqConstrained::ParameterList
matthiasm@49 117 YinVampFreqConstrained::getParameterDescriptors() const
matthiasm@49 118 {
matthiasm@49 119 ParameterList list;
matthiasm@49 120
matthiasm@49 121 ParameterDescriptor d;
matthiasm@49 122
matthiasm@49 123 d.identifier = "minfreq";
matthiasm@49 124 d.name = "Minimum frequency";
matthiasm@49 125 d.description = "Minimum frequency used when searching for difference function minimum.";
matthiasm@49 126 d.unit = "Hz";
matthiasm@49 127 d.minValue = 40.f;
matthiasm@49 128 d.maxValue = 1000.0f;
matthiasm@49 129 d.defaultValue = 100.f;
matthiasm@49 130 d.isQuantized = false;
matthiasm@49 131 d.valueNames.clear();
matthiasm@49 132 list.push_back(d);
matthiasm@49 133
matthiasm@49 134 d.identifier = "maxfreq";
matthiasm@49 135 d.name = "Maximum frequency";
matthiasm@49 136 d.description = "Maximum frequency used when searching for difference function minimum.";
matthiasm@49 137 d.unit = "Hz";
matthiasm@49 138 d.minValue = 40.f;
matthiasm@49 139 d.maxValue = 1000.0f;
matthiasm@49 140 d.defaultValue = 400.f;
matthiasm@49 141 d.isQuantized = false;
matthiasm@49 142 d.valueNames.clear();
matthiasm@49 143 list.push_back(d);
matthiasm@49 144
matthiasm@49 145 return list;
matthiasm@49 146 }
matthiasm@49 147
matthiasm@49 148 float
matthiasm@49 149 YinVampFreqConstrained::getParameter(string identifier) const
matthiasm@49 150 {
matthiasm@49 151 if (identifier == "minfreq") {
matthiasm@49 152 return m_yinFmin;
matthiasm@49 153 }
matthiasm@49 154 if (identifier == "maxfreq") {
matthiasm@49 155 return m_yinFmax;
matthiasm@49 156 }
matthiasm@49 157 return 0.f;
matthiasm@49 158 }
matthiasm@49 159
matthiasm@49 160 void
matthiasm@49 161 YinVampFreqConstrained::setParameter(string identifier, float value)
matthiasm@49 162 {
matthiasm@49 163 if (identifier == "minfreq")
matthiasm@49 164 {
matthiasm@49 165 m_yinFmin = value;
matthiasm@49 166 }
matthiasm@49 167 if (identifier == "maxfreq")
matthiasm@49 168 {
matthiasm@49 169 m_yinFmax = value;
matthiasm@49 170 }
matthiasm@49 171 }
matthiasm@49 172
matthiasm@49 173 YinVampFreqConstrained::ProgramList
matthiasm@49 174 YinVampFreqConstrained::getPrograms() const
matthiasm@49 175 {
matthiasm@49 176 ProgramList list;
matthiasm@49 177 return list;
matthiasm@49 178 }
matthiasm@49 179
matthiasm@49 180 string
matthiasm@49 181 YinVampFreqConstrained::getCurrentProgram() const
matthiasm@49 182 {
matthiasm@49 183 return ""; // no programs
matthiasm@49 184 }
matthiasm@49 185
matthiasm@49 186 void
matthiasm@49 187 YinVampFreqConstrained::selectProgram(string name)
matthiasm@49 188 {
matthiasm@49 189 }
matthiasm@49 190
matthiasm@49 191 YinVampFreqConstrained::OutputList
matthiasm@49 192 YinVampFreqConstrained::getOutputDescriptors() const
matthiasm@49 193 {
matthiasm@49 194 OutputList outputs;
matthiasm@49 195
matthiasm@49 196 OutputDescriptor d;
matthiasm@49 197
matthiasm@49 198 int outputNumber = 0;
matthiasm@49 199
matthiasm@49 200 d.identifier = "f0";
matthiasm@49 201 d.name = "Estimated f0";
matthiasm@49 202 d.description = "Estimated fundamental frequency";
matthiasm@49 203 d.unit = "Hz";
matthiasm@49 204 d.hasFixedBinCount = true;
matthiasm@49 205 d.binCount = 1;
matthiasm@49 206 d.hasKnownExtents = true;
matthiasm@49 207 d.minValue = m_fmin;
matthiasm@49 208 d.maxValue = 500;
matthiasm@49 209 d.isQuantized = false;
matthiasm@49 210 d.sampleType = OutputDescriptor::FixedSampleRate;
matthiasm@49 211 d.sampleRate = (m_inputSampleRate / m_stepSize);
matthiasm@49 212 d.hasDuration = false;
matthiasm@49 213 outputs.push_back(d);
matthiasm@49 214
matthiasm@49 215 return outputs;
matthiasm@49 216 }
matthiasm@49 217
matthiasm@49 218 bool
matthiasm@49 219 YinVampFreqConstrained::initialise(size_t channels, size_t stepSize, size_t blockSize)
matthiasm@49 220 {
matthiasm@49 221 if (channels < getMinChannelCount() ||
matthiasm@49 222 channels > getMaxChannelCount()) return false;
matthiasm@49 223
matthiasm@49 224 /*
matthiasm@49 225 std::cerr << "YinVampFreqConstrained::initialise: channels = " << channels
matthiasm@49 226 << ", stepSize = " << stepSize << ", blockSize = " << blockSize
matthiasm@49 227 << std::endl;
matthiasm@49 228 */
matthiasm@49 229 m_channels = channels;
matthiasm@49 230 m_stepSize = stepSize;
matthiasm@49 231 m_blockSize = blockSize;
matthiasm@49 232
matthiasm@49 233 reset();
matthiasm@49 234
matthiasm@49 235 return true;
matthiasm@49 236 }
matthiasm@49 237
matthiasm@49 238 void
matthiasm@49 239 YinVampFreqConstrained::reset()
matthiasm@49 240 {
matthiasm@49 241 m_yin.setFrameSize(m_blockSize);
matthiasm@49 242 }
matthiasm@49 243
matthiasm@49 244 YinVampFreqConstrained::FeatureSet
matthiasm@49 245 YinVampFreqConstrained::process(const float *const *inputBuffers, RealTime timestamp)
matthiasm@49 246 {
matthiasm@60 247 timestamp = timestamp + Vamp::RealTime::frame2RealTime(m_blockSize/2, lrintf(m_inputSampleRate));
matthiasm@49 248 FeatureSet fs;
matthiasm@49 249
matthiasm@49 250 double *dInputBuffers = new double[m_blockSize];
matthiasm@49 251 for (size_t i = 0; i < m_blockSize; ++i) dInputBuffers[i] = inputBuffers[0][i];
matthiasm@49 252
matthiasm@49 253 // std::cerr << "f0 in YinVampFreqConstrained: " << yo.f0 << std::endl;
matthiasm@49 254 Feature f;
matthiasm@49 255 f.hasTimestamp = true;
matthiasm@49 256 f.timestamp = timestamp;
matthiasm@49 257 f.values.push_back(m_yin.constrainedMinPick(dInputBuffers, m_yinFmin, m_yinFmax));
matthiasm@49 258 fs[0].push_back(f);
matthiasm@49 259
matthiasm@49 260 delete [] dInputBuffers;
matthiasm@49 261 return fs;
matthiasm@49 262 }
matthiasm@49 263
matthiasm@49 264 YinVampFreqConstrained::FeatureSet
matthiasm@49 265 YinVampFreqConstrained::getRemainingFeatures()
matthiasm@49 266 {
matthiasm@49 267 FeatureSet fs;
matthiasm@49 268 return fs;
matthiasm@49 269 }