Mercurial > hg > qm-dsp
diff dsp/segmentation/ClusterMeltSegmenter.cpp @ 20:8bdbda7fb893
* First cut at properly integrating the segmenter and making it work right
author | cannam |
---|---|
date | Wed, 09 Jan 2008 16:50:04 +0000 |
parents | 8e90a56b4b5f |
children | 2b74bd60c61f |
line wrap: on
line diff
--- a/dsp/segmentation/ClusterMeltSegmenter.cpp Wed Jan 09 10:48:08 2008 +0000 +++ b/dsp/segmentation/ClusterMeltSegmenter.cpp Wed Jan 09 16:50:04 2008 +0000 @@ -11,15 +11,16 @@ #include <cmath> #include "ClusterMeltSegmenter.h" -#include "lib_constQ.h" #include "cluster_segmenter.h" #include "segment.h" +#include "dsp/transforms/FFT.h" + ClusterMeltSegmenter::ClusterMeltSegmenter(ClusterMeltSegmenterParams params) : window(NULL), constq(NULL), featureType(params.featureType), +hopSize(params.hopSize), windowSize(params.windowSize), -hopSize(params.hopSize), fmin(params.fmin), fmax(params.fmax), nbins(params.nbins), @@ -36,47 +37,102 @@ samplerate = fs; if (featureType != FEATURE_TYPE_UNKNOWN) { - ncoeff = static_cast<int>(ceil(nbins * (log(fmax / static_cast<double>(fmin))) / log(2.0))); - constq = init_constQ(fmin, fmax, nbins, samplerate, ncoeff); +//!!! ncoeff = static_cast<int>(ceil(nbins * (log(fmax / static_cast<double>(fmin))) / log(2.0))); + CQConfig config; + config.FS = samplerate; + config.min = fmin; + config.max = fmax; + config.BPO = nbins; + config.CQThresh = 0.0054; + constq = new ConstantQ(config); +//!!! constq = init_constQ(fmin, fmax, nbins, samplerate, ncoeff); + ncoeff = constq->getK(); } } ClusterMeltSegmenter::~ClusterMeltSegmenter() { - delete [] window; - if (constq) - close_constQ(constq); + delete window; + delete constq; +//!!! if (constq) +// close_constQ(constq); +} + +int +ClusterMeltSegmenter::getWindowsize() +{ + if (featureType != FEATURE_TYPE_UNKNOWN) { + std::cerr << "rate = " << samplerate << ", fft length = " << constq->getfftlength() << ", fmin = " << fmin << ", fmax = " << fmax << ", nbins = " << nbins << ", K = " << constq->getK() << ", Q = " << constq->getQ() << std::endl; + return constq->getfftlength(); + } else { + return static_cast<int>(windowSize * samplerate); + } +} + +int +ClusterMeltSegmenter::getHopsize() +{ + return static_cast<int>(hopSize * samplerate); } void ClusterMeltSegmenter::extractFeatures(double* samples, int nsamples) { // create a new window if needed +/*!!! if (!window || nsamples != windowLength) { if (window) delete [] window; - window = hamming_p(nsamples); +// Window<double>(HammingWindow, nsamples).cut +//!!! window = hamming_p(nsamples); windowLength = nsamples; } - +*/ + if (!window || window->getSize() != nsamples) { + delete window; + window = new Window<double>(HammingWindow, nsamples); + } + // copy the samples before windowing in case we need them for something else double* frame = new double[nsamples]; - for (int i = 0; i < nsamples; i++) - frame[i] = samples[i] * window[i]; +// for (int i = 0; i < nsamples; i++) +// frame[i] = samples[i] * window[i]; + window->cut(frame); + std::cerr << "nsamples = " << nsamples << std::endl; + + double *real = new double[nsamples]; + double *imag = new double[nsamples]; + + FFT::process(nsamples, false, frame, 0, real, imag); + + double *cqre = new double[ncoeff]; + double *cqim = new double[ncoeff]; + + constq->process(real, imag, cqre, cqim); + // extract const-Q - do_constQ(constq, frame, nsamples); - int ncq = constq->ncoeff; +//!!! do_constQ(constq, frame, nsamples); +// int ncq = constq->ncoeff; + + delete [] frame; + delete [] real; + delete [] imag; - delete [] frame; - - if (ncq == ncoeff) // else feature extraction failed - { - vector<double> cq(ncq); - for (int i = 0; i < ncq; i++) - cq[i] = constq->absconstQtransform[i]; +//!!! if (ncq == ncoeff) // else feature extraction failed +// { +// vector<double> cq(ncq); +// for (int i = 0; i < ncq; i++) +// cq[i] = constq->absconstQtransform[i]; + vector<double> cq(ncoeff); + for (int i = 0; i < ncoeff; ++i) { + cq[i] = sqrt(cqre[i] * cqre[i] + cqim[i] * cqim[i]); + } features.push_back(cq); - } +// } + + delete[] cqre; + delete[] cqim; } void ClusterMeltSegmenter::segment(int m) @@ -95,7 +151,8 @@ { if (constq) { - close_constQ(constq); // finished extracting features +//!!! close_constQ(constq); // finished extracting features + delete constq; constq = NULL; }