comparison plugins/SegmenterPlugin.cpp @ 150:7c7881bbb6ca

Update segmenter to add durations to segments and map the segment types onto a dense series starting at 1 with alphabetical labels. Update version number
author Chris Cannam <c.cannam@qmul.ac.uk>
date Mon, 02 Sep 2013 12:58:14 +0100
parents dcf5800f0f00
children f96ea0e4b475
comparison
equal deleted inserted replaced
149:c45f74550f38 150:7c7881bbb6ca
62 } 62 }
63 63
64 int 64 int
65 SegmenterPlugin::getPluginVersion() const 65 SegmenterPlugin::getPluginVersion() const
66 { 66 {
67 return 2; 67 return 3;
68 } 68 }
69 69
70 string 70 string
71 SegmenterPlugin::getCopyright() const 71 SegmenterPlugin::getCopyright() const
72 { 72 {
73 return "Plugin by Mark Levy. Copyright (c) 2006-2009 QMUL - All Rights Reserved"; 73 return "Plugin by Mark Levy. Copyright (c) 2006-2013 QMUL - All Rights Reserved";
74 } 74 }
75 75
76 bool 76 bool
77 SegmenterPlugin::initialise(size_t channels, size_t stepSize, size_t blockSize) 77 SegmenterPlugin::initialise(size_t channels, size_t stepSize, size_t blockSize)
78 { 78 {
268 segmentation.maxValue = nSegmentTypes; 268 segmentation.maxValue = nSegmentTypes;
269 segmentation.isQuantized = true; 269 segmentation.isQuantized = true;
270 segmentation.quantizeStep = 1; 270 segmentation.quantizeStep = 1;
271 segmentation.sampleType = OutputDescriptor::VariableSampleRate; 271 segmentation.sampleType = OutputDescriptor::VariableSampleRate;
272 segmentation.sampleRate = m_inputSampleRate / getPreferredStepSize(); 272 segmentation.sampleRate = m_inputSampleRate / getPreferredStepSize();
273 segmentation.hasDuration = true;
273 274
274 list.push_back(segmentation); 275 list.push_back(segmentation);
275 276
276 return list; 277 return list;
277 } 278 }
278 279
279 SegmenterPlugin::FeatureSet 280 SegmenterPlugin::FeatureSet
280 SegmenterPlugin::process(const float *const *inputBuffers, Vamp::RealTime /* timestamp */) 281 SegmenterPlugin::process(const float *const *inputBuffers, Vamp::RealTime timestamp)
281 { 282 {
282 // convert float* to double* 283 // convert float* to double*
283 double *tempBuffer = new double[windowsize]; 284 double *tempBuffer = new double[windowsize];
284 for (size_t i = 0; i < windowsize; ++i) { 285 for (size_t i = 0; i < windowsize; ++i) {
285 tempBuffer[i] = inputBuffers[0][i]; 286 tempBuffer[i] = inputBuffers[0][i];
286 } 287 }
287 288
288 segmenter->extractFeatures(tempBuffer, segmenter->getWindowsize()); 289 segmenter->extractFeatures(tempBuffer, segmenter->getWindowsize());
289 290
290 delete [] tempBuffer; 291 delete [] tempBuffer;
292
293 m_endTime = timestamp;
291 294
292 return FeatureSet(); 295 return FeatureSet();
293 } 296 }
294 297
295 SegmenterPlugin::FeatureSet 298 SegmenterPlugin::FeatureSet
297 { 300 {
298 segmenter->segment(nSegmentTypes); 301 segmenter->segment(nSegmentTypes);
299 Segmentation segm = segmenter->getSegmentation(); 302 Segmentation segm = segmenter->getSegmentation();
300 303
301 FeatureSet returnFeatures; 304 FeatureSet returnFeatures;
302 305
306 // Map the segment types onto a dense series starting at 1
307
308 std::map<int, int> typeMap;
309 int nextType = 1;
310
311 for (int i = 0; i < segm.segments.size(); ++i) {
312 Segment s = segm.segments[i];
313 if (typeMap.find(s.type) == typeMap.end()) {
314 typeMap[s.type] = nextType;
315 ++nextType;
316 }
317 }
318
303 for (int i = 0; i < segm.segments.size(); ++i) { 319 for (int i = 0; i < segm.segments.size(); ++i) {
304 320
305 Segment s = segm.segments[i]; 321 Segment s = segm.segments[i];
306 322
307 Feature feature; 323 Feature feature;
308 feature.hasTimestamp = true; 324 feature.hasTimestamp = true;
309 feature.timestamp = Vamp::RealTime::frame2RealTime(s.start, static_cast<unsigned int>(m_inputSampleRate)); 325 feature.timestamp = Vamp::RealTime::frame2RealTime
326 (s.start, (int)m_inputSampleRate);
327 feature.hasDuration = true;
328
329 if (i + 1 < segm.segments.size()) {
330 feature.duration = Vamp::RealTime::frame2RealTime
331 (segm.segments[i+1].start - s.start, (int)m_inputSampleRate);
332 } else {
333 feature.duration = m_endTime - feature.timestamp;
334 }
335
336 int type = typeMap[s.type];
310 337
311 vector<float> floatval; 338 vector<float> floatval;
312 floatval.push_back(s.type); 339 floatval.push_back(type);
313 feature.values = floatval; 340 feature.values = floatval;
314 341
315 ostringstream oss; 342 ostringstream oss;
316 oss << s.type; 343 oss << char('A' + type - 1);
317 feature.label = oss.str(); 344 feature.label = oss.str();
318 345
319 returnFeatures[0].push_back(feature); 346 returnFeatures[0].push_back(feature);
320 } 347 }
321 348