comparison plugins/SegmenterPlugin.cpp @ 38:9a2edd83775f

* Fixes and tidying in segmenter &c
author Chris Cannam <c.cannam@qmul.ac.uk>
date Thu, 10 Jan 2008 15:15:12 +0000
parents 9ce0db4770a2
children 7f499758cb23
comparison
equal deleted inserted replaced
37:9ce0db4770a2 38:9a2edd83775f
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
2
1 /* 3 /*
2 * SegmenterPlugin.cpp 4 * SegmenterPlugin.cpp
3 * soundbite
4 * 5 *
5 * Created by Mark Levy on 24/03/2006. 6 * Created by Mark Levy on 24/03/2006.
6 * Copyright 2006 Centre for Digital Music, Queen Mary, University of London. All rights reserved. 7 * Copyright 2006 Centre for Digital Music, Queen Mary, University of London.
7 * 8 * All rights reserved.
8 */ 9 */
9 10
10 #include <iostream> 11 #include <iostream>
11 #include <sstream> 12 #include <sstream>
12 13
18 using std::cerr; 19 using std::cerr;
19 using std::endl; 20 using std::endl;
20 using std::ostringstream; 21 using std::ostringstream;
21 22
22 SegmenterPlugin::SegmenterPlugin(float inputSampleRate) : 23 SegmenterPlugin::SegmenterPlugin(float inputSampleRate) :
23 Plugin(inputSampleRate), segmenter(0), nSegmentTypes(10), featureType(feature_types(1)) 24 Plugin(inputSampleRate),
25 segmenter(0),
26 nSegmentTypes(10),
27 featureType(feature_types(1))
24 { 28 {
25 29
26 } 30 }
27 31
28 SegmenterPlugin::~SegmenterPlugin() 32 SegmenterPlugin::~SegmenterPlugin()
29 { 33 {
30 if (segmenter) 34 delete segmenter;
31 delete segmenter;
32 } 35 }
33 36
34 string 37 string
35 SegmenterPlugin::getMaker() const 38 SegmenterPlugin::getMaker() const
36 { 39 {
66 } 69 }
67 70
68 void 71 void
69 SegmenterPlugin::reset() 72 SegmenterPlugin::reset()
70 { 73 {
74 //!!!
71 } 75 }
72 76
73 size_t 77 size_t
74 SegmenterPlugin::getPreferredStepSize() const 78 SegmenterPlugin::getPreferredStepSize() const
75 { 79 {
76 if (!segmenter) makeSegmenter(); 80 if (!segmenter) makeSegmenter();
77 return hopsize; 81 return hopsize;
78 } 82 }
79 83
80 size_t 84 size_t
81 SegmenterPlugin::getPreferredBlockSize() const 85 SegmenterPlugin::getPreferredBlockSize() const
82 { 86 {
83 if (!segmenter) makeSegmenter(); 87 if (!segmenter) makeSegmenter();
84 return windowsize; 88 return windowsize;
85 } 89 }
86 90
87 SegmenterPlugin::ParameterList SegmenterPlugin::getParameterDescriptors() const 91 SegmenterPlugin::ParameterList SegmenterPlugin::getParameterDescriptors() const
88 { 92 {
89 ParameterList list; 93 ParameterList list;
122 { 126 {
123 if (param == "nSegmentTypes") { 127 if (param == "nSegmentTypes") {
124 return nSegmentTypes; 128 return nSegmentTypes;
125 } 129 }
126 130
127 if (param == "featureType") { 131 if (param == "featureType") {
128 return featureType; 132 return featureType;
129 } 133 }
130 134
131 std::cerr << "WARNING: SegmenterPlugin::getParameter: unknown parameter \"" 135 std::cerr << "WARNING: SegmenterPlugin::getParameter: unknown parameter \""
132 << param << "\"" << std::endl; 136 << param << "\"" << std::endl;
133 return 0.0; 137 return 0.0;
134 } 138 }
135 139
136 void 140 void
137 SegmenterPlugin::setParameter(std::string param, float value) 141 SegmenterPlugin::setParameter(std::string param, float value)
138 { 142 {
139 if (param == "nSegmentTypes") { 143 if (param == "nSegmentTypes") {
144
140 nSegmentTypes = int(value); 145 nSegmentTypes = int(value);
141 } else 146
142 { 147 } else {
143 if (param == "featureType") { 148
144 if (featureType != feature_types(value)) // feature type changed, create a new segmenter 149 if (param == "featureType") {
145 { 150 if (featureType != feature_types(value)) // feature type changed, create a new segmenter
146 featureType = feature_types(value); 151 {
147 makeSegmenter(); 152 featureType = feature_types(value);
148 } 153 makeSegmenter();
149 } 154 }
150 else 155 }
151 { 156 else
152 std::cerr << "WARNING: SegmenterPlugin::setParameter: unknown parameter \"" 157 {
153 << param << "\"" << std::endl; 158 std::cerr << "WARNING: SegmenterPlugin::setParameter: unknown parameter \""
154 } 159 << param << "\"" << std::endl;
155 } 160 }
161 }
156 } 162 }
157 163
158 void 164 void
159 SegmenterPlugin::makeSegmenter() const 165 SegmenterPlugin::makeSegmenter() const
160 { 166 {
161 ClusterMeltSegmenterParams params = ClusterMeltSegmenterParams(); 167 ClusterMeltSegmenterParams params = ClusterMeltSegmenterParams();
162 params.featureType = (feature_types) featureType; 168 params.featureType = (feature_types) featureType;
163 if (params.featureType == FEATURE_TYPE_CONSTQ) 169
164 { 170 if (params.featureType == FEATURE_TYPE_CONSTQ)
165 params.ncomponents = 20; 171 {
166 params.neighbourhoodLimit = 30; 172 params.ncomponents = 20;
167 } 173 params.neighbourhoodLimit = 30;
168 if (params.featureType == FEATURE_TYPE_CHROMA) 174 }
169 { 175 if (params.featureType == FEATURE_TYPE_CHROMA)
170 params.hopSize = 0.1; 176 {
171 params.windowSize = 0.372; 177 params.hopSize = 0.1;
172 params.nbins = 12; 178 params.windowSize = 0.372;
173 params.histogramLength = 20; 179 params.nbins = 12;
174 params.neighbourhoodLimit = 40; 180 params.histogramLength = 20;
175 } 181 params.neighbourhoodLimit = 40;
176 delete segmenter; 182 }
177 segmenter = new ClusterMeltSegmenter(params); 183 delete segmenter;
178 segmenter->initialise(static_cast<int>(m_inputSampleRate)); 184
179 hopsize = segmenter->getHopsize(); 185 segmenter = new ClusterMeltSegmenter(params);
180 windowsize = segmenter->getWindowsize(); 186 segmenter->initialise(m_inputSampleRate);
187 hopsize = segmenter->getHopsize();
188 windowsize = segmenter->getWindowsize();
189
190 std::cerr << "segmenter window size: " << segmenter->getWindowsize()
191 << std::endl;
181 } 192 }
182 193
183 SegmenterPlugin::OutputList 194 SegmenterPlugin::OutputList
184 SegmenterPlugin::getOutputDescriptors() const 195 SegmenterPlugin::getOutputDescriptors() const
185 { 196 {
186 OutputList list; 197 OutputList list;
187 198
188 OutputDescriptor segmentation; 199 OutputDescriptor segmentation;
189 segmentation.identifier = "segmentation"; 200 segmentation.identifier = "segmentation";
190 segmentation.name = "Segmentation"; 201 segmentation.name = "Segmentation";
191 segmentation.description = "Segmentation"; 202 segmentation.description = "Segmentation";
192 segmentation.unit = "segment-type"; 203 segmentation.unit = "segment-type";
193 segmentation.hasFixedBinCount = true; 204 segmentation.hasFixedBinCount = true;
194 segmentation.binCount = 1; 205 segmentation.binCount = 1;
195 segmentation.minValue = 1; 206 segmentation.minValue = 1;
196 segmentation.maxValue = nSegmentTypes; 207 segmentation.maxValue = nSegmentTypes;
197 segmentation.isQuantized = true; 208 segmentation.isQuantized = true;
198 segmentation.quantizeStep = 1; 209 segmentation.quantizeStep = 1;
199 segmentation.sampleType = OutputDescriptor::VariableSampleRate; 210 segmentation.sampleType = OutputDescriptor::VariableSampleRate;
200 segmentation.sampleRate = m_inputSampleRate / getPreferredStepSize(); 211 segmentation.sampleRate = m_inputSampleRate / getPreferredStepSize();
201 212
202 list.push_back(segmentation); 213 list.push_back(segmentation);
203 214
204 return list; 215 return list;
205 } 216 }
206 217
207 SegmenterPlugin::FeatureSet 218 SegmenterPlugin::FeatureSet
208 SegmenterPlugin::process(const float *const *inputBuffers, Vamp::RealTime /* timestamp */) 219 SegmenterPlugin::process(const float *const *inputBuffers, Vamp::RealTime /* timestamp */)
209 { 220 {
210 // convert float* to double* 221 // convert float* to double*
211 double *tempBuffer = new double[windowsize]; 222 double *tempBuffer = new double[windowsize];
212 for (size_t i = 0; i < windowsize; ++i) { 223 for (size_t i = 0; i < windowsize; ++i) {
213 tempBuffer[i] = inputBuffers[0][i]; 224 tempBuffer[i] = inputBuffers[0][i];
214 } 225 }
215 226
216 segmenter->extractFeatures(tempBuffer, windowsize); 227 segmenter->extractFeatures(tempBuffer, segmenter->getWindowsize());
217 228
218 delete [] tempBuffer; 229 delete [] tempBuffer;
219 230
220 return FeatureSet(); 231 return FeatureSet();
221 } 232 }
222 233
223 SegmenterPlugin::FeatureSet 234 SegmenterPlugin::FeatureSet
224 SegmenterPlugin::getRemainingFeatures() 235 SegmenterPlugin::getRemainingFeatures()
225 { 236 {
226 segmenter->segment(nSegmentTypes); 237 segmenter->segment(nSegmentTypes);
227 Segmentation segm = segmenter->getSegmentation(); 238 Segmentation segm = segmenter->getSegmentation();
228 239
229 FeatureSet returnFeatures; 240 FeatureSet returnFeatures;
230 241
231 for (int i = 0; i < segm.segments.size(); ++i) { 242 for (int i = 0; i < segm.segments.size(); ++i) {
232 243
233 Segment s = segm.segments[i]; 244 Segment s = segm.segments[i];
234 245
235 Feature feature; 246 Feature feature;
236 feature.hasTimestamp = true; 247 feature.hasTimestamp = true;
237 feature.timestamp = Vamp::RealTime::frame2RealTime(s.start, static_cast<unsigned int>(m_inputSampleRate)); 248 feature.timestamp = Vamp::RealTime::frame2RealTime(s.start, static_cast<unsigned int>(m_inputSampleRate));
238 249
239 vector<float> floatval; 250 vector<float> floatval;
240 floatval.push_back(s.type); 251 floatval.push_back(s.type);
241 feature.values = floatval; 252 feature.values = floatval;
242 253
243 ostringstream oss; 254 ostringstream oss;
244 oss << s.type; 255 oss << s.type;
245 feature.label = oss.str(); 256 feature.label = oss.str();
246 257
247 returnFeatures[0].push_back(feature); 258 returnFeatures[0].push_back(feature);
248 } 259 }
249 260
250 return returnFeatures; 261 return returnFeatures;
251 } 262 }