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_
|