Détection des bpm du tambour dans un fichier .wav bruyant

12

Je recherche des algorithmes pour résoudre le problème suivant: Étant donné une capture sonore .wav bruyante (un peu de vent + bruit de frottement sur le microphone), comment détecter le BPM d'un battement de batterie doux?

J'ai tenté de googler le sujet, mais les résultats sont assez médiocres, en raison de la grande quantité de logiciels liés au mp3 pour l'analyse et la génération d'ID d'empreintes digitales. Aucun d'entre eux ne fournit d'informations sur la façon de le faire.

Je connais des algorithmes pour supprimer le bruit, mais cela me pose toujours le problème de la détection du BPM. Et selon la façon dont le problème de BPM est résolu, il est possible que je n'aie même pas besoin de débruiter (puisque le tambour a tendance à être dans les basses fréquences et le bruit dans les plus élevés, un simple passe-bas peut être un prétraitement suffisant).

Alex K
la source
1
Cela ressemble à mon problème de détection de ronflement .
Daniel R Hicks

Réponses:

13

Une méthode qui fonctionne s'il y a un rythme de batterie relativement fort consiste à prendre l'amplitude du STFT de la forme d'onde, puis à la corréler automatiquement uniquement dans la dimension temporelle. Le pic de la fonction d'auto-corrélation sera le battement, ou un sous-multiple de celui-ci.

Cela revient à décomposer le signal en plusieurs bandes de fréquences différentes, à trouver l'enveloppe d'amplitude de chacune, à auto-corréler chaque enveloppe, puis à les additionner. Le bruit et d'autres parties de la musique sont moyennés par l'opération de corrélation croisée.

En effet, les battements de tambour produisent un son de courte durée à de nombreuses fréquences (lignes verticales), tandis que d'autres parties de la musique ne durent qu'à quelques fréquences (lignes horizontales), et le bruit est de longue durée mais aléatoire à toutes les fréquences. Vous pouvez voir la répétition des battements si vous regardez un STFT:

entrez la description de l'image ici

Je suis venu avec ceci pour un projet d'école pour trouver une seule valeur de BPM pour des fichiers musicaux entiers, mais elle pourrait également être adaptée à un flux audio avec un BPM changeant. Vous auriez besoin de traiter des morceaux qui sont au moins deux fois plus longs que la période du BPM que vous recherchez.

endolith
la source
La FFT est une technique généralement utile pour trouver des signaux périodiques. Il peut y avoir un peu de ruse si le signal n'est pas aussi régulier que vous le souhaitez: un batteur pourrait accélérer ou ralentir au cours d'une chanson - délibérément ou non - et cela pourrait gâcher les résultats de la FFT dans le domaine fréquentiel.
Rethunk
1
@Rethunk: Si le BPM change au fil du temps, vous devrez le faire en morceaux et trouver le BPM pour chacun.
endolith
Notez que les battements sont généralement associés à la musique, et vous voyez également une autre partie de la musique sur cette image: des lignes horizontales, qui changent de hauteur au rythme. Il y a donc essentiellement trois contributions énergétiques: les battements (verticaux), les notes (horizontales) et le bruit (le reste).
MSalters du
@MSalters: Les notes peuvent également être corrélées
endolith
4

L'autocorrélation est certainement une bonne méthode de base pour cela. Il y a quelques choses que vous pouvez faire pour potentiellement améliorer cela:

  1. Si vous connaissez le spectre de fréquences de votre batterie, filtrez la bande passante afin que seules les fréquences pertinentes pour la batterie restent. Selon le tambour, cela peut être assez étroit et devrait éliminer la grande majorité du bruit.
  2. Ensuite, calculez l'enveloppe du domaine temporel du signal (le "pic avec perte" est le moyen le plus simple de le faire) avec une constante de temps qui correspond à peu près à la longueur des battements de tambour.
  3. Ensuite, faites l'auto-corrélation
Hilmar
la source