comparison dsp/segmentation/SavedFeatureSegmenter.cpp @ 243:dc30e3864ceb

* merge in segmentation code from soundbite plugin/library repository
author Chris Cannam <c.cannam@qmul.ac.uk>
date Wed, 09 Jan 2008 10:46:25 +0000
parents
children
comparison
equal deleted inserted replaced
242:6060110dc3c6 243:dc30e3864ceb
1 /*
2 * SavedFeatureSegmenter.cpp
3 * soundbite
4 *
5 * Created by Mark Levy on 23/03/2006.
6 * Copyright 2006 Centre for Digital Music, Queen Mary, University of London. All rights reserved.
7 *
8 */
9
10 #include <cfloat>
11 #include <cmath>
12
13 #include "SavedFeatureSegmenter.h"
14 #include "cluster_segmenter.h"
15 #include "segment.h"
16
17 SavedFeatureSegmenter::SavedFeatureSegmenter(SavedFeatureSegmenterParams params) : windowSize(params.windowSize),
18 hopSize(params.hopSize),
19 nHMMStates(params.nHMMStates),
20 nclusters(params.nclusters),
21 histogramLength(params.histogramLength),
22 neighbourhoodLimit(params.neighbourhoodLimit)
23 {
24 }
25
26 void SavedFeatureSegmenter::initialise(int fs)
27 {
28 samplerate = fs;
29 }
30
31 SavedFeatureSegmenter::~SavedFeatureSegmenter()
32 {
33 }
34
35 void SavedFeatureSegmenter::segment(int m)
36 {
37 nclusters = m;
38 segment();
39 }
40
41 void SavedFeatureSegmenter::setFeatures(const vector<vector<double> >& f)
42 {
43 features = f;
44 }
45
46 void SavedFeatureSegmenter::segment()
47 {
48 // for now copy the features to a native array and use the existing C segmenter...
49 double** arrFeatures = new double*[features.size()];
50 for (int i = 0; i < features.size(); i++)
51 {
52 arrFeatures[i] = new double[features[0].size()]; // allow space for the normalised envelope
53 for (int j = 0; j < features[0].size(); j++)
54 arrFeatures[i][j] = features[i][j];
55 }
56
57 q = new int[features.size()];
58
59 cluster_segment(q, arrFeatures, features.size(), features[0].size(), nHMMStates, histogramLength,
60 nclusters, neighbourhoodLimit);
61 // convert the cluster assignment sequence to a segmentation
62 makeSegmentation(q, features.size());
63
64 // de-allocate arrays
65 delete [] q;
66 for (int i = 0; i < features.size(); i++)
67 delete [] arrFeatures[i];
68 delete [] arrFeatures;
69
70 // clear the features
71 clear();
72 }
73
74 void SavedFeatureSegmenter::makeSegmentation(int* q, int len)
75 {
76 segmentation.segments.clear();
77 segmentation.nsegtypes = nclusters;
78 segmentation.samplerate = samplerate;
79
80 Segment segment;
81 segment.start = 0;
82 segment.type = q[0];
83
84 for (int i = 1; i < len; i++)
85 {
86 if (q[i] != q[i-1])
87 {
88 segment.end = i * getHopsize();
89 segmentation.segments.push_back(segment);
90 segment.type = q[i];
91 segment.start = segment.end;
92 }
93 }
94 segment.end = len * getHopsize();
95 segmentation.segments.push_back(segment);
96 }
97