Mercurial > hg > qm-dsp
comparison dsp/keydetection/GetKeyMode.cpp @ 457:8a8cf7296e58
Fix some code stying issues in dsp/keydetection/GetKeyMode.cpp
author | Daniel Schürmann <daschuer@mixxx.org> |
---|---|
date | Fri, 24 May 2019 20:11:26 +0200 |
parents | 05378924b433 |
children | e7e36ecd7ad2 |
comparison
equal
deleted
inserted
replaced
456:05378924b433 | 457:8a8cf7296e58 |
---|---|
21 | 21 |
22 #include <cstring> | 22 #include <cstring> |
23 #include <cstdlib> | 23 #include <cstdlib> |
24 | 24 |
25 // Chords profile | 25 // Chords profile |
26 static double MajProfile[36] = | 26 static double MajProfile[36] = { |
27 { 0.0384, 0.0629, 0.0258, 0.0121, 0.0146, 0.0106, 0.0364, 0.0610, 0.0267, | 27 0.0384, 0.0629, 0.0258, 0.0121, 0.0146, 0.0106, 0.0364, 0.0610, 0.0267, |
28 0.0126, 0.0121, 0.0086, 0.0364, 0.0623, 0.0279, 0.0275, 0.0414, 0.0186, | 28 0.0126, 0.0121, 0.0086, 0.0364, 0.0623, 0.0279, 0.0275, 0.0414, 0.0186, |
29 0.0173, 0.0248, 0.0145, 0.0364, 0.0631, 0.0262, 0.0129, 0.0150, 0.0098, | 29 0.0173, 0.0248, 0.0145, 0.0364, 0.0631, 0.0262, 0.0129, 0.0150, 0.0098, |
30 0.0312, 0.0521, 0.0235, 0.0129, 0.0142, 0.0095, 0.0289, 0.0478, 0.0239}; | 30 0.0312, 0.0521, 0.0235, 0.0129, 0.0142, 0.0095, 0.0289, 0.0478, 0.0239}; |
31 | 31 |
32 static double MinProfile[36] = | 32 static double MinProfile[36] = { |
33 { 0.0375, 0.0682, 0.0299, 0.0119, 0.0138, 0.0093, 0.0296, 0.0543, 0.0257, | 33 0.0375, 0.0682, 0.0299, 0.0119, 0.0138, 0.0093, 0.0296, 0.0543, 0.0257, |
34 0.0292, 0.0519, 0.0246, 0.0159, 0.0234, 0.0135, 0.0291, 0.0544, 0.0248, | 34 0.0292, 0.0519, 0.0246, 0.0159, 0.0234, 0.0135, 0.0291, 0.0544, 0.0248, |
35 0.0137, 0.0176, 0.0104, 0.0352, 0.0670, 0.0302, 0.0222, 0.0349, 0.0164, | 35 0.0137, 0.0176, 0.0104, 0.0352, 0.0670, 0.0302, 0.0222, 0.0349, 0.0164, |
36 0.0174, 0.0297, 0.0166, 0.0222, 0.0401, 0.0202, 0.0175, 0.0270, 0.0146}; | 36 0.0174, 0.0297, 0.0166, 0.0222, 0.0401, 0.0202, 0.0175, 0.0270, 0.0146}; |
37 // | 37 // |
38 | 38 |
39 | 39 |
40 ////////////////////////////////////////////////////////////////////// | 40 ////////////////////////////////////////////////////////////////////// |
41 // Construction/Destruction | 41 // Construction/Destruction |
42 ////////////////////////////////////////////////////////////////////// | 42 ////////////////////////////////////////////////////////////////////// |
43 | 43 |
44 GetKeyMode::GetKeyMode( int sampleRate, float tuningFrequency, | 44 GetKeyMode::GetKeyMode( int sampleRate, float tuningFrequency, |
45 double hpcpAverage, double medianAverage ) : | 45 double hpcpAverage, double medianAverage ) : |
46 m_hpcpAverage( hpcpAverage ), | 46 m_hpcpAverage( hpcpAverage ), |
47 m_medianAverage( medianAverage ), | 47 m_medianAverage( medianAverage ), |
48 m_ChrPointer(0), | 48 m_ChrPointer(0), |
49 m_DecimatedBuffer(0), | 49 m_DecimatedBuffer(0), |
50 m_ChromaBuffer(0), | 50 m_ChromaBuffer(0), |
59 m_DecimationFactor = 8; | 59 m_DecimationFactor = 8; |
60 | 60 |
61 // Chromagram configuration parameters | 61 // Chromagram configuration parameters |
62 m_ChromaConfig.normalise = MathUtilities::NormaliseUnitMax; | 62 m_ChromaConfig.normalise = MathUtilities::NormaliseUnitMax; |
63 m_ChromaConfig.FS = lrint(sampleRate/(double)m_DecimationFactor); | 63 m_ChromaConfig.FS = lrint(sampleRate/(double)m_DecimationFactor); |
64 if (m_ChromaConfig.FS < 1) m_ChromaConfig.FS = 1; | 64 if (m_ChromaConfig.FS < 1) { |
65 m_ChromaConfig.FS = 1; | |
66 } | |
65 | 67 |
66 // Set C (= MIDI #12) as our base : | 68 // Set C (= MIDI #12) as our base : |
67 // This implies that key = 1 => Cmaj, key = 12 => Bmaj, key = 13 => Cmin, etc. | 69 // This implies that key = 1 => Cmaj, key = 12 => Bmaj, key = 13 => Cmin, etc. |
68 m_ChromaConfig.min = Pitch::getFrequencyForPitch | 70 m_ChromaConfig.min = Pitch::getFrequencyForPitch( 48, 0, tuningFrequency ); |
69 (48, 0, tuningFrequency); | 71 m_ChromaConfig.max = Pitch::getFrequencyForPitch( 96, 0, tuningFrequency ); |
70 m_ChromaConfig.max = Pitch::getFrequencyForPitch | |
71 (96, 0, tuningFrequency); | |
72 | 72 |
73 m_ChromaConfig.BPO = 36; | 73 m_ChromaConfig.BPO = 36; |
74 m_ChromaConfig.CQThresh = 0.0054; | 74 m_ChromaConfig.CQThresh = 0.0054; |
75 | 75 |
76 // Chromagram inst. | 76 // Chromagram inst. |
107 | 107 |
108 m_MedianFilterBuffer = new int[ m_MedianWinsize ]; | 108 m_MedianFilterBuffer = new int[ m_MedianWinsize ]; |
109 memset( m_MedianFilterBuffer, 0, sizeof(int)*m_MedianWinsize); | 109 memset( m_MedianFilterBuffer, 0, sizeof(int)*m_MedianWinsize); |
110 | 110 |
111 m_SortedBuffer = new int[ m_MedianWinsize ]; | 111 m_SortedBuffer = new int[ m_MedianWinsize ]; |
112 memset( m_SortedBuffer, 0, sizeof(int)*m_MedianWinsize); | 112 memset( m_SortedBuffer, 0, sizeof(int)*m_MedianWinsize); |
113 | 113 |
114 m_Decimator = new Decimator | 114 m_Decimator = new Decimator( m_ChromaFrameSize*m_DecimationFactor, m_DecimationFactor ); |
115 ( m_ChromaFrameSize*m_DecimationFactor, m_DecimationFactor ); | |
116 | 115 |
117 m_keyStrengths = new double[24]; | 116 m_keyStrengths = new double[24]; |
118 } | 117 } |
119 | 118 |
120 GetKeyMode::~GetKeyMode() | 119 GetKeyMode::~GetKeyMode() |
121 { | 120 { |
122 | |
123 delete m_Chroma; | 121 delete m_Chroma; |
124 delete m_Decimator; | 122 delete m_Decimator; |
125 | 123 |
126 delete [] m_DecimatedBuffer; | 124 delete [] m_DecimatedBuffer; |
127 delete [] m_ChromaBuffer; | 125 delete [] m_ChromaBuffer; |
145 double mY = MathUtilities::mean( pData2, length ); | 143 double mY = MathUtilities::mean( pData2, length ); |
146 | 144 |
147 double sum1 = 0; | 145 double sum1 = 0; |
148 double sum2 = 0; | 146 double sum2 = 0; |
149 | 147 |
150 for( unsigned int i = 0; i <length; i++ ) | 148 for( unsigned int i = 0; i <length; i++ ) { |
151 { | |
152 num += ( pData1[i] - mX ) * ( pData2[i] - mY ); | 149 num += ( pData1[i] - mX ) * ( pData2[i] - mY ); |
153 | 150 |
154 sum1 += ( (pData1[i]-mX) * (pData1[i]-mX) ); | 151 sum1 += ( (pData1[i]-mX) * (pData1[i]-mX) ); |
155 sum2 += ( (pData2[i]-mY) * (pData2[i]-mY) ); | 152 sum2 += ( (pData2[i]-mY) * (pData2[i]-mY) ); |
156 } | 153 } |
157 | 154 |
158 den = sqrt(sum1 * sum2); | 155 den = sqrt(sum1 * sum2); |
159 | 156 |
160 if( den>0 ) | 157 if( den>0 ) { |
161 retVal = num/den; | 158 retVal = num/den; |
162 else | 159 } else { |
163 retVal = 0; | 160 retVal = 0; |
164 | 161 } |
165 | 162 |
166 return retVal; | 163 return retVal; |
167 } | 164 } |
168 | 165 |
169 int GetKeyMode::process(double *PCMData) | 166 int GetKeyMode::process(double *PCMData) |
170 { | 167 { |
171 int key; | 168 int key; |
172 | |
173 unsigned int j,k; | 169 unsigned int j,k; |
174 | 170 |
175 ////////////////////////////////////////////// | 171 ////////////////////////////////////////////// |
176 m_Decimator->process( PCMData, m_DecimatedBuffer); | 172 m_Decimator->process( PCMData, m_DecimatedBuffer); |
177 | 173 |
178 m_ChrPointer = m_Chroma->process( m_DecimatedBuffer ); | 174 m_ChrPointer = m_Chroma->process( m_DecimatedBuffer ); |
179 | 175 |
180 // The Cromagram has the center of C at bin 0, while the major | 176 // The Cromagram has the center of C at bin 0, while the major |
181 // and minor profiles have the center of C at 1. We want to have | 177 // and minor profiles have the center of C at 1. We want to have |
182 // the correlation for C result also at 1. | 178 // the correlation for C result also at 1. |
183 // To achieve this we have to shift two times: | 179 // To achieve this we have to shift two times: |
190 } | 186 } |
191 std::cout << std::endl; | 187 std::cout << std::endl; |
192 */ | 188 */ |
193 // populate hpcp values; | 189 // populate hpcp values; |
194 int cbidx; | 190 int cbidx; |
195 for( j = 0; j < m_BPO; j++ ) | 191 for( j = 0; j < m_BPO; j++ ) { |
196 { | |
197 cbidx = (m_bufferindex * m_BPO) + j; | 192 cbidx = (m_bufferindex * m_BPO) + j; |
198 m_ChromaBuffer[ cbidx ] = m_ChrPointer[j]; | 193 m_ChromaBuffer[ cbidx ] = m_ChrPointer[j]; |
199 } | 194 } |
200 | 195 |
201 //keep track of input buffers; | 196 //keep track of input buffers; |
202 if( m_bufferindex++ >= m_ChromaBuffersize - 1) | 197 if( m_bufferindex++ >= m_ChromaBuffersize - 1) { |
203 m_bufferindex = 0; | 198 m_bufferindex = 0; |
199 } | |
204 | 200 |
205 // track filling of chroma matrix | 201 // track filling of chroma matrix |
206 if( m_ChromaBufferFilling++ >= m_ChromaBuffersize) | 202 if( m_ChromaBufferFilling++ >= m_ChromaBuffersize) { |
207 m_ChromaBufferFilling = m_ChromaBuffersize; | 203 m_ChromaBufferFilling = m_ChromaBuffersize; |
208 | 204 } |
209 //calculate mean | 205 |
210 for( k = 0; k < m_BPO; k++ ) | 206 //calculate mean |
211 { | 207 for( k = 0; k < m_BPO; k++ ) { |
212 double mnVal = 0.0; | 208 double mnVal = 0.0; |
213 for( j = 0; j < m_ChromaBufferFilling; j++ ) | 209 for( j = 0; j < m_ChromaBufferFilling; j++ ) { |
214 { | |
215 mnVal += m_ChromaBuffer[ k + (j*m_BPO) ]; | 210 mnVal += m_ChromaBuffer[ k + (j*m_BPO) ]; |
216 } | 211 } |
217 | 212 |
218 m_MeanHPCP[k] = mnVal/(double)m_ChromaBufferFilling; | 213 m_MeanHPCP[k] = mnVal/(double)m_ChromaBufferFilling; |
219 } | 214 } |
220 | 215 |
221 | 216 |
222 for( k = 0; k < m_BPO; k++ ) | 217 for( k = 0; k < m_BPO; k++ ) { |
223 { | |
224 m_MajCorr[k] = krumCorr( m_MeanHPCP, MajProfile, m_BPO ); | 218 m_MajCorr[k] = krumCorr( m_MeanHPCP, MajProfile, m_BPO ); |
225 m_MinCorr[k] = krumCorr( m_MeanHPCP, MinProfile, m_BPO ); | 219 m_MinCorr[k] = krumCorr( m_MeanHPCP, MinProfile, m_BPO ); |
226 | 220 |
227 MathUtilities::circShift( MajProfile, m_BPO, 1 ); | 221 MathUtilities::circShift( MajProfile, m_BPO, 1 ); |
228 MathUtilities::circShift( MinProfile, m_BPO, 1 ); | 222 MathUtilities::circShift( MinProfile, m_BPO, 1 ); |
229 } | 223 } |
230 | 224 |
231 for( k = 0; k < m_BPO; k++ ) | 225 for( k = 0; k < m_BPO; k++ ) { |
232 { | |
233 m_Keys[k] = m_MajCorr[k]; | 226 m_Keys[k] = m_MajCorr[k]; |
234 m_Keys[k+m_BPO] = m_MinCorr[k]; | 227 m_Keys[k+m_BPO] = m_MinCorr[k]; |
235 } | 228 } |
236 | 229 |
237 for (k = 0; k < 24; ++k) { | 230 for (k = 0; k < 24; ++k) { |
238 m_keyStrengths[k] = 0; | 231 m_keyStrengths[k] = 0; |
239 } | 232 } |
240 | 233 |
241 for( k = 0; k < m_BPO*2; k++ ) | 234 for( k = 0; k < m_BPO*2; k++ ) { |
242 { | |
243 int idx = k / (m_BPO/12); | 235 int idx = k / (m_BPO/12); |
244 int rem = k % (m_BPO/12); | 236 int rem = k % (m_BPO/12); |
245 if (rem == 0 || m_Keys[k] > m_keyStrengths[idx]) { | 237 if (rem == 0 || m_Keys[k] > m_keyStrengths[idx]) { |
246 m_keyStrengths[idx] = m_Keys[k]; | 238 m_keyStrengths[idx] = m_Keys[k]; |
247 } | 239 } |
274 | 266 |
275 | 267 |
276 //Median filtering | 268 //Median filtering |
277 | 269 |
278 // track Median buffer initial filling | 270 // track Median buffer initial filling |
279 if( m_MedianBufferFilling++ >= m_MedianWinsize) | 271 if( m_MedianBufferFilling++ >= m_MedianWinsize) { |
280 m_MedianBufferFilling = m_MedianWinsize; | 272 m_MedianBufferFilling = m_MedianWinsize; |
281 | 273 } |
274 | |
282 //shift median buffer | 275 //shift median buffer |
283 for( k = 1; k < m_MedianWinsize; k++ ) | 276 for( k = 1; k < m_MedianWinsize; k++ ) { |
284 { | |
285 m_MedianFilterBuffer[ k - 1 ] = m_MedianFilterBuffer[ k ]; | 277 m_MedianFilterBuffer[ k - 1 ] = m_MedianFilterBuffer[ k ]; |
286 } | 278 } |
287 | 279 |
288 //write new key value into median buffer | 280 //write new key value into median buffer |
289 m_MedianFilterBuffer[ m_MedianWinsize - 1 ] = key; | 281 m_MedianFilterBuffer[ m_MedianWinsize - 1 ] = key; |
290 | 282 |
291 | 283 |
292 //Copy median into sorting buffer, reversed | 284 //Copy median into sorting buffer, reversed |
293 unsigned int ijx = 0; | 285 unsigned int ijx = 0; |
294 for( k = 0; k < m_MedianWinsize; k++ ) | 286 for( k = 0; k < m_MedianWinsize; k++ ) { |
295 { | |
296 m_SortedBuffer[k] = m_MedianFilterBuffer[m_MedianWinsize-1-ijx]; | 287 m_SortedBuffer[k] = m_MedianFilterBuffer[m_MedianWinsize-1-ijx]; |
297 ijx++; | 288 ijx++; |
298 } | 289 } |
299 | 290 |
300 qsort(m_SortedBuffer, m_MedianBufferFilling, sizeof(unsigned int), | 291 qsort(m_SortedBuffer, m_MedianBufferFilling, sizeof(unsigned int), |
309 int sortlength = m_MedianBufferFilling; | 300 int sortlength = m_MedianBufferFilling; |
310 int midpoint = (int)ceil((double)sortlength/2); | 301 int midpoint = (int)ceil((double)sortlength/2); |
311 | 302 |
312 // std::cout << "midpoint = " << midpoint << endl; | 303 // std::cout << "midpoint = " << midpoint << endl; |
313 | 304 |
314 if( midpoint <= 0 ) | 305 if( midpoint <= 0 ) { |
315 midpoint = 1; | 306 midpoint = 1; |
307 } | |
316 | 308 |
317 key = m_SortedBuffer[midpoint-1]; | 309 key = m_SortedBuffer[midpoint-1]; |
318 | 310 |
319 // std::cout << "returning key = " << key << endl; | 311 // std::cout << "returning key = " << key << endl; |
320 | 312 |