Ich versuche, eine Autokorrelation auf einer Plattform zu berechnen, auf der das einzige verfügbare beschleunigte Grundelement die (I) FFT ist. Ich habe allerdings ein Problem.
Ich habe es in MATLAB als Prototyp erstellt . Ich bin jedoch etwas verwirrt. Ich nahm an, dass es einfach wie folgt funktioniert (dies ist aus dem Gedächtnis, also entschuldige, wenn ich es etwas falsch verstanden habe).
autocorr = ifft( complex( abs( fft( inputData ) ), 0 ) )
Ich erhalte jedoch ein anderes Ergebnis als bei Verwendung der xcorr
Funktion. Jetzt erwarte ich, dass die Autokorrelation nicht auf der linken Seite angezeigt wird (da sie die rechte Seite widerspiegelt und daher ohnehin nicht benötigt wird). Das Problem ist jedoch, dass meine rechte Seite sich auf halber Strecke zu widerspiegeln scheint. Das bedeutet, dass ich ungefähr die Hälfte der erwarteten Datenmenge erhalte.
Ich bin mir also sicher, dass ich etwas sehr Einfaches falsch mache, aber ich kann einfach nicht herausfinden, was.
Antworten:
pichenettes hat natürlich recht. Die FFT implementiert eine Kreisfaltung, während xcorr () auf einer linearen Faltung basiert. Außerdem müssen Sie den Absolutwert auch im Frequenzbereich quadrieren. Hier ist ein Code-Snippet, das das Auffüllen, Verschieben und Abschneiden von Nullen übernimmt.
quelle
quelle
Eine andere Möglichkeit, dies zu sehen, besteht darin, zu analysieren, was passiert, wenn Sie die DFT einrechnenN 2 N- 1 N
Kurz gesagt: Sie sollten dies getan haben (um an Ihre Programmiersprache angepasst zu werden):
Oder in MATLAB:
quelle
Der Hauptgrund für die gewünschte Ausgabe von xcorr- Funktion nicht derjenigen der Anwendung der FFT- und IFFT- Funktion ähnlich ist, besteht darin, dass beim Anwenden dieser Funktion auf Signale das Endergebnis kreisförmig verschlungen ist .
Der Hauptunterschied zwischen linearer und kreisförmiger Faltung besteht in linearer und kreisförmiger Faltung .
Das Problem kann zunächst durch gelöst werden Zero-Padding des Signals und die endgültige Ausgabe von Kürzen IFFT .
quelle