Mercurial > hg > qm-dsp
comparison dsp/tempotracking/DownBeat.cpp @ 77:e2bff5365828
* Fix total failure to detect barline when the strongest beat sd was
occurring at the first beat (bug caused by signed/unsigned overflow)
author | cannam |
---|---|
date | Tue, 23 Jun 2009 12:31:07 +0000 |
parents | 4fada56adbb8 |
children | e5907ae6de17 |
comparison
equal
deleted
inserted
replaced
76:4fada56adbb8 | 77:e2bff5365828 |
---|---|
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 |