annotate dsp/tonal/TonalEstimator.h @ 299:5f2c9119a94a

* A few fixes prompted by vamp-plugin-tester
author Chris Cannam <c.cannam@qmul.ac.uk>
date Mon, 08 Jun 2009 12:30:20 +0000
parents c88fb48790d9
children e5907ae6de17
rev   line source
c@225 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
c@225 2
c@225 3 /*
c@225 4 QM DSP Library
c@225 5
c@225 6 Centre for Digital Music, Queen Mary, University of London.
c@225 7 This file copyright 2006 Martin Gasser.
c@225 8 All rights reserved.
c@225 9 */
c@225 10
c@225 11 #ifndef _TONALESTIMATOR_
c@225 12 #define _TONALESTIMATOR_
c@225 13
c@225 14
c@225 15 #include <valarray>
c@225 16 #include <numeric>
c@225 17 #include <algorithm>
c@225 18 #include <iostream>
c@225 19
c@225 20 class ChromaVector : public std::valarray<double>
c@225 21 {
c@225 22 public:
c@225 23 ChromaVector(size_t uSize = 12) : std::valarray<double>()
c@225 24 { resize(uSize, 0.0f); }
c@225 25
c@225 26 virtual ~ChromaVector() {};
c@225 27
c@225 28 void printDebug()
c@225 29 {
c@225 30 for (int i = 0; i < size(); i++)
c@225 31 {
c@225 32 std::cout << (*this)[i] << ";";
c@225 33 }
c@225 34
c@225 35 std::cout << std::endl;
c@225 36 }
c@225 37
c@225 38 void normalizeL1()
c@225 39 {
c@225 40 // normalize the chroma vector (L1 norm)
c@225 41 double dSum = 0.0;
c@225 42
c@285 43 for (size_t i = 0; i < 12; (dSum += std::abs((*this)[i++]))) ;
c@285 44 for (size_t i = 0; i < 12; dSum > 0.0000001?((*this)[i] /= dSum):(*this)[i]=0.0, i++) ;
c@225 45
c@225 46 }
c@299 47
c@299 48 void clear()
c@299 49 {
c@299 50 for (size_t i = 0; i < 12; ++i) (*this)[i] = 0.0;
c@299 51 }
c@299 52
c@225 53
c@225 54 };
c@225 55
c@225 56 class TCSVector : public std::valarray<double>
c@225 57 {
c@225 58 public:
c@225 59 TCSVector() : std::valarray<double>()
c@225 60 { resize(6, 0.0f); }
c@225 61
c@225 62 virtual ~TCSVector() {};
c@225 63
c@225 64 void printDebug()
c@225 65 {
c@225 66 for (int i = 0; i < size(); i++)
c@225 67 {
c@225 68 std::cout << (*this)[i] << ";";
c@225 69 }
c@225 70
c@225 71 std::cout << std::endl;
c@225 72 }
c@225 73
c@225 74 double magnitude() const
c@225 75 {
c@225 76 double dMag = 0.0;
c@225 77
c@225 78 for (size_t i = 0; i < 6; i++)
c@225 79 {
c@225 80 dMag += std::pow((*this)[i], 2.0);
c@225 81 }
c@225 82
c@225 83 return std::sqrt(dMag);
c@225 84 }
c@225 85
c@225 86 };
c@225 87
c@225 88
c@225 89
c@225 90 class TonalEstimator
c@225 91 {
c@225 92 public:
c@225 93 TonalEstimator();
c@225 94 virtual ~TonalEstimator();
c@225 95 TCSVector transform2TCS(const ChromaVector& rVector);
c@225 96 protected:
c@225 97 std::valarray< std::valarray<double> > m_Basis;
c@225 98 };
c@225 99
c@225 100 #endif // _TONALESTIMATOR_