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