圆孔矩孔的菲涅尔衍射模拟matlab实现 工程光学
工程光学综合练习?…圆孔、矩孔的菲涅尔衍射模拟
圆孑匕和矩孔的菲涅尔衍射模拟
由恵更斯?菲涅尔原理可知接收屏上的P点的复振幅可以表示为
E(P) = C0 g(Q)旳岁)K⑹do (1)
其中F(Q)为衍射屏上的复振幅分布,K(0)为倾斜因子。根据基尔霍夫对此公式的
完善,有
1
C = iA
1 + cosO
K(0) =—-—心1
设衍射屏上点的坐标为(x】,yj,接收屏上点的坐标为(x,y),衍射屏与接收屏间距离为“,当满足菲涅尔近似条件时,即
^3 [(兀—x l)2 +(7 —yi)2]max ? 71(2)
此时可得到菲涅尔衍射的计算公式
把上式指数项中的二次项展开,并改写成傅里叶变换的形式,可以写成
£(x,y)=半磐严唧[鲁(以 + y2)] f{£(syj exp 陰(好 + yf) | (4)
上式为菲涅尔衍射的傅里叶变换表达式,它表明除了积分号前面的一个与xl、yl无关的振幅和相位因子外,菲涅尔衍射的复振幅分布是孔径半面的复振幅分布和一个二次和位因子乘积的傅里叶变换。
相对于夫琅和费衍射而言,菲涅尔衍射的观察屏距衍射屏不太远。在菲涅尔衍射中,输入变最和输出变最分别为衍射孔径平面的光场分布和观察半面的光场以及光强分布,考虑到这三个星都是二维分布,而且Matlab主要应用于矩阵数值运算,所以本程序选择用二维矩阵來存储衍射孔径平而和观察平面的场分布,并分别以矩阵的列数和行数來对应平面的直角坐标值(x,y)以及(xi, yi)o
用MATLAB分别构造表示衍射屏和接收屏的二维矩阵。注意使两矩阵阶次相冋,考虑到运算氟的要求,釆样点数不能过多,所以每个屏的x和y方向各取200到300点进行运算。根据式(4),选取合适的衍射屏和接收屏尺寸和相距的孔菲涅尔衍射
XX 大学
XXXX
学院 图
2 (r=20mm)
距离,模拟结果如下:
取典型的He-Ne 激光器波长A=632.8nm,固定衍射屏和接收屏尺寸和相距 的距离,分别取不同的圆孔半径,得到以下三组衍射图样,其圆孔半径分别为 12mm, 20mm, 50mm
图 1 (r=12mm)
园礼形状 103
2C
D
253
vn 1 DO
2C0 30Q
衍射园澤
圆孔形状
3C0
293
2C0 im
50
100 2C0 300
壮射區存
2UJ -200
XX 大学XXXX 学院
图 4 (a=b=15mm)
三、矩孔的菲涅尔衍射
步骥与上述相同,仅需改变与衍射屏形状对应的矩阵。这里选择矩孔的长宽相等, 分别为15mm, 20mm, 30mm,其衍射图样及强度分布如图4. 5、6
桁射屏形状
300 250 200 150 100 50 100 200 300
衍射若的圉样 200 -200
图 3(r=50mm)
衍対图样
XX 大学XXXX 学院
衍射屛形状衍射后的图祥30D
250
200
150
10D
50
100 200 300
200
-200 -200
图5(a=b=20mm)
衍射屛形状衍対后的图样300
250
200
侦
100
60
100 200 300
1 -
-3J0 -200
图6(a=b=30mm)
XX 大学XXXX 学院
四、MATLAB 程序
%所仃长度单位为临米 lamda=632.8e-6;
k=2*pi/lamda;
z=1000000;
%先确定衍射屏
N=300;
%圆屏采样点数 a=lS;
b=15;
[m /n]=meshgrid(linspace(-N/2/N/2-l /N));
l=rect(m/(2*a)).*rect(n/(2*b));
A A %圆孔图像画在2行2列的第一个位豐 %画衍射屏的形状 %颜色以黑白区分
axis image titleC 衍射屏形状J L=300;
M=300;
%取相同点数用于矩阵运算 [x,y]=meshgrid(linspace(-L/2/L/2/M));
h=exp(j*k*z)*exp((j*k*(x.A 2+y.A 2))/(2*z))/(j*lamda*z);% 接收屏 H =fftshift(fft2(h));
B=fftshift(fft2(l));
G=H.*B;
U= fftshift(ifft2(G));
Br=(U/max(U)); subplot(222);
imshow(abs(U));
%圆孔频谱 %公式中为卷积,空间域中相卷相当于频域中相乘 %求逆变换,得到复振幅分布矩阵 %归一化
axis image;
colormap(hot)
% figurejmshow(C);
titleC 衍射后的图样J;
subplot(223);
mesh(x,y,abs(U));
% 画三维图形
subplot(2,2,4);
plot(abs(Br)) subplot(221);
imagesc(l) colormap([0 0 0; 111])