MATLAB夫琅禾费衍射强度图仿真 圆孔,圆环,矩形孔可定制。

光学实验课最劝退的环节是什么?调光路必须排前三。不过有了MATLAB,咱们可以直接用代码玩转衍射花样。今天手把手教大家用20行代码生成可定制的夫琅禾费衍射强度图,圆孔圆环矩形孔随便换!

先上核心代码框架:

`matlab

lambda = 632.8e-9; % 波长(红激光)

k = 2*pi/lambda;

d = 2e-3; % 孔径尺寸

z = 1; % 观测屏距离

[X,Y] = meshgrid(linspace(-d/2,d/2,512));

`

这波meshgrid操作生成512x512的采样网格,d控制孔径实际尺寸。比如做硬币孔衍射,把d设为硬币直径就行。

圆孔生成器

`matlab

% 圆孔mask

R = d/2; % 孔径半径

aperture = (X.^2 + Y.^2) <= R^2;

`

判断网格点到原点距离是否小于半径,直接生成二值化圆孔。想改孔径大小?调R参数就像拧水龙头一样简单。

环形孔进阶版

`matlab

inner_R = 0.8*R; % 内环半径

MATLAB夫琅禾费衍射强度图仿真 圆孔,圆环,矩形孔可定制。

ringaperture = ((X.^2 + Y.2) <= R^2) & ((X.^2 + Y.^2) > innerR^2);

`

两个圆相减得到环状结构,0.8这个系数控制环的粗细。改成0.5秒变甜甜圈衍射(物理系的同学别打我)。

矩形强迫症福利

`matlab

a = 1e-3; % 长边

b = 0.5e-3; % 短边

rect_aperture = (abs(X) <= a/2) & (abs(Y) <= b/2);

`

绝对值的判断比乘方运算更高效,特别适合需要大量计算的场景。调整a/b比例可以得到从细缝到方块的连续变化。

核心计算部分:

`matlab

U = fftshift(fft2(aperture)); % 二维傅里叶变换

I = abs(U).^2; % 强度计算

imshow(log(I+1),[]); % 对数显示增强对比

`

这里有个骚操作:对强度取对数。因为实际强度跨度可能达到10^6量级,取log能让暗部细节更明显,相当于给图像自动做HDR处理。

举个实际效果:当圆孔半径设为0.5mm,激光波长632.8nm时,生成的衍射图中央是著名的爱里斑,周围环绕明暗相间圆环。把代码里的aperture换成ring_aperture,马上能看到环形孔特有的"火山口"衍射花样。

最后给个调试小技巧:如果生成的图像太暗或太亮,可以调整imshow的显示范围参数[],或者改用imagesc(I.^0.3)这种伽马校正显示,比直接显示原始强度更符合人眼感知。

完整代码打包在Github(假装有链接),修改孔径参数就能看到各种神奇的光学现象。下次组会汇报拿这个做示意图,保证老板眼前一亮——当然,别说是从CSDN抄的就行(手动狗头)。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