comparison dsp/keydetection/GetKeyMode.cpp @ 456:05378924b433

Fix a rounding issue, returning key value 25 The two bins above center B minor are treated as 25. This patch shifts also the input chromagram by 2 to have center C on 1 like the profiles
author Daniel Schürmann <daschuer@mixxx.org>
date Sat, 11 May 2019 02:08:22 +0200
parents f5b5f64835b9
children 8a8cf7296e58
comparison
equal deleted inserted replaced
450:d20dafd127b3 456:05378924b433
175 ////////////////////////////////////////////// 175 //////////////////////////////////////////////
176 m_Decimator->process( PCMData, m_DecimatedBuffer); 176 m_Decimator->process( PCMData, m_DecimatedBuffer);
177 177
178 m_ChrPointer = m_Chroma->process( m_DecimatedBuffer ); 178 m_ChrPointer = m_Chroma->process( m_DecimatedBuffer );
179 179
180 180 // The Cromagram has the center of C at bin 0, while the major
181 // Move bins such that the centre of the base note is in the 181 // and minor profiles have the center of C at 1. We want to have
182 // middle of its three bins : 182 // the correlation for C result also at 1.
183 // Added 21.11.07 by Chris Sutton based on debugging with Katy 183 // To achieve this we have to shift two times:
184 // Noland + comparison with Matlab equivalent. 184 MathUtilities::circShift( m_ChrPointer, m_BPO, 2);
185 MathUtilities::circShift( m_ChrPointer, m_BPO, 1);
186 /* 185 /*
187 std::cout << "raw chroma: "; 186 std::cout << "raw chroma: ";
188 for (int ii = 0; ii < m_BPO; ++ii) { 187 for (int ii = 0; ii < m_BPO; ++ii) {
189 if (ii % (m_BPO/12) == 0) std::cout << "\n"; 188 if (ii % (m_BPO/12) == 0) std::cout << "\n";
190 std::cout << m_ChrPointer[ii] << " "; 189 std::cout << m_ChrPointer[ii] << " ";
264 std::cout << m_keyStrengths[ii] << " "; 263 std::cout << m_keyStrengths[ii] << " ";
265 } 264 }
266 std::cout << std::endl; 265 std::cout << std::endl;
267 */ 266 */
268 double dummy; 267 double dummy;
269 // '1 +' because we number keys 1-24, not 0-23. 268 // m_Keys[1] is C center 1 / 3 + 1 = 1
270 key = 1 + (int)ceil( (double)MathUtilities::getMax( m_Keys, 2* m_BPO, &dummy )/3 ); 269 // m_Keys[4] is D center 4 / 3 + 1 = 2
270 // '+ 1' because we number keys 1-24, not 0-23.
271 key = MathUtilities::getMax( m_Keys, 2* m_BPO, &dummy ) / 3 + 1;
271 272
272 // std::cout << "key pre-sorting: " << key << std::endl; 273 // std::cout << "key pre-sorting: " << key << std::endl;
273 274
274 275
275 //Median filtering 276 //Median filtering