Mercurial > hg > qm-dsp
comparison dsp/keydetection/GetKeyMode.cpp @ 265:c1a952d9017c
* Add key strength output; increase chromagram lower bound so as to shorten
hop size
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Fri, 01 Feb 2008 16:45:49 +0000 |
parents | c96785becf96 |
children | b4921bfd2aea |
comparison
equal
deleted
inserted
replaced
264:766f770b358f | 265:c1a952d9017c |
---|---|
21 { 0.0375, 0.0682, 0.0299, 0.0119, 0.0138, 0.0093, 0.0296, 0.0543, 0.0257, | 21 { 0.0375, 0.0682, 0.0299, 0.0119, 0.0138, 0.0093, 0.0296, 0.0543, 0.0257, |
22 0.0292, 0.0519, 0.0246, 0.0159, 0.0234, 0.0135, 0.0291, 0.0544, 0.0248, | 22 0.0292, 0.0519, 0.0246, 0.0159, 0.0234, 0.0135, 0.0291, 0.0544, 0.0248, |
23 0.0137, 0.0176, 0.0104, 0.0352, 0.0670, 0.0302, 0.0222, 0.0349, 0.0164, | 23 0.0137, 0.0176, 0.0104, 0.0352, 0.0670, 0.0302, 0.0222, 0.0349, 0.0164, |
24 0.0174, 0.0297, 0.0166, 0.0222, 0.0401, 0.0202, 0.0175, 0.0270, 0.0146}; | 24 0.0174, 0.0297, 0.0166, 0.0222, 0.0401, 0.0202, 0.0175, 0.0270, 0.0146}; |
25 // | 25 // |
26 | |
26 | 27 |
27 ////////////////////////////////////////////////////////////////////// | 28 ////////////////////////////////////////////////////////////////////// |
28 // Construction/Destruction | 29 // Construction/Destruction |
29 ////////////////////////////////////////////////////////////////////// | 30 ////////////////////////////////////////////////////////////////////// |
30 | 31 |
38 m_MeanHPCP(0), | 39 m_MeanHPCP(0), |
39 m_MajCorr(0), | 40 m_MajCorr(0), |
40 m_MinCorr(0), | 41 m_MinCorr(0), |
41 m_Keys(0), | 42 m_Keys(0), |
42 m_MedianFilterBuffer(0), | 43 m_MedianFilterBuffer(0), |
43 m_SortedBuffer(0) | 44 m_SortedBuffer(0), |
45 m_keyStrengths(0) | |
44 { | 46 { |
45 m_DecimationFactor = 8; | 47 m_DecimationFactor = 8; |
46 | 48 |
47 // Chromagram configuration parameters | 49 // Chromagram configuration parameters |
48 m_ChromaConfig.normalise = MathUtilities::NormaliseUnitMax; | 50 m_ChromaConfig.normalise = MathUtilities::NormaliseUnitMax; |
49 m_ChromaConfig.FS = lrint(sampleRate/(double)m_DecimationFactor); | 51 m_ChromaConfig.FS = lrint(sampleRate/(double)m_DecimationFactor); |
50 | 52 |
51 // Set C (= MIDI #12) as our base : | 53 // Set C (= MIDI #12) as our base : |
52 // This implies that key = 1 => Cmaj, key = 12 => Bmaj, key = 13 => Cmin, etc. | 54 // This implies that key = 1 => Cmaj, key = 12 => Bmaj, key = 13 => Cmin, etc. |
53 m_ChromaConfig.min = Pitch::getFrequencyForPitch | 55 m_ChromaConfig.min = Pitch::getFrequencyForPitch |
54 (12, 0, tuningFrequency); | 56 (48, 0, tuningFrequency); |
55 m_ChromaConfig.max = Pitch::getFrequencyForPitch | 57 m_ChromaConfig.max = Pitch::getFrequencyForPitch |
56 (96, 0, tuningFrequency); | 58 (96, 0, tuningFrequency); |
57 | 59 |
58 m_ChromaConfig.BPO = 36; | 60 m_ChromaConfig.BPO = 36; |
59 m_ChromaConfig.CQThresh = 0.0054; | 61 m_ChromaConfig.CQThresh = 0.0054; |
65 m_ChromaFrameSize = m_Chroma->getFrameSize(); | 67 m_ChromaFrameSize = m_Chroma->getFrameSize(); |
66 // override hopsize for this application | 68 // override hopsize for this application |
67 m_ChromaHopSize = m_ChromaFrameSize; | 69 m_ChromaHopSize = m_ChromaFrameSize; |
68 m_BPO = m_ChromaConfig.BPO; | 70 m_BPO = m_ChromaConfig.BPO; |
69 | 71 |
72 // std::cerr << "chroma frame size = " << m_ChromaFrameSize << ", decimation factor = " << m_DecimationFactor << " therefore block size = " << getBlockSize() << std::endl; | |
73 | |
70 // Chromagram average and estimated key median filter lengths | 74 // Chromagram average and estimated key median filter lengths |
71 m_ChromaBuffersize = (int)ceil( m_hpcpAverage * m_ChromaConfig.FS/m_ChromaFrameSize ); | 75 m_ChromaBuffersize = (int)ceil( m_hpcpAverage * m_ChromaConfig.FS/m_ChromaFrameSize ); |
72 m_MedianWinsize = (int)ceil( m_medianAverage * m_ChromaConfig.FS/m_ChromaFrameSize ); | 76 m_MedianWinsize = (int)ceil( m_medianAverage * m_ChromaConfig.FS/m_ChromaFrameSize ); |
73 | 77 |
74 // Reset counters | 78 // Reset counters |
94 m_SortedBuffer = new int[ m_MedianWinsize ]; | 98 m_SortedBuffer = new int[ m_MedianWinsize ]; |
95 memset( m_SortedBuffer, 0, sizeof(int)*m_MedianWinsize); | 99 memset( m_SortedBuffer, 0, sizeof(int)*m_MedianWinsize); |
96 | 100 |
97 m_Decimator = new Decimator | 101 m_Decimator = new Decimator |
98 ( m_ChromaFrameSize*m_DecimationFactor, m_DecimationFactor ); | 102 ( m_ChromaFrameSize*m_DecimationFactor, m_DecimationFactor ); |
103 | |
104 m_keyStrengths = new double[24]; | |
99 } | 105 } |
100 | 106 |
101 GetKeyMode::~GetKeyMode() | 107 GetKeyMode::~GetKeyMode() |
102 { | 108 { |
103 | 109 |
110 delete [] m_MajCorr; | 116 delete [] m_MajCorr; |
111 delete [] m_MinCorr; | 117 delete [] m_MinCorr; |
112 delete [] m_Keys; | 118 delete [] m_Keys; |
113 delete [] m_MedianFilterBuffer; | 119 delete [] m_MedianFilterBuffer; |
114 delete [] m_SortedBuffer; | 120 delete [] m_SortedBuffer; |
121 | |
122 delete[] m_keyStrengths; | |
115 } | 123 } |
116 | 124 |
117 double GetKeyMode::krumCorr(double *pData1, double *pData2, unsigned int length) | 125 double GetKeyMode::krumCorr(double *pData1, double *pData2, unsigned int length) |
118 { | 126 { |
119 double retVal= 0.0; | 127 double retVal= 0.0; |
212 { | 220 { |
213 m_Keys[k] = m_MajCorr[k]; | 221 m_Keys[k] = m_MajCorr[k]; |
214 m_Keys[k+m_BPO] = m_MinCorr[k]; | 222 m_Keys[k+m_BPO] = m_MinCorr[k]; |
215 } | 223 } |
216 | 224 |
225 for (k = 0; k < 24; ++k) { | |
226 m_keyStrengths[k] = 0; | |
227 } | |
228 | |
229 for( k = 0; k < m_BPO*2; k++ ) | |
230 { | |
231 m_keyStrengths[k/(m_BPO/12)] += m_Keys[k]; | |
232 } | |
217 | 233 |
218 /* | 234 /* |
219 std::cout << "raw keys: "; | 235 std::cout << "raw keys: "; |
220 for (int ii = 0; ii < 2*m_BPO; ++ii) { | 236 for (int ii = 0; ii < 2*m_BPO; ++ii) { |
221 std::cout << m_Keys[ii] << " "; | 237 std::cout << m_Keys[ii] << " "; |