尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
中红外超构透镜设计入门:从相位推导到版图输出全流程
1. 中红外超构透镜为什么值得“玩”从应用刚需到技术红利先说一个让我入坑中红外超构透镜的直接原因2022年我们组接到一个气体传感项目要在4.2μm附近检测CO₂的浓度变化。传统方案要么用ZnSe凸透镜要么用离轴抛物面镜前者又脆又贵后者装调起来能把人折磨疯。后来翻文献发现一片厚度不到1μm的硅超构透镜就能替代整个传统光路组件那一刻我就知道这个方向值得投入。中红外波段一般指2.5μm到25μm这个范围里面藏着大量分子的“指纹区”。CO₂、CH₄、NO₂、甲醛、丙酮几乎所有有实际监测需求的气体其特征吸收峰都落在这个区间。加上3~5μm和8~14μm两个大气窗口正好对应热成像和红外制导的核心工作波段中红外光学的应用价值一直很高。但问题在于传统中红外光学元件太不争气了锗、硒化锌、硫系玻璃要么折射率高但脆性大要么加工困难要么对温度敏感大口径非球面镜更是又贵又难镀膜。超构透镜在这里的优势非常直接它用亚波长结构单元替代曲面折射一片平面结构就能实现聚焦、成像、波前整形这些功能。设计自由度极强——想要大数值孔径想要消色差想要多焦点都是“在版图上改参数”的事而不是重新磨一块镜片。更关键的是它的制造工艺和半导体CMOS线兼容硅、氮化硅、非晶硅这些材料在特定中红外窗口损耗并不大这给了它大规模低成本量产的可能。对做科研或工程的人来说现在确实是入局中红外超构透镜的好时候商业仿真软件成熟、开源的RCWA代码随处可取、加工流片平台也开放了多晶硅和氮化硅的工艺。我写这篇文章的目标很简单把从“复现一篇经典论文的超构透镜设计”到“自己写代码设计任意参数的中红外超构透镜”这条路完整走一遍。你在读完之后应该能独立完成一个中红外超构透镜的仿真、设计和版图输出并且知道哪些地方容易翻车。2. 设计第一步相位分布推导与单元库构建的逻辑2.1 超构透镜聚焦的基本原理从“费马原理”说起很多人一上来就被“广义斯涅尔定律”“异常折射”这些词吓住其实超构透镜的底层道理非常简单一束平面波垂直入射到一个平面上如果想让它汇聚到焦点只需要让波前从平面变成球面。传统透镜靠曲面折射实现这一点曲面让光路中间走得慢、边缘走得快从而把波前弯折成球面。超构透镜平面没有曲率但它可以让每一点的光分别延迟不同的量——这个延迟量刚好补上从焦点到平面不同位置的光程差波前自然就变成汇聚球面了。具体来说超构透镜表面某一点(r, 0)处需要的相位延迟为φ(r) - (2π/λ) × (√(f² r²) - f)这里的f是焦距λ是设计波长r是该点距透镜中心的距离。这个公式是超构透镜设计的灵魂几乎所有标准设计都是从这个“双曲相位分布”出发的。它的物理含义是透镜中心处不需要额外相位延迟离中心越远需要的相位延迟越大注意负号表示相位延迟。我来拆解一下这个公式的实际含义。当r 0时φ(0) 0所以透镜中心单元和没有结构时的相位一致当r到边缘位置时φ(r)变大负得更多也就是说边缘单元需要让光走得更“慢”。每个位置上的亚波长柱状结构设计成不同直径就相当于一个“微型相位延迟器”。把不同直径的柱子在平面上按顺序排好整个透镜就完成了。2.2 单元库扫描为什么必须覆盖完整2π相位有了目标相位分布下一步就是建立“单元库”扫描一系列不同几何参数的单元结构通常是不同半径的圆柱记录每个单元在目标波长下的透射复振幅提取出透射相位。单元库扫描的核心指标有两个一是相位是否能完整覆盖0到2π二是透射振幅是否尽量接近一致。这里有个关键细节单元结构的参数扫描步长直接决定设计质量。如果半径从100nm到500nm每20nm扫一个点26个点对应到透镜上可能只有26个离散相位值每个位置只能选最近的那个相位造成离散误差。行业里常用的是把相位离散化到2π/16甚至2π/32的水平也就是16或32个相位梯度等级。对应地单元半径扫描间距要足够细保证相邻半径的相位差不超过目标相位量化步长。单元库扫描还有一个容易忽略的点入射角度。标准单元库默认平面波垂直入射但透镜边缘的单元实际接收的入射光不是完全垂直的——在大数值孔径设计中这个效应尤其明显边缘位置入射角可能达到20°甚至更大。严谨的做法是在扫描单元库时把入射角也作为变量后续设计时按该位置的实际入射角查表。不过入门阶段可以先用垂直入射近似会带来一定像差但不会影响“复现经典设计”这个目标。第一个项目里我的扫库区间是圆柱半径从0.25μm到1.1μm间隔0.02μm材料用氢化非晶硅a-Si:H高度1.2μm衬底为蓝宝石中红外用蓝宝石是经典选择损耗低且折射率适中基底周期1.5μm。扫描波长4.0μm。这样得到43个单元点相位覆盖刚好超过2π。3. 仿真环境搭建与参数设定别急着上FDTD3.1 工具选型RCWA扫单元FDTD验整体很多刚接触超构透镜的人一上来就把整个透镜扔进FDTD(时域有限差分)仿真里这在计算上是个灾难——一个直径100μm的透镜三维FDTD网格可能需要几亿个网格点内存轻松超过128GB。正确做法分两步走第一步用RCWA(严格耦合波分析)扫描单元库。RCWA把周期性结构展开成平面波谱进行解析计算速度比FDTD快几个数量级非常适合计算单个周期性单元结构的透射谱和相位。开源领域有RCWA这个Python包也有S4Stanford Stratified Structure Solver后者虽然老但速度极快用Lua脚本驱动我至今还在用。商业软件方面Lumerical的RCWA模块也做得很完善可以和FDTD无缝对接。第二步用FDTD做全透镜的验证仿真。因为RCWA假设的是无限周期而真实透镜单元之间有耦合并存在局域变化FDTD能给出更准确的近场和远场结果。直径50μm以内的透镜FDTD在合理网格下还能跑直径超过100μm就建议只仿真透镜中心附近的一维截面来验证相位分布正确性或者用“超透镜远场投影”的近似方法求聚焦效率。3.2 关键仿真参数的取舍网格、边界、波长中红外超构透镜仿真里最容易被低估的是网格精度。单元高度通常在1~3μm量级而最小特征尺寸柱间间隙可能只有200nm。FDTD中网格至少要有10个以上采样点覆盖最短特征尺寸也就是dx, dy ≤ 20nm。扫描单元库时可以用20nm网格但全透镜仿真的网格最好加密到10nm以下——当然内存和时间成本也会迅速上升。边界条件方面单元库扫描用周期性边界即可RCWA本身就是在周期条件下求严格解而全透镜仿真则要设置完美匹配层PML边界上下留够缓冲区。从透镜表面到PML之间的空隙建议不少于设计波长的2倍否则反弹光会影响结果。光源用平面波入射放置在透镜上方波长设为设计波长附近的一个范围方便后处理做光谱响应分析。监视器的摆放也有讲究。近场监视器紧贴透镜出射面监测电场分布远场监视器则用于计算聚焦到焦点的能量。在Lumerical中可以通过farfield3d函数将近场投影到球面上再沿传播方向截取焦点处的电磁能量与入射总能量相比得到聚焦效率。用RCWA扫库时记录的是透射复数场振幅相位核心代码如下# 以RCWA开源包的接口为例示意单元库扫描逻辑 import numpy as np from rcwa import Layer, Sim, Source wavelength 4.0 # μm period 1.5 # μm radius_list np.linspace(0.25, 1.1, 43) phase_list, trans_list [], [] for r in radius_list: sim Sim() sim.AddMaterialLayer(Sub, n_substrate, thickness0.5) sim.AddMaterialLayer(Meta, n_silicon, thickness1.2) # 定义单元结构为圆柱设置周期、半径等 sim.SetGrating(Meta, periodperiod, radiusr) # 计算、提取相位和振幅 ...3.3 单元库数据流转从扫描结果到查询表单元库扫描完成后原始数据是一张半径-相位表但它不能直接用于透镜设计——因为目标相位是一个连续空间分布而单元库提供的相位是离散的。我们需要做两件事第一把相位数据展开成连续曲线用unwrap处理跨过π的跳变第二对和相位进行插值。实际操作中我会把半径和相位的对应关系拟合成一条平滑映射曲线或者直接用插值函数这样任意目标相位都能反查出对应的结构半径。相位和半径的映射关系不是线性的这是另一个容易踩坑的地方。柱半径小时光基本被底衬直透相位接近0随着半径增加柱体中的模式从“弱扰动向强共振”过渡相位变化会变得非常快然后在特定半径附近出现尖锐跳变。扫描时如果步长不够细可能会漏掉这些跳变导致插值后的映射函数出现歧义一个相位值对应两个半径。解决方法是先粗扫定位跳变区域再在跳变附近加密扫描。4. 复现经典设计从文献挑选到全透镜仿真4.1 复现对象怎么选论文拆解与参数提取要复现经典设计第一步是选对论文。以中红外超构透镜为例我推荐从以下几类经典工作入手一是Capasso课题组关于可见光和红外超构透镜的系列论文他们提供了大量可直接参考的设计公式和单元库数据二是专门针对中红外波长的高数值孔径超构透镜论文比如用硒化铅或非晶硅在中红外实现聚焦效率超过60%的工作。挑选复现对象的原则是文中必须给出完整的三要素——设计波长λ、单元材料折射率n、单元几何参数高度h/周期p/半径范围。没有这些数据复现无从谈起。我在项目里选的是一个用氢化非晶硅在中红外4.0μm波段的超构透镜设计数值孔径0.55焦距50μm透镜直径100μm。论文给出了材料折射率、单元高度1.2μm、基底周期1.5μm这就是可以完全复现的基础信息。4.2 全透镜建模从相位分布到几何版图复现流程的第二步是把连续的相位分布离散化到每个单元位置。假设透镜直径100μm单元周期1.5μm那么整个透镜由大约3480个周期性排列的单元构成同心圆排布。每个单元需要根据它与中心的距离计算目标相位然后从单元库中查出对应的半径。这一步有几个操作细节需要注意透镜的单元排布方式通常有两种一种是规则矩形网格x-y方向等间距排列另一种是同心圆环排列极坐标方式。矩形网格实现简单但在透镜边缘会出现单元超出圆形孔径的情况需要在生成版图时加上孔径掩膜剔除中心距大于透镜半径的单元。同心圆环排列在侧视图中更美观且各向同性更好但生成代码稍复杂。生成几何版图时数据量可能很大。一个直径100μm、周期1.5μm的透镜约3500个单元如果用GDSII格式输出每个圆柱用一个圆形polygon近似需要每个圆至少32个顶点整个版图顶点数量超过10万。好在GDSII格式本身是二进制的用gdspy这类Python库可以直接生成。以下是一个简化版的版图生成逻辑import gdspy import numpy as np lib gdspy.GdsLibrary() cell lib.new_cell(metalens) period 1.5 radius_list [] # 每个单元的半径 centers [] # 每个单元的中心坐标 for ix in range(-33, 34): for iy in range(-33, 34): cx, cy ix * period, iy * period r np.sqrt(cx**2 cy**2) if r lens_radius: # 超出孔径则跳过 continue target_phase -2*np.pi/lam * (np.sqrt(f**2 r**2) - f) # 从单元库查表得到对应半径 cell_radius phase_to_radius(target_phase) centers.append((cx, cy)) radius_list.append(cell_radius) cyl gdspy.Round((cx, cy), cell_radius, number_of_points32) cell.add(cyl) lib.write_gds(metalens.gds)这段代码把最终设计输出成GDS文件实际做流片时厂商会直接使用这个GDS文件生成掩膜版。整个流程中版图生成是“代码自由”的关键一步它会把你从“只会对着论文手画参数”中解放出来。4.3 结果提取与评价聚焦效率、PSF与Strehl比全透镜FDTD仿真完成后需要提取结果来评判“复现是否成功”。三个核心指标缺一不可聚焦效率(focusing efficiency)、点扩散函数(PSF)、强度斯特列尔比。聚焦效率的定义在焦点处一个直径略大于艾里斑孔径内收集的能量占入射到透镜表面的总能量的比例。计算时要注意孔径的选择——通常用1个艾里斑直径即约2.44λ/NA作为收集直径但不同论文口径可能不一致这是对比数据时经常出现偏差的原因。我建议记录时同时标注收集孔径大小比如“焦点能量收集孔径直径为3λ/NA”方便别人复现对比。PSF的提取则简单直观在焦点平面沿x方向和y方向各画一条能量监视线归一化后观察半高全宽(FWHM)。如果设计正确FWHM应接近理想衍射极限即约0.5λ/NA。当初我复现时实测FWHM是理论值的1.08倍基本可接受偏差主要来自单元库的离散量化误差。斯特列尔比(Srehl ratio)是衡量波前质量的金标准实际PSF峰值强度与理想衍射极限PSF峰值强度的比值。比值大于0.8即认为是“衍射极限质量”。对于初版设计斯特列尔比0.7以上就算复现成功不必强求0.9因为单元库相位离散化本身就限制了波前精度。5. 从复现到代码自由写一套自己的设计流水线5.1 设计流水线的五个模块复现了一个经典设计之后下一步就是把自己从“步骤操作者”变成“工具制造者”。一套完整的超构透镜设计流水线应该包括五个模块参数输入模块接收波长、焦距、孔径、材料参数生成设计参数清单相位生成模块根据透镜公式计算目标相位空间分布单元库模块扫库、数据清洗、相位到几何参数的映射版图生成模块将设计参数批量映射到具体几何坐标输出GDS仿真驱动模块自动生成FDTD/RCMA脚本批量跑参数扫描把设计流程封装成流水线才能支撑你在后续做“参数扫描”焦距从25μm到200μm每一步跑一遍数值孔径从0.2到0.6各自出版图。手工逐个做的话一个大参数扫描要几个月流水线自动化后一晚上就能跑完所有数据点。5.2 单元库映射的进阶处理相位离散误差补偿流水线中最容易出现精度问题的环节是把连续相位映射到离散单元库。很多人在这一步直接用“最邻近相位”做离散化导致透镜表面出现明显的相位量化误差聚焦效率下降2~3个百分点。改进做法是“相位随机抖动”或“相位误差最小化”——在离散相位允许的误差范围内尽量选择让累计相位误差最小的单元组合。具体来说在位置(r)处目标相位为φ_target单元库可提供的离散相位为φ_i。直接选|φ_i - φ_target|最小的那个方案会在某些区域形成周期性误差累积。更好的做法是采用一种类ΔΣ调制的方式不仅看当前位置的相位差还考虑前一个位置的累计误差用“误差反馈”来选择当前单元。实测下来这种方法可以把等效相位误差降低约40%代价是版图生成规则稍复杂一些。5.3 从“单焦点”到“多焦点/消色差”的代码扩展当你已经能生成任意标准单焦点超构透镜的流水线代码后扩展能力就变得非常自然。多焦点透镜就是在相位分布上叠送多个透镜的相位函数——只需把相位公式写成这样φ(r) -arg(Σ_k A_k · exp(iφ_k(r)))其中φ_k是第k个焦点的目标相位分布A_k是对应焦点的权重振幅。实现“波长消色差”则需要更复杂的算法核心思路是让多个波长的相位同时满足聚焦条件一般需要对每个单元做多目标优化常见做法是采用遗传算法或粒子群算法。这个进阶扩展正是“代码自由”带来的红利理论在手代码为刀想切哪块切哪块。6. 实战排雷我踩过的六个中红外超构透镜坑前面讲了大量“应该怎么做”现在聊聊“实际上我踩过什么坑”。这些坑单看文献可能一个都发现不了但实操中几乎人人都会撞到。第一个坑是材料折射率的虚部。很多人在设计波长4μm时直接用了硅在近红外波段的折射率数据n3.48, k0其实多晶硅在中红外是有一定吸收的k值达到10⁻²量级。这个吸收会在谐振增强的位置被放大导致单元透射率明显下降。设计前一定要查材料色散数据库确认工作中波段内k值是否可接受。推荐用refractiveindex.info查实验数据别用近红外参数硬套。第二个坑是相位缠绕。单元库扫描得到的相位通常落在(-π, π]之间如果你直接把数据画出来插值会在相位跳变的地方出现伪影。用numpy.unwrap展开相位后再拟合映射关系是必需步骤。我第一次做的时候忘了这一步生成的版图在透镜中心到边缘过渡处出现了几圈“乱码”单元聚焦效率直接掉了15%。第三个坑是单元高度与深宽比。中红外波长比可见光大得多单元高度至少要1μm以上才能覆盖完整2π相位。但这意味着柱子的深宽比可能达到4:1甚至更高——这对加工工艺提出了极高要求。流片前一定要和工艺线确认最小线宽和最大深宽比。很多设计在仿真阶段完美一加工出来柱子倒了就是这个原因。第四个坑是聚焦效率的计算口径。不同的文献对标“聚焦效率”可能有完全不同的定义有的计算焦平面能量在艾里斑内的占比有的是全透镜透射能量占比有的甚至直接取PSF峰值强度。复现论文时如果用了错误的口径对比数据结果看起来会比原文“差很多”其实是统计方式不一致。我的习惯是在代码里把三种口径全部算出来写报告时同时注释清楚。第五个坑是大数值孔径时的边缘入射角。FDTD仿真能真实模拟出这个效应但如果你用“垂直入射单元库”查表边缘区域的设计相位会与真实相位出现偏差。NA0.55时透镜最边缘单元的有效入射角约为33°。如果追求效率超过80%的设计一定要用带角度扫描的单元库。第六个坑是内存不足问题。直径100μm透镜全FDTD仿真需要的内存轻松突破128GB——这在普通工作站上根本跑不动。实际项目中我用的方案是先用RCWA快速验证整体设计的正确性再用FDTD仿一个直径10μm的小透镜验证聚焦PSF和效率两者一致后整个大透镜才送流片。仿真在流程中的定位是“提前发现低级错误”不是“唯一证明手段”。超越复现代码自由之后的新问题写到这里我已经把从复现经典到代码自由的路程完整走完了。说到底“代码自由”不是一个终点它只是把设计能力从“依赖文献”变成“依赖自己”之后获得的自由空间。接下来你会遇到更复杂的问题——比如怎么优化单元结构降低损耗怎么把超构透镜和焦平面阵列芯片做集成怎么用逆向设计替代人工扫描单元库。但有了这套流水线这些问题都具备了被“动手解决”的前提而不是停留在想象里。最后分享一个小原则超构透镜设计的价值不在于你会不会跑Lumerical或者写GDS而在于你能不能在2小时内把一个新想法变成可仿真的模型、可流片的版图。复现经典是验证自己是否真的理解了原理代码自由则是加速迭代的唯一途径。希望这篇分享能帮你少走一点弯路多留一点时间给更有意思的想法。
RELATED

