Fourier-Transformation von Phase und Größe erhalten - Matlab
Betrag und phase der fourier-Transformation F sind definiert als:
Mag = sqrt(Real(F)^2 + Imaginary(F)^2)
und
Phase = arctan(Imaginary(F)/Real(F))
Ive versucht, zu schreiben, matlab-code, der nimmt in ein Graustufen-Bild-matrix, führt fft2() auf die matrix und berechnet dann die Größe und phase von der Transformation. Ich habe dann wünschen zur Berechnung der imaginären und realen Teile der fourier-Transformation. Dies geschieht durch umstellen der ersten beiden Gleichungen in:
Real = Mag/sqrt(1 + tan(Phase)^2)
und
Imaginary = Real*tan(Phase)
und schließlich die Kombination und inverse fft2:
F = Real + i*Imaginary
image = ifft2(F)
Ich erwarten würde, zu sehen das gleiche Bild wie der Eingang, jedoch bekomme ich Müll. Ist mein Mathe falsch? Meine matlab mfile-code ist wie folgt:
function y = forwardBackwardFFT(image)
F = fft2(image);
mag = sqrt(real(F).^2 + imag(F).^2);
phase = atan(imag(F)./real(F));
re = sqrt((mag.^2)./(1 + tan(phase).^2));
im = re.*tan(phase);
F = re + i*im;
f = ifft2(F);
subplot(1,2,1);
imshow(image);
Title('Original Image');
subplot(1,2,2);
imshow(f);
Title('Image after forward and backward FFT');
y = f;
vielen Dank 🙂
InformationsquelleAutor der Frage Dave Anderson | 2011-06-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Funktion zu testen versucht, zwei Dinge gleichzeitig: (1) die FFT und inverse FFT ein Bild, und (2) zerlegen einer komplexen Zahl in real-und Imaginärteil, zu transformieren, um amplitude und phase, und dann setzte es wieder zusammen. Anstatt zu versuchen, die ganze Sache auf einmal und Frage mich, warum es nicht funktioniert, sollten Sie testen, jeder der diese beiden Funktionen getrennt.
Um zu testen, ob
ifft(fft(image))
gibt wieder das ursprüngliche Bild, können Sie einfach entfernen, oder kommentieren Sie alle komplexen Zahl Manipulationen:Diese funktioniert. Also das problem ist mit Ihrer komplexen Zahl Manipulationen. Überlegen Sie, was passiert, wenn phase=0 oder phase=pi/2. Die Tangente von 0 ist 0, was zu einer division durch null;) und tan(pi/2) ist unendlich.
Hier ist etwas code, der funktioniert:
Haben Sie zu tun
imagesc(abs(f))
um zu zeigen, dass die resultierende inverse transformierte Bild, um loszuwerden, ein (fast null) imaginäre Komponente.Mehr idiomatischer Weg ist, um die Amplitude und phase einer komplexen Zahl ist einfach:
Hoffe, das hilft.
InformationsquelleAutor der Antwort nibot