我是Matlab的新手,正在尝试使用傅里叶变换实现以下菲涅耳衍射:
这取自以下维基百科页面: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很新,觉得很难理解。我认为我使它变得比它需要的更复杂,并且错误地实现了积分。
任何指针或建议?我很困惑......
谢谢!
答案 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)));