2014-01-07 47 views
4

我寫了一個簡短的matlab腳本文件,假設運行菲涅耳的傳播(衍射),使得給定一個輸入字段U0,它會告訴你該字段在距離z0後的樣子。我將結果與教科書結果進行了比較,看起來我的程序運行良好。問題是如果我嘗試採取兩個傳播步驟而不是一個。即,不是採用程序的單次迭代來傳播距離z0,而是採用程序的兩次迭代來傳播距離z0/2。然後我完全廢話,我無法弄清楚是什麼問題。任何建議都會以非常感謝的方式接受。 下面是代碼:菲涅耳衍射分兩步

function U = fresnel_advance (U0, dx, dy, z, lambda) 
% The function receives a field U0 at wavelength lambda 
% and returns the field U after distance z, using the Fresnel 
% approximation. dx, dy, are spatial resolution. 

k=2*pi/lambda; 
[ny, nx] = size(U0); 

Lx = dx * nx; 
Ly = dy * ny; 

dfx = 1./Lx; 
dfy = 1./Ly; 

u = ones(nx,1)*((1:nx)-nx/2)*dfx;  
v = ((1:ny)-ny/2)'*ones(1,ny)*dfy; 

O = fftshift(fft2(U0)); 

H = exp(1i*k*z).*exp(-1i*pi*lambda*z*(u.^2+v.^2)); 

U = ifft2(O.*H); 

回答

3

調用fft2後,還打電話fftshift有在中間的DC頻率。

但是,當您撥打ifft2時,該功能假定您仍然具有(1,1)處的DC頻率。所以在進行逆FFT之前,你必須回到這種格式。

因此,將最後一行改爲U = ifft2(fftshift(O.*H))可能會解決問題。

編輯

我剛剛看到Matlab的建議後fftshift insteaf兩次ifftshift使用ifftshift(找不到其所推出的版本)。根據文件,在奇數尺寸的情況下,調用ifftshift(fftshift(X))ifftshift(fftshift(X))的序列是不等價的。

所以我認爲最好是:U = ifft2(ifftshift(O.*H))在代碼的最後一步。

+0

非常感謝!果然,問題出在fftshift。現在它可以工作 – user1627734

2

這將是有益的,如果你可以張貼一些示例輸入你的程序說明問題。

我懷疑這個問題可能與您未調用FFTSHIFT足夠的次數有關。通常,人們認爲光場矩陣的中心位於「原點」上,其中FFT2考慮「左下角」。因此,您應該在FFT2之前以及之後FFTSHIFT。

你也需要爲IFFT2做同樣的事情。

編輯 爲理由把兩個呼叫FFTSHIFT:比較這兩個:

N = 512; [x,y] = meshgrid(-1:1/N:(N-1)/N); 
mask = (x.*x + y.*y) < 0.001; 
figure(1) 
imagesc(angle(fftshift(fft2(fftshift(mask))))) 
figure(2) 
imagesc(angle(fftshift(fft2(mask))) 
+0

不同意你的回答:在fft2之前調用'fftshift'是無稽之談。也許你想寫'ifft2'? – Bentoy13

+0

不知道我同意 - 我的意思是我說的,但也許我錯了。 – Edric

+0

fft之前'fftshift'的含義是什麼?它交換數據的空間部分。我不認爲這是你想要做的。如果你在'ifft2'之後也這樣做了,那麼,是的,你會得到好的結果......但是這兩個「外部」fftshift沒用。正如文檔所述,'fftshift'旨在用於頻繁的數據。 – Bentoy13