2011-06-18 13 views
19

büyüklüğü ve bir Fourier faz F dönüşümü:Fourier faz ve büyüklüğünün Transform alma gibi tanımlanmıştır Matlab

Mag = sqrt(Real(F)^2 + Imaginary(F)^2) 

ve

Phase = arctan(Imaginary(F)/Real(F)) 

Ive alır Matlab kodu yazmak için çalışılmıştır gri tonlamalı görüntü matrisi, matris üzerinde fft2() işlevini gerçekleştirir ve sonra büyüklüğü ve fazı dönüştürmeden hesaplar. Daha sonra fourier dönüşümünün hayali ve gerçek kısımlarını hesaplamak istiyorum.

Real = Mag/sqrt(1 + tan(Phase)^2) 

ve

Imaginary = Real*tan(Phase) 

ve son olarak birleştirerek ve ters fft2:

F = Real + i*Imaginary 
image = ifft2(F) 

Ben aynı resmi görmek için beklediğiniz Bu içine ilk iki denklemler yeniden düzenleyerek yapılır Giriş, ama çöp alıyorum. Matematiklerim yanlış mı?

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; 

sayesinde çok :)

İşleviniz aynı anda iki şey sınamak için çalışıyor

cevap

19

: (1) FFT ve ters FFT bir görüntü ve (2) sökmek şöyle My matlab MFILE kodudur Karmaşık bir sayıyı gerçek ve hayali parçalara dönüştürür, genliğe ve faza dönüşür ve sonra tekrar bir araya getirir. Her şeyi bir kerede denemek ve neden işe yaramadığını merak etmek yerine, bu iki fonksiyonun her birini ayrı ayrı test etmelisiniz.

ifft(fft(image)) orijinal görüntüyü geri verip, sadece kaldırmak veya tüm karmaşık sayı manipülasyonlar yorum yapabilirsiniz test etmek için:

function y = forwardBackwardFFT(image) 

F = fft2(image); 
%# stuff removed 
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; 

Bu çalışır. Yani problem karmaşık sayı manipülasyonlarınızla. Faz = 0 veya faz = pi/2 olduğunda ne olduğunu düşünün. 0 tanjantı sıfırdır; ve tan (pi/2) sonsuzdur. İşte

çalışır bazı kod şudur:

mag = sqrt(real(F).^2 + imag(F).^2); 
phase = atan2(imag(F),real(F)); 

re = mag .* cos(phase); 
im = mag .* sin(phase); 
F = re + 1i*im; 

Sen çıkan ters-dönüştürülmüş görüntüyü göstermek için imagesc(abs(f)) yapmak zorunda kalacaktır, (nerdeyse sıfır) sanal bileşen kurtulmak için. Bu yardımcı olur

mag = abs(F); 
phase = angle(F); 

Hope:

karmaşık sayının büyüklüğünü ve faz almak için daha deyimsel yolu basitçe yapmaktır.

+0

ahh teşekkürler bir ton! bu harika. Atan (im./re) ile atan2 (im, re) arasındaki büyük fark nedir? Dün aynı tür bir şeyi denedim, re ve im'den mag, cos ve günah alıyorum, ama yine de bana çöp veriyordu. atan2() önerisi ile çalışır. Yine de bir ton teşekkürler :) –

+2

@Dave: Bkz. Http://en.wikipedia.org/wiki/Atan2#Motivation. –

+0

@nibot Üzgünüm, bir süre burada bulundum. kabul edilen cevap olarak seçtiniz –