La corrélation croisée et la convolution sont étroitement liées. En bref, pour faire la convolution avec des FFT, vous
- touchez les signaux d’entrée (ajoutez des zéros à la fin de sorte qu’au moins la moitié de l’onde soit "vierge")
- prendre la FFT des deux signaux
- multiplier les résultats ensemble (multiplication élément par élément)
- faire la FFT inverse
conv(a, b) = ifft(fft(a_and_zeros) * fft(b_and_zeros))
Vous devez faire le remplissage à zéro car la méthode FFT est en fait une corrélation croisée circulaire , ce qui signifie que le signal est renvoyé aux extrémités. Vous ajoutez donc suffisamment de zéros pour supprimer le chevauchement, afin de simuler un signal nul à l'infini.
Pour obtenir une corrélation croisée au lieu d'une convolution, vous devez soit inverser dans le temps l'un des signaux avant d'effectuer la FFT, soit prendre le conjugué complexe de l'un des signaux après la FFT:
corr(a, b) = ifft(fft(a_and_zeros) * fft(b_and_zeros[reversed]))
corr(a, b) = ifft(fft(a_and_zeros) * conj(fft(b_and_zeros)))
selon ce qui est le plus facile avec votre matériel / logiciel. Pour l'autocorrélation (corrélation croisée d'un signal avec lui-même), il est préférable de faire le conjugué complexe, car il suffit alors de calculer la FFT une seule fois.
Si les signaux sont réels, vous pouvez utiliser de vraies FFT (RFFT / IRFFT) et économiser la moitié de votre temps de calcul en ne calculant que la moitié du spectre.
Vous pouvez également économiser du temps de calcul en utilisant une taille plus grande que celle pour laquelle la FFT est optimisée (par exemple, un nombre à 5 valeurs lisses pour FFTPACK, un nombre à 13 valeurs en douceur pour FFTW ou une puissance de 2 pour une implémentation matérielle simple).
Voici un exemple de corrélation FFT en Python comparée à la corrélation force brute: https://stackoverflow.com/a/1768140/125507
Cela vous donnera la fonction de corrélation croisée, qui est une mesure de la similarité par rapport au décalage. Pour obtenir le décalage auquel les ondes sont "alignées", il y aura un pic dans la fonction de corrélation:
La valeur x du pic est le décalage, qui peut être négatif ou positif.
J'ai seulement vu cela utilisé pour trouver le décalage entre deux vagues. Vous pouvez obtenir une estimation plus précise du décalage (meilleure que la résolution de vos échantillons) en utilisant une interpolation parabolique / quadratique sur le pic.
Pour obtenir une valeur de similarité comprise entre -1 et 1 (une valeur négative indiquant que l'un des signaux diminue à mesure que l'autre augmente), vous devez redimensionner l'amplitude en fonction de la longueur des entrées, de la longueur de la FFT, de votre implémentation FFT particulière. mise à l'échelle, etc. L'autocorrélation d'une onde avec elle-même vous donnera la valeur de correspondance maximale possible.
Notez que cela ne fonctionnera que sur les vagues qui ont la même forme. Si elles ont été échantillonnées sur un matériel différent ou si du bruit est ajouté, mais si elles ont toujours la même forme, cette comparaison fonctionnera, mais si la forme de l’onde a été modifiée par filtrage ou par décalage de phase, elle peut sembler identique, mais gagnée. ne pas corréler aussi bien.