c@243: /* c@243: * SavedFeatureSegmenter.cpp c@243: * soundbite c@243: * c@243: * Created by Mark Levy on 23/03/2006. c@243: * Copyright 2006 Centre for Digital Music, Queen Mary, University of London. All rights reserved. c@243: * c@243: */ c@243: c@243: #include c@243: #include c@243: c@243: #include "SavedFeatureSegmenter.h" c@243: #include "cluster_segmenter.h" c@243: #include "segment.h" c@243: c@243: SavedFeatureSegmenter::SavedFeatureSegmenter(SavedFeatureSegmenterParams params) : windowSize(params.windowSize), c@243: hopSize(params.hopSize), c@243: nHMMStates(params.nHMMStates), c@243: nclusters(params.nclusters), c@243: histogramLength(params.histogramLength), c@243: neighbourhoodLimit(params.neighbourhoodLimit) c@243: { c@243: } c@243: c@243: void SavedFeatureSegmenter::initialise(int fs) c@243: { c@243: samplerate = fs; c@243: } c@243: c@243: SavedFeatureSegmenter::~SavedFeatureSegmenter() c@243: { c@243: } c@243: c@243: void SavedFeatureSegmenter::segment(int m) c@243: { c@243: nclusters = m; c@243: segment(); c@243: } c@243: c@243: void SavedFeatureSegmenter::setFeatures(const vector >& f) c@243: { c@243: features = f; c@243: } c@243: c@243: void SavedFeatureSegmenter::segment() c@243: { c@243: // for now copy the features to a native array and use the existing C segmenter... c@243: double** arrFeatures = new double*[features.size()]; c@243: for (int i = 0; i < features.size(); i++) c@243: { c@243: arrFeatures[i] = new double[features[0].size()]; // allow space for the normalised envelope c@243: for (int j = 0; j < features[0].size(); j++) c@243: arrFeatures[i][j] = features[i][j]; c@243: } c@243: c@243: q = new int[features.size()]; c@243: c@243: cluster_segment(q, arrFeatures, features.size(), features[0].size(), nHMMStates, histogramLength, c@243: nclusters, neighbourhoodLimit); c@243: // convert the cluster assignment sequence to a segmentation c@243: makeSegmentation(q, features.size()); c@243: c@243: // de-allocate arrays c@243: delete [] q; c@243: for (int i = 0; i < features.size(); i++) c@243: delete [] arrFeatures[i]; c@243: delete [] arrFeatures; c@243: c@243: // clear the features c@243: clear(); c@243: } c@243: c@243: void SavedFeatureSegmenter::makeSegmentation(int* q, int len) c@243: { c@243: segmentation.segments.clear(); c@243: segmentation.nsegtypes = nclusters; c@243: segmentation.samplerate = samplerate; c@243: c@243: Segment segment; c@243: segment.start = 0; c@243: segment.type = q[0]; c@243: c@243: for (int i = 1; i < len; i++) c@243: { c@243: if (q[i] != q[i-1]) c@243: { c@243: segment.end = i * getHopsize(); c@243: segmentation.segments.push_back(segment); c@243: segment.type = q[i]; c@243: segment.start = segment.end; c@243: } c@243: } c@243: segment.end = len * getHopsize(); c@243: segmentation.segments.push_back(segment); c@243: } c@243: