2014-01-07 10 views
4

나는 주어진 입력 필드 U0가 주어지면 프레 넬의 전파 (회절)를 실행한다고 가정하는 짧은 matlab 스크립트 파일을 작성하여 필드가 거리 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를 호출 한 후에는 중간에서 DC 주파수를하는 것도 fftshift를 호출이 두 비교.

그러나 ifft2을 호출하면이 함수는 여전히 DC 주파수가 (1,1)이라고 가정합니다. 따라서 역 FFT를 수행하기 전에이 형식으로 되돌아 가야합니다.

최종 줄을 U = ifft2(fftshift(O.*H))으로 변경하면 문제가 해결 될 수 있습니다. 난 그냥 matlab에 두 번 ifftshiftfftshift insteaf 후 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

관련 문제