在光的干涉和衍射中,我们常见的例子都是基于已知的光强公式,像本专栏前几篇文章中提到的双缝干涉、单缝衍射、牛顿环等。
对于二维的光的衍射,在很多情况下难以写出具体的光强表达式,更不能用之前的方式表示出光强的分布,这时,我们可以选择运用傅里叶光学的计算方式,得到光经过衍射后的分布情况。
傅里叶光学的具体内容可以参考吕乃光《傅里叶光学》一书。
在matlab中,给出了对应的函数来解决仿真问题。
fft2()函数,进行二维的DFT运算,使用快速傅里叶变换算法返回矩阵的二维傅里叶变换,等同于计算:
%fft(fft(X).').'
如果输入的矩阵 X 是一个多维数组,fft2 将采用高于 2 的每个维度的二维变换。
另一个可能用到的函数是fftshift()(将零频分量移到频谱中心)
官方的解释为:此 MATLAB 函数 通过将零频分量移动到数组中心,重新排列傅里叶变换 X。
这是因为fft2()函数在计算时,常常将中心的索引位置放置在角落中,这样最大强度的放置位置不在中心,需要搭配fftshift()函数来调整。
我们可以在下面的仿真中看到这个过程。
这里举两个例子,分别仿真方形孔和圆孔的衍射,代码如下:
clear;
x = (-2:0.05:2);
y = (-2:0.05:2);
A = y.'*x;
i1 = 0;
for a = -2:0.05:2
j1 = 0;
i1 = i1+1;
for b = -2:0.05:2
j1 = j1+1;
if abs(a) <= 0.1 & abs(b) <= 0.2
A(i1,j1) = 1;
else
A(i1,j1) = 0;
end
end
end
subplot(1,2,1)
imshow(A)
title('方形孔径');
fft_v = abs(fft2(A));
fft_v = fftshift(fft_v);
subplot(1,2,2)
imshow(fft_v/max(max(fft_v)))
title('方形孔径的傅里叶变换')
结果:
当我们将fftshift()函数注释掉,观察发生的变化:
%fft_v = fftshift(fft_v);
结果:
可以看出,此时光强的最大值默认在角落。
对圆形孔径的仿真如下:
clear;
x = (-2:0.05:2);
y = (-2:0.05:2);
A = y.'*x;
i1 = 0;
for a = -2:0.05:2
j1 = 0;
i1 = i1+1;
for b = -2:0.05:2
j1 = j1+1;
r = sqrt(a^2+b^2);
if r <= 0.2
A(i1,j1) = 1;
else
A(i1,j1) = 0;
end
end
end
subplot(1,2,1)
mesh(x,y,A);
xlabel('x')
ylabel('y')
zlabel('E')
title('圆形孔径');
fft_v = abs(fft2(A));
fft_v = fftshift(fft_v);
subplot(1,2,2)
mesh(x,y,fft_v);
title('圆形孔径的傅里叶变换')
xlabel('fx')
ylabel('fy')
zlabel('E')
结果:
可以看出,运用傅里叶光学的计算方式,我们可以计算任意结构的傅里叶变换,并得到衍射结果。
整体的仿真步骤可以概括为以下几步:
首先,确定将要仿真的二维图形,并将他用0和1表示出来,其中1表示可以通光的部分;
其次,将对应矩阵输入fft2()函数,得到的结果输入fftshift()函数将强度的最大值置于中心;
最后,根据想要的图形(二维或三维,灰度图或彩色图)设置输出。文章来源:https://www.toymoban.com/news/detail-720500.html
来源:《高等光学仿真——光波导、激光》文章来源地址https://www.toymoban.com/news/detail-720500.html
到了这里,关于MATLAB仿真光的衍射(七)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!