相关推荐

从零实现Live2D看板娘:原理、交互与部署避坑指南

从零实现Live2D看板娘:原理、交互与部署避坑指南

简介:面向Web前端爱好者的Live2D看板娘定制资源包,完整打包了由JavaScript、CSS与HTML驱动的交互模型工程与配套素材。资源共570个文件,整体约90.3MB,以mtn动作数据、png贴图、wav/mp3音频、json配置与前端html/js文件为主&#x…

📅 2026/10/6 14:20:50
C++动态链接库开发实战:从导出机制到部署排错

C++动态链接库开发实战:从导出机制到部署排错

1. 动态链接库到底解决了什么问题说到C动态链接库,很多人第一反应是:DLL这东西,平时写代码从来不主动碰它,但一旦程序报错,十有八九都跟它有关系。比如有人在旧电脑上启动某个程序,直接弹“无法定位程序输入…

📅 2026/10/6 14:15:50
数据产品实战:指标体系、权限安全与性能优化全攻略

数据产品实战:指标体系、权限安全与性能优化全攻略

1. 先把数据产品说清楚:它到底解决什么问题 做数据产品这些年,最常被问的一句话是"你不就是做报表的吗"。每次听到我都想叹气——报表只是数据产品最原始、最不起眼的一种形态。真正的数据产品,是把数据加工能力、分析逻辑和业务决…

