diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dsp/rhythm/BeatSpectrum.cpp	Fri Jan 18 14:40:20 2008 +0000
@@ -0,0 +1,55 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    QM DSP Library
+
+    Centre for Digital Music, Queen Mary, University of London.
+    This file copyright 2008 Kurt Jacobson and QMUL.
+    All rights reserved.
+*/
+
+#include "BeatSpectrum.h"
+
+#include "maths/CosineDistance.h"
+
+using std::vector;
+
+vector<double> BeatSpectrum::process(const vector<vector<double> > &m)
+{
+    int origin = 0;
+    int sz = m.size()/2;
+
+    int i, j, k;
+
+    vector<double> v(sz);
+    for (i = 0; i < sz; ++i) v[i] = 0.0;
+
+    CosineDistance cd;
+
+    for (i = origin; i < origin + sz; ++i) {
+
+        k = 0;
+
+        for (j = i + 1; j < i + sz + 1; ++j) {
+
+            v[k++] += cd.distance(m[i], m[j]);
+        }
+    }
+
+    // normalize
+
+    double max = 0.0;
+
+    for (i = 0; i < sz; ++i) {
+        if (v[i] > max) max = v[i];
+    }
+
+    if (max > 0.0) {
+        for (i = 0; i < sz; ++i) {
+            v[i] /= max;
+        }
+    }
+
+    return v;
+}
+