I'm trying to synchronize (overlap) two audio recordings of the same song: a complete HQ version, and an incomplete, noisy version (phone recording for example). The noisy recording may have had its tempo increased/decreased.

Currently I have something working based on this 2001 paper: "The Beat Spectrum: a New Approach To Rhythm Analysis"

In short:

  • Get a self-similarity vector for each song, which will contain peaks at every multiple of the song bar duration (every 4 or 8 beats for latin music for example)
  • For each r (relative tempo ratio) from 0.7 to 1.3, scale the second vector and then do a dot product on the two vectors, using v1[i]·v2[i] = d1[i]*d2[i] (where d1[i] is the sign of v1's derivative; same for d2)

When the beats are clear in the recordings, I get a clear maximum at the correct ratio (usually 1.0). The problem is that when the beats are lost (due to EQ, bad mics, noise) the self-similarity chart stops showing the periodic bars and I get maximums in the wrong places in the dot product.

My question is, what else could I use instead of the dot-product-of-the-derivative-sign, and what other robust ways are there to determine the tempo change ratio in the presence of noise, besides doing BPM(song1) / BPM(song2).

In case someone can take this further: computing self-similarity by overlapping the sample twice (at [0, ofs, ofs+ofs] instead of just [0, ofs]) gives much more accurate maximums for each beat duration. But I haven't tested it yet on all the samples I have.

  • $\begingroup$ The issue may be that the scaling isn't uniform across the entire track? Maybe try splitting the tracks into smaller parts (say 5-10 seconds) and compute $r$ for each independently. Then discard outliers, compute a moving average, and let then scaling parameter vary over time as you apply the transformation. $\endgroup$ – Dan Brumleve Nov 5 '12 at 21:10
  • $\begingroup$ I have contacted the moderators on Signal Processing regarding migration. $\endgroup$ – robjohn Nov 5 '12 at 23:57
  • $\begingroup$ Dan, shorter samples + discarding outliers definitely seems to help, I get more prominent maximums. I can't figure out how to account for r(t) as a non-constant (and it doesn't appear in any songs). $\endgroup$ – patraulea Nov 6 '12 at 9:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.