📅 2026/10/6 14:15:50
MORE NEWS

更多资讯

📰

铁路轨道故障图像识别:380张标注数据如何训练YOLO小模型

简介:铁路轨道故障图像识别数据集适用于深度学习图像分类任务,主要面向轨道交通运维、缺陷检测方向的开发者和学习者,用来训练区分轨道损坏与未损坏状态的二分类模型。包内包含约380张已标注图像,并按照训练集、验证集、测试集预先…

📰

微信小程序+SSM+MySQL日语词库毕设:从建表到答辩全流程指南

简介:面向本科毕业设计的日语词汇学习小程序完整项目包,适合计算机相关专业学生完成微信小程序与SSM后端及MySQL的课程设计或毕业设计。系统同时提供用户端与管理员端,用户可查看N2词汇、签到打卡、在线练习,管理员可维护用户、词…

📰

Codejock Xtreme Toolkit Pro v15.3.1 在 VS2017 下的编译与避坑指南

简介:本资源为 Codejock Xtreme Toolkit Pro v15.3.1 的完整源码包,面向使用 MFC 开发桌面应用的 C 程序员,尤其适合需要在 VS2017 环境下集成专业界面控件的开发者。包内已将所有 .sln 工程属性统一调整为 VS2017 的 32 位与 64 位配置&…

📰

Windows H.264解码库实战:从编译到渲染的完整指南

简介:这是一份面向Windows平台开发者的H.264视频解码库资源,由用户rapidly552分享,适合需要在自有应用中集成视频解码能力的C/C工程师,尤其是涉及流媒体播放、视频编辑或数字电视广播场景的中级开发者。压缩包共194个文件&#xf…

📰

MFC车型识别与颜色识别:从OpenCV传统视觉到ONNX深度学习落地实践

简介:基于MFC框架的车型与车颜色识别系统完整工程包,面向计算机视觉、智能交通领域的开发者和进阶学习者,解决车辆自动检测、分类与颜色判别的实际需求。压缩包共117个文件,约24.86MB,包含C源码、训练数据、工程配置及…

📰

AI画布交付文件总是混在一起?用源文件、预览图和发布图三层目录分开管理

同一张视觉稿往往同时存在可编辑源文件、沟通预览图和平台发布图。把三者混在一个文件夹里,最容易出现“拿错版本、压错尺寸、覆盖源文件”的交付事故。 本文用三层目录和文件状态字段,建立一条可追溯的输出链。凡达Ai画布仅作为项目语境,不…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