cannam@24: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ cannam@24: cannam@18: /* cannam@24: * ClusterMeltSegmenter.h cannam@18: * cannam@24: * Created by Mark Levy on 23/03/2006. cannam@24: * Copyright 2006 Centre for Digital Music, Queen Mary, University of London. cannam@24: * All rights reserved. cannam@18: */ cannam@18: cannam@18: #include cannam@18: cannam@18: #include "segment.h" cannam@18: #include "Segmenter.h" cannam@20: #include "hmm/hmm.h" cannam@20: #include "base/Window.h" cannam@18: cannam@18: using std::vector; cannam@18: cannam@24: class Decimator; cannam@24: class ConstantQ; cannam@24: cannam@24: class ClusterMeltSegmenterParams cannam@24: // defaults are sensible for 11025Hz with 0.2 second hopsize cannam@18: { cannam@18: public: cannam@24: ClusterMeltSegmenterParams() : cannam@24: featureType(FEATURE_TYPE_CONSTQ), cannam@24: hopSize(0.2), cannam@24: windowSize(0.6), cannam@24: fmin(62), cannam@24: fmax(16000), cannam@24: nbins(8), cannam@24: ncomponents(20), cannam@24: nHMMStates(40), cannam@24: nclusters(10), cannam@24: histogramLength(15), cannam@24: neighbourhoodLimit(20) { } cannam@24: feature_types featureType; cannam@24: double hopSize; // in secs cannam@24: double windowSize; // in secs cannam@24: int fmin; cannam@24: int fmax; cannam@24: int nbins; cannam@24: int ncomponents; cannam@24: int nHMMStates; cannam@24: int nclusters; cannam@24: int histogramLength; cannam@24: int neighbourhoodLimit; cannam@18: }; cannam@18: cannam@18: class ClusterMeltSegmenter : public Segmenter cannam@18: { cannam@18: public: cannam@24: ClusterMeltSegmenter(ClusterMeltSegmenterParams params); cannam@24: virtual ~ClusterMeltSegmenter(); cannam@24: virtual void initialise(int samplerate); cannam@24: virtual int getWindowsize(); cannam@24: virtual int getHopsize(); cannam@24: virtual void extractFeatures(const double* samples, int nsamples); cannam@24: void setFeatures(const vector >& f); // provide the features yourself cannam@24: virtual void segment(); // segment into default number of segment-types cannam@24: void segment(int m); // segment into m segment-types cannam@24: int getNSegmentTypes() { return nclusters; } cannam@24: cannam@18: protected: cannam@24: void makeSegmentation(int* q, int len); cannam@18: cannam@24: Window *window; cannam@24: ConstantQ* constq; cannam@24: model_t* model; // the HMM cannam@24: int* q; // the decoded HMM state sequence cannam@24: vector > histograms; cannam@24: cannam@24: feature_types featureType; cannam@24: double hopSize; // in seconds cannam@24: double windowSize; // in seconds cannam@24: cannam@24: // constant-Q parameters cannam@24: int fmin; cannam@24: int fmax; cannam@24: int nbins; cannam@24: int ncoeff; cannam@24: cannam@24: // PCA parameters cannam@24: int ncomponents; cannam@24: cannam@24: // HMM parameters cannam@24: int nHMMStates; cannam@24: cannam@24: // clustering parameters cannam@24: int nclusters; cannam@24: int histogramLength; cannam@24: int neighbourhoodLimit; cannam@24: cannam@24: Decimator *decimator; cannam@18: };