Autocorrélation dans l'analyse audio


11

Je lis sur l' autocorrélation , mais je ne suis pas sûr de comprendre exactement comment cela fonctionne et à quelle sortie je dois m'attendre. Ai-je raison de penser que je devrais entrer mon signal dans la fonction AC et avoir une entrée de fenêtre coulissante. Chaque fenêtre (de 1024 échantillons, par exemple) produirait un coefficient compris entre -1 et 1. Le signe indique simplement si la ligne est ascendante ou descendante et la valeur indique la force de la corrélation. Pour simplifier, disons que je n'ai pas de chevauchement et déplacez simplement la fenêtre 1024 échantillons à chaque fois. Dans un échantillon de 44100, aurais-je 43 coefficients et dois-je les conserver tous?

Disons que j'exécute ceci pour un signal de 200 secondes, me donnant 8600 coefficients. Comment utiliser ces coefficients pour détecter la répétition et, à son tour, le tempo? Dois-je créer une sorte de réseau de neurones pour les regrouper, ou est-ce exagéré?

Merci pour toute aide.


4
1024x[1],x[2],,x[1024]i=11024(x[i])21024R[k]R[k]=i=11024kx[i]x[i+k]1024R[k]R[k]=i=11024kx[i]x[i+k]+i=1kx[1024k+i]x[i]

Salut Dilip, merci pour l'aide. Je n'ai pas encore implémenté la fonction AC, j'essaie simplement de me familiariser avec la théorie en premier. La première équation semble être la plus simple, mais les données devraient-elles être normalisées au préalable?
XSL

1
Voici un exemple: gist.github.com/255291#L62
endolith

Réponses:


23

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:

Autocorrélation

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:

Autocorrélation Breakbeat

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"


2
Attendez, est-ce que l'autocorrélation du signal audio lui-même? Ce n'est certainement pas très utile pour la détection du tempo, sauf pour les boucles numériques. L'autocorrélation de certaines enveloppes RMS devrait fonctionner beaucoup mieux en général, de préférence pour plusieurs bandes de fréquences séparément.
leftaroundabout

1
L'autocorrélation du STFT dans le sens du temps fonctionne plutôt bien, tant que la musique a une sorte de rythme. Cela revient essentiellement à exécuter l'autocorrélation de nombreuses bandes de fréquences, puis à les additionner.
endolith

2
@leftroundabout À droite, il y a un certain nombre de choses qui devraient être faites pour la détection du tempo (pré, post-traitement) en plus de l'autocorrélation en elle-même. Je réponds principalement à la première phrase de la question du PO (c'est-à-dire "comment fonctionne l'autocorrélation"), puis lui suggère de poser une autre question sur la détection du tempo, car d'autres processus seront impliqués.
datageist

@endolith que voulez-vous dire ici Autocorrelation of the STFT in the time direction? Plus précisément, la partie de la direction du temps
popctrl

1
@popctrl Signification pour calculer l'autocorrélation de chaque ligne de la STFT
endolith

3

On dirait que vous souhaitez utiliser l'autocorrélation pour effectuer une détection de battement. Vous pouvez le faire, mais je vous suggère de sous-échantillonner massivement votre audio. Vous recherchez un signal entre 1 et 3 Hz (60 bpm à 180 bpm), vous n'avez donc pas besoin ou ne voulez pas de résolution 44100 hz. Une autocorrélation correctement calculée et normalisée est de 1,0 au décalage 0 (le signal est parfaitement corrélé avec lui-même). Pour un signal périodique, le courant alternatif tombe en dessous de zéro, puis revient dans un pic au décalage correspondant à la fréquence fondamentale, avec des crêtes plus petites aux harmoniques. Vous devez choisir une plage raisonnable dans laquelle rechercher ce pic. Pour le bruit, l'autocorrélation diminue et essentiellement des lignes plates dans des gribouillis autour de zéro. En règle générale, si vous avez un pic> 0,5 dans le courant alternatif normalisé, vous avez un signal périodique.


1

L'autocorrélation est simplement la corrélation croisée d'un signal avec lui-même. Un moyen simple de le calculer consiste à effectuer une convolution entre le signal d'origine et une version inversée du signal. Si vous avez un signal de 1 000 échantillons, sa corrélation automatique comporte 1999 (2 * N-1) échantillons non nuls. Seuls 1000 de ces échantillons sont uniques car l'auto-corrélation (pour un signal réel) est toujours symétrique dans le temps, c'est-à-dire ac [n] = ac [-n].

Les signaux continus doivent être décomposés en segments finis. C'est similaire à la transformée de Fourier: techniquement, vous devez intégrer de -inf à + inf mais la décomposer en segments (avec chevauchement et / ou fenêtrage selon les besoins) donne également des résultats utiles. Le choix de la longueur, de la forme et du chevauchement des fenêtres dépend de l'application.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.