首页 / 资讯中心 / 文章详情

MATLAB光学衍射仿真:衍射积分与傅立叶变换双路线实战

MATLAB光学衍射仿真:衍射积分与傅立叶变换双路线实战 ★ FEATURED ARTICLE
简介这份资源面向学习大学物理光学课程、需要动手验证衍射理论的学生与教师提供一套用 MATLAB 编程模拟光学衍射的完整文档。内容围绕两条技术路线展开一是衍射积分方法通过计算接收屏上的光强分布模拟单缝衍射、杨氏双缝干涉与黑白光栅衍射二是傅立叶变换方法借助 fft2、fftshift 等函数处理屏函数功率谱复现圆孔、矩孔、三角孔、单缝、黑白光栅及正弦光栅的夫琅和费衍射图样并观察缺级等规律。资源包共 1 个 doc 文件约 247KB以文字说明配合完整可运行代码的形式组织便于对照理解公式与程序实现。目前已有 792 人学习下载。读者可从中获得两类模拟方法的推导思路、各典型衍射场景的 MATLAB 源码以及光强分布与衍射图样的呈现方式适合作为课程实验的参考脚本与自学练习素材。1. 光学衍射 MATLAB 模拟从物理公式到可交付的仿真方案做光学课设最怕的一件事是公式推得挺顺一到出图就翻车——条纹位置对不上、缺级数不出来、灰度图一片糊。这套方案要解决的就是这个问题用 MATLAB 把单缝衍射、杨氏双缝干涉、黑白光栅衍射、正弦光栅夫琅和费衍射这几类典型实验用「衍射积分」和「傅立叶变换」两条路线各跑一遍最后拿到能直接放进报告里的光强分布曲线和衍射图样。它适合正在做光学课设、物理仿真毕设或者要给实验课做演示程序的人。整套东西不依赖任何工具箱之外的第三方库一台装了 MATLAB 的普通机器就能跑参数改一改就能换实验条件属于那种「交得了作业、也经得起答辩追问」的方案。2. 需求与技术选型为什么是 MATLAB为什么是两条路线2.1 先把需求拆成三类可验收的产出动手写代码之前我一般会先把「这个项目到底要交什么」列清楚否则很容易写着写着变成一堆散装脚本。这套方案的实际产出可以归成三类每一类都对应一个验收动作产出类型具体内容验收方式数值结果接收屏上的光强分布数组 B(y)与理论极值位置、缺级条件比对可视化图灰度衍射图 光强曲线双栏图肉眼可辨条纹、缺级、调制包络可复现脚本每个实验一个独立 .m 文件换参数重跑结果稳定把这三类钉死之后后面所有设计都是围绕「怎么让 B(y) 算得对、画得清、改得动」展开的。很多同学一上来就抄公式写循环结果图是出来了但问他条纹间距为什么是这个值答不上来——这就是产出没和验收挂钩。2.2 两条路线的分工衍射积分管近场直觉傅立叶变换管远场效率这套方案最有价值的设计点是把两种方法当成互补而不是替代。衍射积分方法从惠更斯原理出发把孔径离散成 np 个相干点源逐点叠加复振幅物理图像非常直观适合讲清单缝、双缝、光栅的条纹是怎么「叠」出来的缺点是计算量随离散点数平方增长孔径一复杂就吃力。傅立叶变换方法则利用夫琅和费衍射场强度等于屏函数功率谱这一结论直接对屏函数矩阵做 fft2一次变换出全场效率高得多而且能处理圆孔、矩孔、三角孔甚至字母这种不规则孔径。代价是它只适用于远场夫琅和费条件近场菲涅耳衍射它管不了。所以选型结论很明确教学演示和公式验证走衍射积分复杂孔径和批量出图走傅立叶变换。两条路线对同一个单缝实验的结果应当能互相印证这本身就是答辩时一个很好的自洽性论据。2.3 参数体系把物理量集中管理翻车的重灾区之一是参数散落在各个脚本里改一个缝宽要开五个文件。我习惯在每类实验开头把物理量集中声明单位统一用国际单位制波长用500e-9这种科学计数写法避免0.0000005数错零。核心参数就四个波长 lam、缝宽或孔径 a、传播距离 D、观察屏半宽 ym。其中 ym 通常按3*lam*D/a或5*lam*D/a估算保证主瓣和几个次极大都落在窗口内——这个估算式本身就是中央主极大半宽lam*D/a的倍数窗口开小了条纹会被裁掉开大了分辨率不够是个需要调的平衡点。3. 衍射积分路线单缝、双缝、光栅的逐点叠加实现3.1 单缝衍射把缝离散成 np 个相干光源单缝的核心思路是把宽度为 a 的缝切成 np 份每一份当作一个点源屏幕上某点的复振幅就是这 np 个点源贡献的叠加。相位差由光程差决定代码里用alpha2*pi*yp*sinphi/lam一次性向量化算出所有点源的相位再分别累加 cos 和 sin 分量最后取模平方得到光强。这种写法比双重 for 循环快一个数量级也是 MATLAB 里该有的习惯。clear lam 500e-9; % 波长单位 m a 1e-3; % 缝宽单位 m D 1; % 缝到屏距离单位 m ym 3*lam*D/a; % 观察屏半宽取中央主极大半宽的 3 倍 ny 51; % 屏上采样点数 ys linspace(-ym, ym, ny); np 51; % 缝内离散点源数 yp linspace(0, a, np); for i 1:ny sinphi ys(i)/D; % 小角近似下的衍射角正弦 alpha 2*pi*yp*sinphi/lam; % 各点源相对相位 sumcos sum(cos(alpha)); sumsin sum(sin(alpha)); B(i,:) (sumcos^2 sumsin^2)/np^2; % 归一化光强 end N 255; Br (B/max(B))*N; % 映射到 0~255 灰度 subplot(1,2,1) image(ym, ys, Br); colormap(gray(N)); % 左栏灰度衍射图 subplot(1,2,2) plot(B, ys); % 右栏光强分布曲线这段代码里np是精度旋钮取 51 已经能看出主极大和两侧次极大取到 201 曲线会更平滑但耗时上升。ny决定纵向采样密度太小曲线会有折角。归一化除以np^2是为了让光强峰值归一到 1方便不同缝宽之间横向比较。跑完应该看到中央一条最亮的宽主极大两侧对称的次极大亮度递减——如果次极大位置和sinθ kλ/a对不上八成是sinphi用了tan或者角度单位搞混了。3.2 杨氏双缝干涉用真实光程差算相位双缝和单缝的差别在于这里不是离散孔径而是两个相干点源直接算它们到屏上每点的几何距离 r1、r2相位差phi2*pi*(r2-r1)/lam光强按4*cos(phi/2)^2走。注意这里用的是精确的平方和开方算距离而不是小角近似因为双缝间距 a 相对 D 不一定足够小用精确式更稳。clear lam 500e-9; a 2e-3; % 双缝间距 D 1; ym 5*lam*D/a; n 101; ys linspace(-ym, ym, n); for i 1:n r1 sqrt((ys(i)-a/2).^2 D^2); % 到上缝距离 r2 sqrt((ys(i)a/2).^2 D^2); % 到下缝距离 phi 2*pi*(r2-r1)/lam; % 相位差 B(i,:) 4*cos(phi/2)^2; % 双缝干涉光强 end N 255; Br (B/4.0)*N; subplot(1,2,1) image(ym, ys, Br); colormap(gray(N)); subplot(1,2,2) plot(B, ys);a在这里是缝间距而不是缝宽这是最容易和单缝参数混淆的地方。条纹间距理论值是lam*D/a把 a 调大条纹会变密调小变疏跑一遍改一次参数就能直观感受到。ym取5*lam*D/a是为了让窗口里至少装下五条亮纹太少看不出等间距规律。3.3 黑白光栅衍射衍射因子与干涉因子的乘积光栅是这套方案里公式最长的部分但结构其实很清晰光强等于单缝衍射因子(sinα/α)^2乘以多缝干涉因子(sin(Nβ)/sinβ)^2。α 由缝宽 a 决定β 由光栅常数 d 决定N 是参与干涉的缝数。这个乘积结构直接解释了「缺级」现象——当干涉主极大位置恰好落在衍射因子的零点上那条主极大就消失了。clear lam 500e-9; N 2; % 参与干涉的缝数 a 2e-4; % 缝宽 D 5; d 5*a; % 光栅常数这里取缝宽的 5 倍 ym 2*lam*D/a; n 1001; ys linspace(-ym, ym, n); for i 1:n sinphi ys(i)/D; alpha pi*a*sinphi/lam; % 单缝衍射因子参数 beta pi*d*sinphi/lam; % 多缝干涉因子参数 B(i,:) (sin(alpha)/alpha)^2 * (sin(N*beta)/sin(beta))^2; B1 B/max(B); end NC 255; Br (B/max(B))*NC; subplot(1,2,1) image(ym, ys, Br); colormap(gray(NC)); subplot(1,2,2) plot(B1, ys);d/a的比值直接决定缺级出现在第几级d/a5 时第 5、10、15 级主极大会被衍射零点吃掉。答辩时如果被问「为什么第 5 级不见了」答案就在这个比值里。N取 2 时干涉因子退化成双缝形式取大一点比如 5、10主极大才会变尖锐这也是演示光栅「缝数越多谱线越细」的好素材。注意sin(N*beta)/sin(beta)在 beta 接近整数倍 pi 时会出现 0/0数值上靠浮点误差侥幸不报错严谨做法是加一个极小量 eps 兜底。4. 傅立叶变换路线孔径屏函数到远场衍射图样4.1 从屏函数到功率谱fft2 四步走傅立叶方法的核心链条是读入或生成孔径图像 →fft2做二维离散傅立叶变换 →abs取模得到振幅谱 →fftshift把直流分量挪到中心 →imshow显示。这四步里fftshift最容易被漏掉漏了之后频谱四个角是低频、中心是高频图看起来「反了」很多人以为是算法错了其实是没移位。clear a imread(aperture.bmp); % 读入黑白孔径图路径按实际改 a double(a); % 转双精度避免整型溢出 figure(1); imshow(a, []); % 原孔径 afft fft2(a); % 二维离散傅立叶变换 aabs abs(afft); % 取模得振幅谱 aabss fftshift(aabs); % 直流分量移到中心 figure(2); imshow(aabss, []); colormap(gray); colorbar; figure(3); plot(aabss); % 一维剖面看光强分布 figure(4); meshc(aabss); % 三维网格看整体形态double(a)这一步别省imread读进来常是 uint8直接 fft2 会在整型上做运算导致精度丢失甚至报错。imshow(..., [])的空方括号是让显示自动按数据范围拉伸否则弱衍射斑会黑成一片。meshc那幅三维图在报告里很出彩能直观看到主瓣和旁瓣的高低关系。4.2 简单孔径圆孔、矩孔、三角孔的图样差异同一套 fft2 流程换一张孔径图就换一种衍射图样这正是傅立叶方法的效率优势。圆孔得到的是艾里斑——中心亮斑加一圈圈同心暗环矩孔得到的是沿两个方向展开的十字形 sinc 图样三角孔则出现三重对称的花样。操作上只需要在画图工具里画好黑白位图存成 BMP或者直接用矩阵生成孔径改imread的文件名即可。这里的关键认知是衍射图样是孔径形状的傅立叶变换孔径的对称性会原样反映到图样的对称性上圆孔圆对称、矩孔四重对称、三角孔三重对称这条规律比记公式好用。4.3 正弦光栅与复合孔径先造屏再变换正弦光栅没法直接画得先用余弦函数生成灰度图再存盘。代码里Bcos(xs)1把余弦抬到非负区间归一化到 0~255 存成灰度 BMP再走 fft2 流程结果只有三个衍射斑0 级和 ±1 级和理论完全一致——这是验证整条链路正确性的最佳测试用例因为它的解析解最简单。clear all xm 10*pi; ys xm; xs linspace(-xm, xm, 500); B cos(xs) 1; % 抬升到非负 N 255; Br B/2*N; % 归一化到灰度范围 image(xs, ys, Br); colormap(gray(N)); % 保存为灰度 BMP 后再走 4.1 的 fft2 流程复合孔径更有意思两个方孔并排基本图样还是方孔衍射但在两孔连线的中垂线方向会出现等间距暗纹三个方孔摆成三角形就出现类似蜂巢的结构两个方向的光栅叠加线条不平行时暗纹会朝各个中垂线方向发散。这些现象用衍射积分硬算很痛苦用 fft2 就是换一张孔径图的事。字母和符号也能产生可辨识的衍射花样拿来做课程演示的彩蛋很合适。5. 避坑与排查这类仿真最容易翻车的五个点5.1 条纹位置对不上理论值现象是灰度图和曲线都出来了但次极大位置和sinθkλ/a算出来的差一截。原因多半是角度近似用错——sinphiys/D是小角近似D 不够大或 ym 开得宽时误差累积。解决办法是把sinphi换成ys/sqrt(ys^2D^2)的精确式或者干脆把 D 调大到近似成立。我一般会在报告里注明用了小角近似及其适用条件这比假装精确更经得起问。5.2 灰度图一片死黑或全白现象是image出来的图要么全黑要么全白看不到条纹。原因是没做归一化映射光强动态范围太大弱次极大被压到 0。解决就是代码里那步Br(B/max(B))*N把峰值拉到 255弱信号才有灰度层次。如果还想突出弱条纹可以对 B 取对数再映射但要在图注里说明做了对数压缩否则光强比值就不可读了。5.3 fftshift 漏写导致频谱「反了」现象是傅立叶方法出的图中心是暗的、四角是亮的和教科书上的衍射图对不上。原因就是没做fftshift直流分量还留在矩阵角上。解决很简单取模后补一句aabssfftshift(aabs)。这个坑几乎每个第一次用 fft2 做光学仿真的人都踩过属于血泪经验级别的低级错误。5.4 光栅公式在整数倍处出现 0/0现象是光栅程序偶尔报警告或出现 NaN。原因是sin(N*beta)/sin(beta)在 beta 为 pi 整数倍时分母为零。数值上浮点误差常常让它侥幸不炸但不能赌。解决办法是分母加eps或者用sinc类函数重写干涉因子。答辩时如果被追问数值稳定性这一条能加分。5.5 图像读入路径和格式不匹配现象是imread报错「文件不存在」或读进来是三通道彩色图导致 fft2 维度不对。原因是路径写死成某台机器的绝对路径或者 BMP 存成了 24 位彩色。解决办法是用相对路径、把图像统一转灰度rgb2gray、并在读入后size打印一下确认是二维矩阵。这类问题不涉及物理但卡住的人最多属于纯工程踩坑。6. 验收与答辩怎么证明这套仿真是对的验收这套东西我一般不看图好不好看只看三件事能不能对上。第一是极值位置单缝次极大、双缝条纹间距、光栅主极大间距都要能和解析式算出的理论值对上误差控制在采样步长以内。第二是缺级规律改 d/a 比值缺级级数要跟着变d/a5 缺第 5 级、d/a3 缺第 3 级这个能现场演示最有说服力。第三是两法互证同一个单缝衍射积分和傅立叶变换各跑一遍光强曲线的主瓣宽度应当一致不一致就说明有一边参数或近似出了问题。答辩时被问得最多的不是代码而是「你这个模拟可信吗」。我的应对套路是准备一张对照表把每个实验的理论特征值、仿真读出的值、相对误差列出来误差在 5% 以内就算通过。下面这张表可以直接套实验理论特征理论值仿真读数判定单缝第一暗纹位置λD/a从曲线读误差5%双缝条纹间距λD/a相邻亮纹间距误差5%光栅缺级级数d/a 的整数倍观察消失的主极大完全一致正弦光栅衍射斑个数3 个数斑点完全一致还有一个技巧把参数扫描做成一个小循环比如缝宽从 0.5a 扫到 2a批量出图拼成一张对比图答辩时一放规律一目了然比口头解释强得多。这套批量出图的脚本我一般会单独存一个文件和主程序分开方便现场改参数重跑。从那以后我每次带这类光学仿真都强制先跑正弦光栅这个最简用例——它只有三个斑对不上就说明 fft2 链路有问题先修链路再谈复杂孔径能省掉大量瞎调参数的时间。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站