L'idée de l'autocorrélation est de fournir une mesure de similitude entre un signal et lui-même à un décalage donné. Il existe plusieurs façons de l'aborder, mais à des fins de détection de hauteur / tempo, vous pouvez le considérer comme une procédure de recherche. En d'autres termes, vous parcourez le signal échantillon par échantillon et effectuez une corrélation entre votre fenêtre de référence et la fenêtre décalée. La corrélation à "décalage 0" sera le maximum global car vous comparez la référence à une copie textuelle de lui-même. Au fur et à mesure que vous avancez, la corrélation diminuera nécessairement, mais dans le cas d'un signal périodique, à un moment donné, il recommencera à augmenter, puis atteindra un maximum local. La distance entre le "décalage 0" et ce premier pic vous donne une estimation de votre hauteur / tempo. La façon dont je '
Le calcul des corrélations échantillon par échantillon peut être très coûteux en calcul à des taux d'échantillonnage élevés, donc généralement une approche basée sur la FFT est utilisée. Prendre la FFT du segment d'intérêt, en la multipliant par son conjugué complexe , puis prendre la FFT inverse vous donnera l' autocorrélation cyclique . En code (en utilisant numpy ):
freqs = numpy.fft.rfft(signal)
autocorr = numpy.fft.irfft(freqs * numpy.conj(freqs))
L'effet sera de diminuer la quantité de bruit dans le signal (qui n'est pas corrélé avec lui-même) par rapport aux composantes périodiques (qui sont similaires à elles par définition). La répétition de l'autocorrélation (c'est-à-dire la multiplication conjuguée) avant d'effectuer la transformation inverse réduira encore plus le bruit. Prenons l'exemple d'une onde sinusoïdale mélangée à du bruit blanc. Le graphique suivant montre une onde sinusoïdale de 440 Hz, la même onde sinusoïdale «corrompue» par le bruit, l'autocorrélation cyclique de l'onde bruyante et la double autocorrélation cyclique:
Notez comment le premier pic des deux signaux d'autocorrélation est situé exactement à la fin du premier cycle du signal d'origine. C'est le pic que vous recherchez afin de déterminer la périodicité (pitch dans ce cas). Le premier signal d'autocorrélation est encore un peu "ondulé", donc pour effectuer une détection de crête, une sorte de lissage serait nécessaire. L'autocorrélation deux fois dans le domaine fréquentiel accomplit la même chose (et est relativement rapide). Notez que par "ondulé", je veux dire à quoi ressemble le signal lorsqu'il est agrandi, pas le creux qui se produit au centre de l'intrigue. La seconde moitié de l'autocorrélation cyclique sera toujours l'image miroir de la première moitié, de sorte que ce type de "creux" est typique. Juste pour être clair sur l'algorithme, voici à quoi ressemblerait le code:
freqs = numpy.fft.rfft(signal)
auto1 = freqs * numpy.conj(freqs)
auto2 = auto1 * numpy.conj(auto1)
result = numpy.fft.irfft(auto2)
La nécessité de faire plus d'une autocorrélation dépend de la quantité de bruit dans le signal.
Bien sûr, il existe de nombreuses variations subtiles sur cette idée, et je ne vais pas entrer dans tous ici. La couverture la plus complète que j'ai vue (dans le contexte de la détection de hauteur) est dans le traitement numérique des signaux vocaux par Rabiner et Schafer.
Maintenant, pour savoir si l'autocorrélation sera suffisante pour la détection du tempo. La réponse est oui et non. Vous pouvez obtenir des informations de tempo (en fonction du signal source), mais il peut être difficile de comprendre ce que cela signifie dans tous les cas. Par exemple, voici un tracé de deux boucles d'un breakbeat, suivi d'un tracé de l'autocorrélation cyclique de la séquence entière:
Pour référence, voici l'audio correspondant:
Effectivement, il y a un joli pic en plein milieu correspondant au point de boucle, mais cela venait du traitement d'un segment assez long. En plus de cela, s'il ne s'agissait pas d'une copie exacte (par exemple, s'il y avait de l'instrumentation), ce pic ne serait pas aussi propre. L'autocorrélation sera certainement utile dans la détection du tempo, mais elle ne sera probablement pas suffisante en elle-même pour un matériel source complexe. Par exemple, même si vous trouvez un pic, comment savez-vous s'il s'agit d'une pleine mesure, ou d'une noire, d'une demi-note ou autre chose? Dans ce cas, il est assez clair qu'il s'agit d'une mesure complète, mais ce ne sera pas toujours le cas. Je suggère de jouer avec l'utilisation de l'AC sur des signaux plus simples jusqu'à ce que le fonctionnement interne devienne clair, puis de poser une autre question sur la détection du tempo en général (car c'est un "plus grand"