43 votes

Battements par minute de l'entrée audio en temps réel

Je voudrais écrire une simple application en C# pour surveiller la ligne d'audio et de me donner le courant (enfin, la moyenne mobile) battements par minute.

J'ai vu ce gamedev l'article, et qui est absolument d'aucune aide. Je suis passé par la et a essayé de mettre en œuvre ce qu'il faisait, mais il n'était tout simplement pas de travail.

Je sais il y a des tonnes de solutions pour cela, parce que beaucoup de logiciel DJ t-il, mais je ne suis pas du tout avoir la chance de trouver un open-source de la bibliothèque ou des instructions sur le faire moi-même.

27voto

Hallgrim Points 7198

Calculer une powerspectrum avec une fenêtre coulissante de la FFT: Prendre 1024 échantillons:

double[] signal = stream.Take(1024);

Nourrir à un algorithme de FFT:

double[] real = new double[signal.Length];
double[] imag = new double[signal.Length);
FFT(signal, out real, out imag);

Vous obtiendrez une partie réelle et une partie imaginaire. Ne jetez PAS la partie imaginaire. Faire de même pour la partie réelle, comme l'imaginaire. S'il est vrai que la partie imaginaire est pi / 2 de phase avec le réel, elle contient encore 50% de l'information de spectre.

EDIT:

Calcul de la puissance, par opposition à l'amplitude de sorte que vous avez un nombre élevé quand il est fort et proche de zéro quand il est calme:

for (i=0; i < real.Length; i++) real[i] = real[i] * real[i];

De même pour la partie imaginaire.

for (i=0; i < imag.Length; i++) imag[i] = imag[i] * imag[i];

Maintenant, vous avez un spectre de puissance pour la dernière 1024 échantillons. Où la première partie du spectre, on trouve les basses fréquences et la dernière partie du spectre est la haute les fréquences.

Si vous voulez trouver le BPM de la musique populaire, vous devriez probablement se concentrer sur la basse. Vous pouvez vous procurer la basse intensité par la somme de la partie inférieure du spectre de puissance. Les nombres qui dépend de la fréquence d'échantillonnage:

double bassIntensity = 0;
for (i=8; i < 96; i++) bassIntensity += real[i];

Maintenant faites la même chose de nouveau, mais à déplacer la fenêtre de 256 échantillons avant de calculer un nouveau spectre. Maintenant, vous avez le calcul de la bassIntensity pour tous les 256 échantillons.

C'est une bonne entrée pour votre analyse de BPM. Quand la basse est calme, vous n'avez pas de battre et quand il est la voix, vous avez un battement.

Bonne chance!

15voto

Nick Johnson Points 79909

Il y a un super projet qui s'appelle la Danse des Singes, qui, sur le plan procédural génère DDR pas de danse de la musique. Une grande partie de ce qu'il fait est basé sur (forcément très précis) analyse de la fréquence et de leur document de projet va dans les détails décrivant les différentes battre des algorithmes de détection et de leur adéquation à la tâche. Ils incluent des références à l'origine des documents pour chacun des algorithmes. Ils ont également publié le code matlab pour leur solution. Je suis sûr qu'entre ces vous pouvez trouver ce dont vous avez besoin.

Tout est disponible ici: http://monket.net/dancing-monkeys-v2/Main_Page

8voto

Dan Harper Points 691

Non pas que j'ai une idée de comment le mettre en œuvre, mais à partir de l'audio d'un point de vue technique, vous aurez besoin de filtre en premier. Bass drum hits serais le premier à le vérifier. Un filtre passe-bas qui vous donne quelque chose en vertu d'environ 200 hz devrait vous donner une idée assez claire de la grosse caisse. Une porte peut également être nécessaire pour le nettoyage de tout désordre dans d'autres instruments harmoniques basse.

La prochaine à vérifier serait de caisse claire de la frappe. Vous devez EQ celui-ci. La "fissure" de l'un piège est autour de 1,5 kHz à partir de la mémoire, mais vous devez certainement porte de celui-ci.

Le prochain défi serait de travailler sur un algorithme de funky beats. Comment voulez-vous par programmation à trouver le temps 1? Je suppose que vous auriez à garder une trace de la précédente beats et de l'utilisation d'un filtrage quelque chose-ou-autres. Donc, vous auriez probablement besoin d'un peu de bars à trouver exactement la battre. Ensuite, il y a des problèmes de timing comme 4/4, 3/4, 6/8, wow, je ne peux pas imaginer ce qui serait nécessaire pour ce faire avec précision! Je suis sûr que ce serait la peine de l'argent grave de matériel audio/les entreprises de logiciels.

7voto

Led Points 719

2 noms:

Eric D. Scheirer
Masataka Goto

Google eux, ils ont beaucoup écrit sur la détection de battement (temps réel et hors ligne). Matériel très intéressant.

Aussi, en tant que note de bas de page, je pense qu'en plus de la détection de battement, vous pourriez être intéressé par la prédiction de battement.

6voto

Thomas Points 63635

Ce n'est pas un problème facile. Je vais essayer de vous donner qu'un aperçu.

Ce que vous pourriez faire est quelque chose comme ce qui suit:

  1. Calculer la moyenne (root-mean-square) intensité du signal sur des blocs de, disons, 5 millisecondes. (N'ayant jamais fait cela avant, je ne sais pas ce qu'est un bon bloc de taille serait.)
  2. Prendre la transformée de Fourier de la "bloqué" le signal, à l'aide de l'algorithme de FFT.
  3. Trouver le composant dans la transformation du signal qui a la plus grande ampleur.

Une transformée de Fourier est essentiellement un moyen de calcul de la force de toutes les fréquences présentes dans le signal. Si vous n'avez que plus de la "bloqué" le signal, la fréquence de la pulsation, nous l'espérons être le plus fort.

Peut-être vous avez besoin d'appliquer un filtre tout d'abord, pour se concentrer sur des fréquences spécifiques (comme la basse) qui contiennent généralement le plus d'informations sur le BPM.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X