annotate dsp/segmentation/SavedFeatureSegmenter.cpp @ 44:00603b8a940f

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