annotate dsp/tonal/TonalEstimator.h @ 74:769da847732b

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