Ich habe Probleme beim Identifizieren der Frequenzkomponenten eines Bildes.
Hier habe ich einfach eine 256×256-Binärdatei generiert. Bild.
a = [zeros(256,128) ones(256,128)]; imshow(a);
Nehmen Sie die Bild-FFT und verschieben Sie sie Wenn die Nullfrequenz zur Mitte
f = fft2(a) shft = fftshift(f); imshow(log(shft)) %stretching
lautet,
Wie identifiziere ich, wie viele Frequenzkomponenten es gibt und welche Frequenzen gibt es?
Auch wenn ich die FFT einer 1-D-Sequenz berechne und diese Sequenz zeichne bestimmte negative Werte, was bedeutet das? Wie kann es negative Frequenzen geben?
Kommentare
- Verwandte (mögliche Duplikate): dsp. stackexchange.com/q/1637/77
- Eine der besten Möglichkeiten, um zu verstehen, was eine Transformation bewirkt, besteht darin, mit der inversen Transformation zu experimentieren. Zeichnen Sie einen Punkt und transformieren Sie ihn dann invers, um die Wellen zu sehen, die er erzeugt. Versuchen Sie dann einen Punkt an einer anderen Stelle, dann eine Linie usw. Informationen zu negativen Frequenzen finden Sie unter dsp.stackexchange.com/q/431/29
Antwort
Wie kann es zu negativen Frequenzen kommen?
Die FFT-Koeffizienten sind keine Frequenzen, sondern komplexe Amplituden. Der Modul des Koeffizienten gibt die Amplitude an, das Argument des Koeffizienten gibt die Phase an.
Beachten Sie, dass Sie von Matlab eine Warn- oder Fehlermeldung zur Berechnung von log(shft)
, da shft eine komplexe Matrix ist, ist das Ergebnis nicht real und kann nicht als Bild dargestellt werden.
Kommentare
- Alles, was Sie sagen ist wahr, aber es ist auch eine Umgehung der Frage. Die Hälfte der Koeffizienten kann so interpretiert werden, dass sie negativen Frequenzen entsprechen.
Antwort
Mein erster Vorschlag ist, dass Sie Verstehen Sie die FFT in einer Dimension, bevor Sie versuchen, die Ergebnisse in 2D zu interpretieren.
Die diskrete Fourier-Transformation (FFT ist eine Implementierung der DFT) ist eine komplexe Transformation: Sie transformiert zwischen 2 Vektoren komplexe Vektoren der Größe N.
Im 1D-Fall erhalten Sie also nicht nur negative Werte, sondern im Allgemeinen komplexe Werte.
Gleiches gilt für 2D. Die imshow-Funktion nimmt wahrscheinlich den Realteil der komplexen Matrix ein (dies ist in der imshow-Dokumentation nicht klar).
Antwort
Ihnen fehlt der Befehl abs
.
Versuchen Sie Folgendes:
f = fft2(a) shft = fftshift(abs(f)); imshow(log(shft)) %stretching