2011-06-18 26 views
19

Độ lớn và giai đoạn của một Fourier transform F được định nghĩa là:Bắt Fourier Transform từ pha và Magnitude - Matlab

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

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

Ive đã cố gắng để viết mã MATLAB mà mất trong một ma trận hình ảnh thang độ xám, thực hiện fft2() trên ma trận và sau đó tính toán độ lớn và pha từ phép biến đổi. Sau đó tôi muốn tính toán các phần ảo và thực của biến đổi fourier. Này được thực hiện bằng cách sắp xếp lại hai phương trình đầu tiên vào:

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

Imaginary = Real*tan(Phase) 

và cuối cùng kết hợp và fft2 nghịch đảo:

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

tôi mong đợi để xem hình ảnh tương tự như đầu vào, nhưng tôi nhận được rác. Toán học của tôi có sai không? đang mfile matlab của tôi là như sau:

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; 

thanks a lot :)

Trả lời

19

Chức năng của bạn đang cố gắng để kiểm tra hai việc cùng một lúc: (1) FFT và FFT ngược một hình ảnh, và (2) tháo rời một số phức tạp thành các phần thực và ảo, chuyển thành biên độ và pha, rồi đặt nó lại với nhau một lần nữa. Thay vì cố gắng toàn bộ điều đó cùng một lúc và tự hỏi tại sao nó không hoạt động, bạn nên kiểm tra từng chức năng này một cách riêng biệt.

Để kiểm tra xem ifft(fft(image)) cho trở lại ảnh gốc, bạn chỉ có thể loại bỏ hoặc nhận xét ra tất cả các thao tác phức tạp số:

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; 

này hoạt động. Vì vậy, vấn đề là với thao tác số phức tạp của bạn. Xem xét điều gì xảy ra khi pha = 0 hoặc pha = pi/2. Tiếp tuyến của 0 là 0, dẫn đến một phân chia bằng 0; và tan (pi/2) là vô hạn.

Dưới đây là một số mã mà làm việc:

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; 

Bạn sẽ phải làm imagesc(abs(f)) để hiển thị các kết quả hình ảnh nghịch chuyển, để thoát khỏi một (gần zero) thành phần tưởng tượng.

Một cách thành ngữ hơn để có được cường độ và giai đoạn của một số phức là chỉ cần làm:

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

Hope this helps.

+0

ahh cảm ơn một tấn! thats awesome. Sự khác biệt lớn giữa atan (im./re) và atan2 (im, re) là gì? Hôm qua tôi đã cố gắng cùng một loại điều, nhận lại và im từ mag và cos và tội lỗi, nhưng nó vẫn cho tôi thùng rác. với đề xuất của bạn về atan2(), nó hoạt động. Cảm ơn một tấn mặc dù :) –

+2

@Dave: Xem http://en.wikipedia.org/wiki/Atan2#Motivation. –

+0

@ nibot xin lỗi người đàn ông, havent đã ở đây trong một thời gian. chỉ cần chọn nó làm câu trả lời được chấp nhận –