function diffraction_cross()
%规定
%0代表物平面的参数
%1代表菲涅耳解析DFFT
%物函数的抽样点数
distance=input('输入观察屏到衍射屏的距离,单位mm');%=100000;%观察屏到衍射屏的距离,单位mm
length=10; %衍射屏宽度,单位mm
L=distance+200%单位mm
A=1
lambda=0.00063;%波长,单位mm
N0=N_object(length);%求解物函数的采样点的函数
N1=40/distance;%length^2/(lambda*distance);%N>=
%N2=40/diatance;%length^2/(lambda*distance);%N<=
%十字叉丝衍射的数值模拟
choice=0;
if N0>=N1
N=N0;
U=Frensel_SFFT(length,distance,lambda,N);
else
N=N0;
U=Frensel_DFFT_S(length,distance,lambda,N)
end
U=abs(U);
U=U.^2;
U=fftshift(U);
%归一化
%U=U/max(max(U));
imshow(U);
subplot(1,2,1)
imshow(U);
title(distance)
subplot(1,2,2)
plot(U((N0^2/2):(N0*(N0+2)/2)));
%物平面的图像
function N=N_object(length)
for i=10
N=2^i;
U=Object(length,N);
U=fftshift(fft2(U));
U=abs(U);
eps=U(N,N)/max(max(U));
if eps<10^-4
break;
end
end
function U0=Object(length,N)%带十字叉的圆孔
U0=ones(N,N);
dx=length/N;
for x=1:N
for y=1:N
if abs((x-N/2)^2+(y-N/2)^2)>2.5^2
U0(x,y)=0;
end
end
end
%一次傅里叶变换的菲涅耳衍射积分的数值模拟
function U=Frensel_SFFT(length,distance,lambda,N)
U=Object(length,N);
k=2*pi/lambda;
L=distance+200;
A=1;
for m=1:N
for n=1:N
U(m,n)=U(m,n)*exp(i*pi*length*length*((m-N/2)^2+(n-N/2)^2)/lambda/distance/N/N);
end
end
U=fftshift(fft2(U));
D=distance/100-1;
k=2*pi/lambda;
temp=exp(i*k*L)/i*lambda*distance
for m=1:N
for n=1:N
U(m,n)=temp*U(m,n)*exp(i*pi*lambda*distance*D/(length*length)*((m-N/2)^2+(n-N/2)^2));
end
end
%数值传递函数的菲涅耳衍射积分公式的数值模拟
function U=Frensel_DFFT_S(length,distance,lambda,N)
U=Object(length,N);%fftshift(fft2(U));
U=fftshift(fft2(U));
L=distance+200;
%dl=1/length;
k=2*pi/lambda;
%tenpe=exp(i*k*L)
for m=1:N
for n=1:N
U(m,n)=exp(i*k*L)*U(m,n)*exp(-i*pi*lambda*distance/(length*length)*((m-N/2)^2+(n-N/2)^2));
end
end
U=fftshift(ifft2(U)); %U=fftshift(fft2(U));
dx0=length/N;%dy0=length/N;
for m=1:N
for n=1:N
U(m,n)=U(m,n)*exp(i*pi*0.01/lambda*dx0^2*((m-N/2)^2+(n-N/2)^2));
end
end
评论1