Mercurial > hg > qm-dsp
comparison dsp/segmentation/SavedFeatureSegmenter.cpp @ 18:8e90a56b4b5f
* merge in segmentation code from soundbite plugin/library repository
author | cannam |
---|---|
date | Wed, 09 Jan 2008 10:46:25 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
17:a120ac7b26b2 | 18:8e90a56b4b5f |
---|---|
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 |