annotate dsp/rhythm/BeatSpectrum.cpp @ 31:dfe38135e4c7

* Add cosine distance and the self-similarity matrix used for SB rhythmic similarity * Pull out SB timbral similarity KL divergence into its own file
author cannam
date Fri, 18 Jan 2008 14:40:20 +0000
parents
children e5907ae6de17
rev   line source
cannam@31 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
cannam@31 2
cannam@31 3 /*
cannam@31 4 QM DSP Library
cannam@31 5
cannam@31 6 Centre for Digital Music, Queen Mary, University of London.
cannam@31 7 This file copyright 2008 Kurt Jacobson and QMUL.
cannam@31 8 All rights reserved.
cannam@31 9 */
cannam@31 10
cannam@31 11 #include "BeatSpectrum.h"
cannam@31 12
cannam@31 13 #include "maths/CosineDistance.h"
cannam@31 14
cannam@31 15 using std::vector;
cannam@31 16
cannam@31 17 vector<double> BeatSpectrum::process(const vector<vector<double> > &m)
cannam@31 18 {
cannam@31 19 int origin = 0;
cannam@31 20 int sz = m.size()/2;
cannam@31 21
cannam@31 22 int i, j, k;
cannam@31 23
cannam@31 24 vector<double> v(sz);
cannam@31 25 for (i = 0; i < sz; ++i) v[i] = 0.0;
cannam@31 26
cannam@31 27 CosineDistance cd;
cannam@31 28
cannam@31 29 for (i = origin; i < origin + sz; ++i) {
cannam@31 30
cannam@31 31 k = 0;
cannam@31 32
cannam@31 33 for (j = i + 1; j < i + sz + 1; ++j) {
cannam@31 34
cannam@31 35 v[k++] += cd.distance(m[i], m[j]);
cannam@31 36 }
cannam@31 37 }
cannam@31 38
cannam@31 39 // normalize
cannam@31 40
cannam@31 41 double max = 0.0;
cannam@31 42
cannam@31 43 for (i = 0; i < sz; ++i) {
cannam@31 44 if (v[i] > max) max = v[i];
cannam@31 45 }
cannam@31 46
cannam@31 47 if (max > 0.0) {
cannam@31 48 for (i = 0; i < sz; ++i) {
cannam@31 49 v[i] /= max;
cannam@31 50 }
cannam@31 51 }
cannam@31 52
cannam@31 53 return v;
cannam@31 54 }
cannam@31 55