comparison dsp/tempotracking/DownBeat.cpp @ 302:0b4c811baa10

* Fix total failure to detect barline when the strongest beat sd was occurring at the first beat (bug caused by signed/unsigned overflow)
author Chris Cannam <c.cannam@qmul.ac.uk>
date Tue, 23 Jun 2009 12:31:07 +0000
parents 17c7b6658329
children e5907ae6de17
comparison
equal deleted inserted replaced
301:17c7b6658329 302:0b4c811baa10
67 void 67 void
68 DownBeat::makeDecimators() 68 DownBeat::makeDecimators()
69 { 69 {
70 // std::cerr << "m_factor = " << m_factor << std::endl; 70 // std::cerr << "m_factor = " << m_factor << std::endl;
71 if (m_factor < 2) return; 71 if (m_factor < 2) return;
72 int highest = Decimator::getHighestSupportedFactor(); 72 size_t highest = Decimator::getHighestSupportedFactor();
73 if (m_factor <= highest) { 73 if (m_factor <= highest) {
74 m_decimator1 = new Decimator(m_increment, m_factor); 74 m_decimator1 = new Decimator(m_increment, m_factor);
75 // std::cerr << "DownBeat: decimator 1 factor " << m_factor << ", size " << m_increment << std::endl; 75 // std::cerr << "DownBeat: decimator 1 factor " << m_factor << ", size " << m_increment << std::endl;
76 return; 76 return;
77 } 77 }
105 m_decimator2->process(m_decbuf, m_buffer + m_buffill); 105 m_decimator2->process(m_decbuf, m_buffer + m_buffill);
106 } else if (m_decimator1) { 106 } else if (m_decimator1) {
107 m_decimator1->process(audio, m_buffer + m_buffill); 107 m_decimator1->process(audio, m_buffer + m_buffill);
108 } else { 108 } else {
109 // just copy across (m_factor is presumably 1) 109 // just copy across (m_factor is presumably 1)
110 for (int i = 0; i < m_increment; ++i) { 110 for (size_t i = 0; i < m_increment; ++i) {
111 (m_buffer + m_buffill)[i] = audio[i]; 111 (m_buffer + m_buffill)[i] = audio[i];
112 } 112 }
113 } 113 }
114 // for (int i = 0; i < m_increment / m_factor; ++i) { 114 // for (int i = 0; i < m_increment / m_factor; ++i) {
115 // rmsout += m_buffer[m_buffill + i] * m_buffer[m_buffill + i]; 115 // rmsout += m_buffer[m_buffill + i] * m_buffer[m_buffill + i];
215 } 215 }
216 } 216 }
217 217
218 // We now have all spectral difference measures in specdiff 218 // We now have all spectral difference measures in specdiff
219 219
220 unsigned int timesig = m_bpb; 220 int timesig = m_bpb;
221 if (timesig == 0) timesig = 4; 221 if (timesig == 0) timesig = 4;
222 222
223 d_vec_t dbcand(timesig); // downbeat candidates 223 d_vec_t dbcand(timesig); // downbeat candidates
224 224
225 for (int beat = 0; beat < timesig; ++beat) { 225 for (int beat = 0; beat < timesig; ++beat) {
227 } 227 }
228 228
229 // look for beat transition which leads to greatest spectral change 229 // look for beat transition which leads to greatest spectral change
230 for (int beat = 0; beat < timesig; ++beat) { 230 for (int beat = 0; beat < timesig; ++beat) {
231 int count = 0; 231 int count = 0;
232 for (int example = beat; example < m_beatsd.size(); example += timesig) { 232 for (int example = beat-1; example < (int)m_beatsd.size(); example += timesig) {
233 if (example < 0) continue; 233 if (example < 0) continue;
234 dbcand[beat] += (m_beatsd[example]) / timesig; 234 dbcand[beat] += (m_beatsd[example]) / timesig;
235 ++count; 235 ++count;
236 } 236 }
237 if (count > 0) dbcand[beat] /= count; 237 if (count > 0) dbcand[beat] /= count;
240 240
241 // first downbeat is beat at index of maximum value of dbcand 241 // first downbeat is beat at index of maximum value of dbcand
242 int dbind = MathUtilities::getMax(dbcand); 242 int dbind = MathUtilities::getMax(dbcand);
243 243
244 // remaining downbeats are at timesig intervals from the first 244 // remaining downbeats are at timesig intervals from the first
245 for (int i = dbind; i < beats.size(); i += timesig) { 245 for (int i = dbind; i < (int)beats.size(); i += timesig) {
246 downbeats.push_back(i); 246 downbeats.push_back(i);
247 } 247 }
248 } 248 }
249 249
250 double 250 double
296 } 296 }
297 297
298 void 298 void
299 DownBeat::getBeatSD(vector<double> &beatsd) const 299 DownBeat::getBeatSD(vector<double> &beatsd) const
300 { 300 {
301 for (int i = 0; i < m_beatsd.size(); ++i) beatsd.push_back(m_beatsd[i]); 301 for (int i = 0; i < (int)m_beatsd.size(); ++i) beatsd.push_back(m_beatsd[i]);
302 } 302 }
303 303