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