summaryrefslogtreecommitdiff
path: root/libs/qm-dsp/dsp/tonal/TonalEstimator.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/qm-dsp/dsp/tonal/TonalEstimator.h')
-rw-r--r--libs/qm-dsp/dsp/tonal/TonalEstimator.h105
1 files changed, 105 insertions, 0 deletions
diff --git a/libs/qm-dsp/dsp/tonal/TonalEstimator.h b/libs/qm-dsp/dsp/tonal/TonalEstimator.h
new file mode 100644
index 0000000000..f555ef9e3b
--- /dev/null
+++ b/libs/qm-dsp/dsp/tonal/TonalEstimator.h
@@ -0,0 +1,105 @@
+/* -*- 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 2006 Martin Gasser.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _TONALESTIMATOR_
+#define _TONALESTIMATOR_
+
+
+#include <valarray>
+#include <numeric>
+#include <algorithm>
+#include <iostream>
+
+class ChromaVector : public std::valarray<double>
+{
+public:
+ ChromaVector(size_t uSize = 12) : std::valarray<double>()
+ { resize(uSize, 0.0f); }
+
+ virtual ~ChromaVector() {};
+
+ void printDebug()
+ {
+ for (int i = 0; i < size(); i++)
+ {
+ std::cout << (*this)[i] << ";";
+ }
+
+ std::cout << std::endl;
+ }
+
+ void normalizeL1()
+ {
+ // normalize the chroma vector (L1 norm)
+ double dSum = 0.0;
+
+ for (size_t i = 0; i < 12; (dSum += std::abs((*this)[i++]))) ;
+ for (size_t i = 0; i < 12; dSum > 0.0000001?((*this)[i] /= dSum):(*this)[i]=0.0, i++) ;
+
+ }
+
+ void clear()
+ {
+ for (size_t i = 0; i < 12; ++i) (*this)[i] = 0.0;
+ }
+
+
+};
+
+class TCSVector : public std::valarray<double>
+{
+public:
+ TCSVector() : std::valarray<double>()
+ { resize(6, 0.0f); }
+
+ virtual ~TCSVector() {};
+
+ void printDebug()
+ {
+ for (int i = 0; i < size(); i++)
+ {
+ std::cout << (*this)[i] << ";";
+ }
+
+ std::cout << std::endl;
+ }
+
+ double magnitude() const
+ {
+ double dMag = 0.0;
+
+ for (size_t i = 0; i < 6; i++)
+ {
+ dMag += std::pow((*this)[i], 2.0);
+ }
+
+ return std::sqrt(dMag);
+ }
+
+};
+
+
+
+class TonalEstimator
+{
+public:
+ TonalEstimator();
+ virtual ~TonalEstimator();
+ TCSVector transform2TCS(const ChromaVector& rVector);
+protected:
+ std::valarray< std::valarray<double> > m_Basis;
+};
+
+#endif // _TONALESTIMATOR_