ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

MATLAB 菲涅尔波带片衍射仿真:采样、角谱法与焦点验证

2026/9/17 21:52:04 拓冰建站 浏览量
MATLAB 菲涅尔波带片衍射仿真:采样、角谱法与焦点验证 简介围绕菲涅尔波带片衍射特性整理的Matlab仿真学习资料以单个doc文档形式提供压缩包约163KB适合正在学习光学课程、信息光学实验或准备课程设计的高校学生与Matlab入门者参考。文档从波带片分区相位与振幅控制的基本原理讲起逐步给出用Matlab复现波带片的具体思路先设定波长、半径、焦距等参数再将屏幕划分为1001×1001个采样点逐点计算半波带数依据其奇偶性决定该处涂黑或透光最后借助灰度色图与图像绘制函数输出波带片图案。文中区分了奇数波带片与偶数波带片的判定差异并对照运行结果分析两种图案的黑白分布形式读者可据此理解矩阵运算、二重循环与数字信号处理技术在光学仿真中的配合方式并改写参数观察波长、焦距变化的影响。目前已有859人学习下载。1. 从同心圆掩模到衍射场MATLAB 模拟菲涅尔波带片在算什么用 MATLAB 做波动光学演示时菲涅尔波带片经常被画成一张黑白同心圆图很多人以为掩模画完就结束了真正容易卡住的是后面的采样、传播和焦点位置验证。菲涅尔波带片由一组交替透明与不透明的环带组成相邻环带边缘到焦点的光程差为半波长于是奇数波带和偶数波带在焦点处形成相长干涉。标题里的.doc通常意味着一份公式、参数表或实验说明落到 MATLAB 里我一般把它拆成三件事由焦距和波长算环带半径用网格写出透过率函数再用角谱或菲涅尔衍射算一段传播距离后的复振幅。适合做本科物理仿真、衍射光学入门、聚焦元件设计验证的人熟悉 MATLAB 画图和矩阵运算就能跟下来但要把结果做可信必须盯住最细环带宽度和网格采样。2. 菲涅尔波带片环带半径与焦距参数MATLAB 里的公式、采样和边界条件菲涅尔波带片的第一个参数不是像素数而是环带半径。平面波照明下第 n 个波带的外边界半径常用[ r_n\sqrt{n\lambda f\left(\frac{n\lambda}{2}\right)^2} ]当 (n\lambda \ll f) 时退化为 (r_n \approx \sqrt{n\lambda f})。焦距越短、波长越短、波带数越多最外环越细后面网格就越容易被欠采样。2.1 由波长和焦距反推环带半径MATLAB 计算菲涅尔波带片 r_n先写一个最小计算脚本把半径、环带宽度和理论衍射效率一起打印出来。lambda 532e-9; % 入射波长单位 m f 0.20; % 设计焦距单位 m N 50; % 波带数 n (1:N).; % 波带序号 rn sqrt(n*lambda*f (n*lambda/2).^2); % 第 n 个波带外半径 dr diff([0; rn]); % 每个环带宽度 fprintf(最外环半径 %.4f mm\n, rn(end)*1e3); fprintf(最窄环带宽度 %.3f um\n, min(dr)*1e6); fprintf(第一环半径 %.4f mm\n, rn(1)*1e3);逻辑说明rn给出每个波带边界半径dr是相邻边界的差最小值决定网格上限。参数说明lambda常用 532 nm、633 nm 或 0.5 mm 附近的太赫兹波长f可先取 0.1 m 到 0.5 m 做验证N越大焦点越接近理想但最外环越难加工和采样。若min(dr)已经小于 1 微米而网格步长还在 10 微米后面的模拟基本没有意义。2.2 网格采样与最细环带MATLAB 中类似 linspace 的网格怎么设MATLAB 里类似的linespace函数通常指linspace建二维网格我习惯先算dx和Nx而不是直接写死 1024。参数含义典型取值注意点lambda波长532e-9 m与后续传播函数一致f焦距0.2 m决定环带半径尺度N波带数30 到 100越大外环越细dx网格步长min(dr)/6至少 4 到 8 个采样点覆盖最细环L计算窗口4*max(rn)太小会产生边界反射假象Nx每维像素数2048 或 4096受内存限制dx min(dr)/6; % 最细环带至少 6 个采样点 L 4*max(rn); % 计算窗口边长 Nx 2^nextpow2(L/dx); % 取 2 的幂方便 FFT x (-Nx/2:Nx/2-1)*dx; % 以中心为原点的坐标 [X,Y] meshgrid(x,x); R hypot(X,Y);逻辑说明dx先由最细环带反推而不是先取 1 微米Nx取 2 的幂可减少 FFT 补零开销。参数说明如果Nx超过 8192普通笔记本内存和 FFT 时间会明显上升这时可以减小N或增大f不要硬跑。2.3 透过率函数振幅型菲涅尔波带片和相位型的初值写法振幅型用 0/1 表示挡光与透光相位型用 0 和 π 交替表示半波延迟。下面用同一个半径平方关系生成两种掩模。q R.^2/(lambda*f); % 归一化径向坐标 bandIndex floor(q); % 第几个波带 T_amp mod(bandIndex,2) 0; % 偶数带透明奇数带挡光 T_amp double(T_amp); phase pi * mod(bandIndex,2); % 交替 0/pi 相位 T_phase exp(1i*phase); imagesc(x*1e3, x*1e3, T_amp); axis image; colormap(gray); colorbar; xlabel(x / mm); ylabel(y / mm); title(振幅型菲涅尔波带片透过率);逻辑说明q把半径映射到波带序号mod(...,2)产生交替环带。参数说明T_amp用于振幅型理想焦点效率低因为一半光被挡住T_phase用于相位型理论上把奇偶带相位差改成 π 后更多能量进入焦点。常见错误是把R.^2写成R结果环带间距不均匀焦点明显偏移。画图时若图像全黑或全白先看T_amp的min和max而不是急着改传播代码。3. 用 FFT 与角谱法模拟菲涅尔波带片衍射聚焦MATLAB 代码怎么跑通掩模只是起点真正决定模拟质量的是传播。近轴条件下可以用菲涅尔衍射积分越过近轴限制时用角谱法更稳。角谱法把平面波分解成不同空间频率传播因子为[ H(f_x,f_y)\exp\left(i k z\sqrt{1-(\lambda f_x)^2-(\lambda f_y)^2}\right) ]当根号内为负时对应倏逝波数值上直接截断。这个写法在可见光、小角度、中等距离下很好用。3.1 角谱传播函数MATLAB 里 20 行实现菲涅尔波带片衍射把传播封装成函数后面做轴向扫描时直接调用。function Uout angularSpectrum(Uin, lambda, z, dx) [Ny,Nx] size(Uin); k 2*pi/lambda; fx (-Nx/2:Nx/2-1)/(Nx*dx); fy (-Ny/2:Ny/2-1)/(Ny*dx); [FX,FY] meshgrid(fx,fy); arg 1 - (lambda*FX).^2 - (lambda*FY).^2; H exp(1i*k*z.*sqrt(arg)); H(arg 0) 0; % 截断倏逝波 Uf fftshift(fft2(Uin)); % 频谱移到中心 Uout ifft2(ifftshift(Uf.*H)); % 乘传播因子后逆变换 end逻辑说明fftshift让零频位于矩阵中心H与频率网格逐点相乘ifft2(ifftshift(...))回到空域。参数说明z是传播距离单位 mdx必须与生成Uin时的网格步长一致混用不同dx会让光斑尺寸整体缩放错误。若结果出现棋盘状高频噪声先检查fx和fy是否按fftshift后顺序排列。3.2 菲涅尔衍射积分的 FFT 实现与坐标网格匹配想知道角谱法和菲涅尔积分差多少可以再写一个单步菲涅尔 FFT 版本。它省略了部分高频项但速度快适合教学对比。k 2*pi/lambda; U0 T_phase; % 相位型透过率作为输入 % 菲涅尔衍射的卷积形式利用 FFT 实现 h exp(1i*k/(2*z)*(X.^2 Y.^2)); % 二次相位因子 Ufres fftshift(ifft2(fft2(ifftshift(U0)) .* ... fft2(ifftshift(h)))) * dx^2; I abs(Ufres).^2; imagesc(x*1e3, x*1e3, I); axis image; colormap hot; colorbar; xlabel(x / mm); ylabel(y / mm); title(菲涅尔波带片在焦面附近的强度);逻辑说明这里用卷积定理把菲涅尔积分变成频域乘法再反变换回空域。参数说明z通常先设为设计焦距fdx与x的步长一致U0可以是振幅型或相位型但相位型需要保留复数不能用double强转。若焦面光斑不是中心亮点优先检查ifftshift与fftshift是否配对以及meshgrid的坐标原点是否在中心。3.3 沿 z 轴扫描找焦点MATLAB 画图判断实际焦距设计焦距是f数值焦距可能因采样、孔径截断和相位量化而偏移所以我会扫一段 z。zList linspace(0.8*f, 1.2*f, 81); % 焦距附近扫描 peakI zeros(size(zList)); for iz 1:numel(zList) Uz angularSpectrum(T_phase, lambda, zList(iz), dx); Iz abs(Uz).^2; peakI(iz) max(Iz(:)); end [~,idx] max(peakI); fprintf(扫描峰值位置 z %.4f m\n, zList(idx)); plot(zList, peakI, LineWidth, 1.2); xlabel(传播距离 z / m); ylabel(峰值强度); grid on;逻辑说明每次传播只取最大强度形成轴向点扩散函数。参数说明扫描范围取0.8f到1.2f若峰值落在边界说明实际焦点偏移更大需要扩到0.5f到1.5f81点适合粗扫精确定位可先粗扫再在峰值附近用linspace细扫。matlab画图时把LineWidth设为 1.2 以上导出后曲线更清楚。4. 振幅型与相位型菲涅尔波带片的 MATLAB 建模差异二值化、灰度与 matlab图像处理振幅型掩模用 0 和 1 表示挡光与透光相位型用复数透过率表示相位延迟。两者在 MATLAB 里的矩阵规模相同但后续强度、效率、加工和图像检查方式不同。做matlab图像处理时常把掩模当二值图或灰度图看但相位型不能只存灰度图必须保留相位数据。4.1 振幅型菲涅尔波带片的二值化与超采样抗锯齿直接按像素判floor(R.^2/(lambda*f))会在环带边缘产生锯齿尤其最外几环。常见做法是先超采样再降采样回目标尺寸。super 4; % 超采样倍数 Nx2 Nx*super; x2 (-Nx2/2:Nx2/2-1)*(dx/super); [X2,Y2] meshgrid(x2,x2); R2 hypot(X2,Y2); T2 mod(floor(R2.^2/(lambda*f)),2) 0; T2 double(T2); % 用块平均降采样不需要 Image Processing Toolbox T_amp_aa squeeze(mean(reshape(T2, super, Nx, super, Nx), [1 3])); imagesc(x*1e3, x*1e3, T_amp_aa); axis image; colormap(gray); colorbar; title(超采样后的振幅型波带片);逻辑说明T2在更细网格上生成再按super×super块平均边缘得到 0 到 1 的灰度过渡。参数说明super4对多数教学模拟够用若最外环只有两三个原像素可提高到 8但内存会按平方增长。若安装了 Image Processing Toolbox也可以用imresize(T2,[Ny Nx],box)结果接近。matlab亮度平衡时不要把caxis设得太窄否则环带过渡被误认为缺陷。4.2 相位型菲涅尔波带片的相位延迟和高度映射相位型要给出材料高度。折射率为n_mat的介质产生 π 相位差的高度为[ h\frac{\lambda}{2(n_{\text{mat}}-1)} ]nMat 1.5; % 介质折射率示例值 h lambda/(2*(nMat-1)); % 产生 pi 相移的台阶高度 fprintf(所需台阶高度 %.1f nm\n, h*1e9); phaseStep pi * mod(floor(R.^2/(lambda*f)),2); T_phase exp(1i*phaseStep); % 查看相位包裹后的实部和虚部 figure; subplot(1,2,1); imagesc(angle(T_phase)); axis image; colorbar; title(相位分布 / rad); subplot(1,2,2); imagesc(abs(T_phase)); axis image; colorbar; title(振幅透过率);逻辑说明phaseStep只取 0 或 πT_phase同时保留振幅和相位。参数说明nMat要按实际材料替换常见聚合物、熔石英在不同波长下折射率不同h直接决定相位是否正确。若焦点强度比振幅型还低先检查phaseStep是否写成了2*pi或pi/2再检查材料高度是否与波长匹配。4.3 用 matlab图像处理 做环带质量检查与亮度平衡把掩模当图像检查时最有用的是径向平均和边缘对比度。检查项MATLAB 写法正常表现异常含义环带半径mean(R(T_amp0.5))随序号单调增排序或坐标反了边缘灰度T_amp_aa边界值有中间过渡锯齿过强亮度范围caxis([0 1])0/1 分明归一化错误相位范围angle(T_phase)只有 0 和 π相位步长错误径向对称旋转 90 度相减差值接近 0网格非中心Trot rot90(T_amp_aa); symErr max(abs(T_amp_aa(:) - Trot(:))); fprintf(旋转对称误差 %.4f\n, symErr);逻辑说明旋转 90 度后相减能快速发现坐标中心偏移。参数说明symErr接近 0 说明中心在网格中心若明显大于 0检查x是否用(-Nx/2:Nx/2-1)*dx而不是linspace(-L/2,L/2,Nx)后忘记转置。matlab可视化大学物理里常把这类图直接放进讲义导出前记得统一字体和线宽。5. 菲涅尔波带片模拟结果验证与进阶技巧聚焦光斑、eps 导出和报错排查5.1 判断菲涅尔波带片模拟是否可信的三个量第一看焦点峰值位置。轴向扫描峰值应接近设计焦距偏移超过 5% 就要查采样和孔径截断。第二看焦斑半高全宽。理想聚焦光斑量级约lambda*f/D其中D是波带片外直径。第三看能量守恒角谱法无吸收时传播前后总能量应基本不变。可以在传播函数后加一行sum(abs(Uout(:)).^2)*dx^2与输入比较若差异大通常是倏逝波截断或窗口太小导致边界截断。5.2 导出 eps 和亮度平衡matlab 2025 导出eps 前后要查什么matlab 2025 导出eps可以用exportgraphics或print。fig figure(Color,w); imagesc(x*1e3, x*1e3, I); axis image; colormap hot; colorbar; caxis([0 prctile(I(:),99.5)]); % 压掉极亮噪点亮度更平衡 xlabel(x / mm); ylabel(y / mm); exportgraphics(fig, fz_pole_focus.eps, ... ContentType,vector, Resolution, 300);逻辑说明caxis用 99.5% 分位数压掉少量极亮像素避免整幅图偏暗。参数说明ContentType选vector时线条和文字可缩放若图像矩阵太大eps 文件会很大可以改存 png。导出后放大检查环带边缘是否出现白线若有白线把axis image后的set(gca,YDir,normal)补上。5.3 常见报错从许可证、内存到复数 ifft遇到License checkout failed或matlab获取附加功能显示要访问附加功能资源管理器先确认当前许可证是否包含要用的工具箱只用基础 MATLAB 也能完成本文代码imresize和部分图像处理函数才需要 Image Processing Toolbox。遇到Out of memory优先降Nx或降super不要先换机器。遇到ifft2结果全为零检查输入是否误用了double转实数相位型必须保留complex。遇到环带图中心偏移检查meshgrid后的X、Y是否与fftshift频率网格匹配这类错误比公式错误更常见。最后把dx、lambda、z三个量在脚本开头集中定义避免函数内外变量名冲突。本文还有配套的精品资源点击获取