J'essaie de calculer une autocorrélation sur une plate-forme où la seule primitive accélérée dont je dispose est la (I) FFT. J'ai un problème cependant.
Je l'ai prototypé dans MATLAB . Je suis cependant légèrement confus. J'ai supposé que cela fonctionne simplement comme suit (c'est de mémoire donc excuses si je me trompe un peu).
autocorr = ifft( complex( abs( fft( inputData ) ), 0 ) )
Cependant, j'obtiens un résultat différent de celui obtenu en utilisant la xcorr
fonction. Maintenant, je m'attends à ne pas obtenir le côté gauche de la corrélation automatique (car c'est un reflet du côté droit et donc pas nécessaire de toute façon). Cependant, le problème est que mon côté droit semble être lui-même réfléchi autour de la mi-course. Ce qui signifie effectivement que j'obtiens environ la moitié de la quantité de données que j'attends.
Je suis donc sûr que je dois faire quelque chose de très simple, mais je n'arrive pas à comprendre quoi.
Réponses:
pichenettes a raison, bien sûr. La FFT implémente une convolution circulaire tandis que le xcorr () est basé sur une convolution linéaire. De plus, vous devez également ajuster la valeur absolue dans le domaine fréquentiel. Voici un extrait de code qui gère tout le remplissage, le décalage et la troncature zéro.
la source
la source
En bref: vous auriez dû le faire (pour être adapté à votre langage de programmation):
Ou dans MATLAB:
la source
La principale raison pour laquelle la sortie souhaitée de la fonction xcorr n'est pas similaire à celle de l'application des fonctions FFT et IFFT est que, tout en appliquant ces fonctions aux signaux, le résultat final est alambiqué de façon circulaire .
La principale différence entre la convolution linéaire et la convolution circulaire se trouve dans la convolution linéaire et circulaire .
Le problème peut être résolu en initialisant initialement le signal à zéro et en tronquant la sortie finale de l' IFFT .
la source