在Matlab中使用傅里叶变换进行衍射

时间:2014-12-09 01:19:03

标签: matlab fft

我是Matlab的新手,正在尝试使用傅里叶变换实现以下菲涅耳衍射:

Equation from http://en.wikipedia.org/wiki/Fresnel_diffraction

这取自以下维基百科页面:http://en.wikipedia.org/wiki/Fresnel_diffraction

我正在尝试宽5厘米的方孔。

clc;clear;

lambda=1*10^-6;
w=.05;
z=2.0;
k=(2*pi)/lambda;

x1=linspace(-0.2,0.2,2048);
y1=linspace(-0.2,0.2,2048);

U1=((abs(x1)<=(w)/2))&((abs(y1)<=(w)/2));
u1=double(U1);

figure(1)
plot(x1,u1)

g=u1'*exp(1i*(pi/(lambda*z))*(x1.^2+y1.^2));
G=fftshift(fft2(g));

h=(exp(1i*k*z)/(1i*lambda*z))*exp(1i*(pi/(lambda*z))*(x1.^2+y1.^2));
H=fftshift(fft2(h));

u2=H*G;

figure(2)
plot(x1,abs(u2));

当我绘制场u2时,对于我尝试的任何距离z,它只是显示出一些随机图案而不是正方形光圈的预期衍射图案。

就像我说的那样,我对MATLAB很新,觉得很难理解。我认为我使它变得比它需要的更复杂,并且错误地实现了积分。

任何指针或建议?我很困惑......

谢谢!

1 个答案:

答案 0 :(得分:0)

看起来你想用这段代码模拟菲涅耳衍射。

通过一些更改,您可以查看实际图像。这里显示的是幅度。强度将是u2。* conj(u2)。

但请注意,对于您使用的物理参数,关键采样将远远超过2米,更像是100米。

此外,还需要在输出平面上进行一些额外的重新缩放。否则,对于低菲涅耳数,衍射图将变得非常小。

clc;clear;
N=1048;
L=0.4;
lambda=1*10^-6;
w=.05;
z=500.0;
k=(2*pi)/lambda;

src_delta = L/N;
critical_sampling_z = N*src_delta^2/lambda;

[x1 y1] = meshgrid((-N/2 : N/2-1) * src_delta);
X = double(abs(x1)<w/2);  Y = double(abs(y1)<w/2);
u1 = X.*Y;

figure(1);
colormap(gray); imagesc(mat2gray(u1));

g=u1'*exp(1i*(pi/(lambda*z))*(x1.^2+y1.^2));
G=fftshift(fft2(g));

h=(exp(1i*k*z)/(1i*lambda*z))*exp(1i*(pi/(lambda*z))*(x1.^2+y1.^2));
H=fftshift(fft2(h));
u2=H*G;

figure(2);
colormap(gray); imagesc(mat2gray(abs(u2)));