1. Zemax非序列追迹(2025-07-24)
1-1. 在进行0视场追迹的时候,通过路径分析发现到达探测器的光线只有36%,为了解决这个问题,之后又给很多面镀了AR膜,探测器光线确实变多,但是发现这样做没有必要:因为透过率低没有问题,只要不影响成像即可。(没有要求能量随时率低?再查一下) 1-2. 在Zemax非序列模式下删除了所有镜片的镀膜,打开所有椭圆光源进行追迹,通过探测器查看器查看成像质量,找到抑制鬼像的关键面并镀膜,重新使用各个单光源进行杂散该光分析。
2-1. 尝试打开所有光源,考虑镜筒CAD文件进行非序列追迹。发现“能量损耗(错误)”很大,甚至大于“能量损耗(阈值)”,查询Zemax用户手册,发现又多种可能原因: “有时几何误差或舍入误差会导致光线追迹无法继续进行。几何误差通常是由欠定义的实体或不合适的物体嵌套所导致的。当某个表面的迭代失败或者无法计算膜层数据时,有可能造成一些光线的入射点和折射数据计算有误。当光线经过物体的交切点、嵌套层或线段数量达到所设定的最大值时,光线追迹同样会报错并中止。光线追迹控制会将这类错误造成的损耗显示在能量损耗(错误)中。 ”
2-2. 最终暂时放弃解决这个问题,由于:如果我使用加了镜筒的完整模型A与完整缩比模型B来对比的话,我依旧需要SW来设计B的镜筒STEP文件,做到这一步的话,我完全可以通过TracePro来进行杂散光分析,而不是Zemax。 所以简便起见,我暂时搁置加入镜筒导致的追迹错误,决定先用裸镜头组来比较A、B模型,明天缩比序列模型B,随后NSC非序列追迹。
2. Zemax非序列追迹——探测器查看器(2025-08-07)
X_IAGT(n,v):在物体n上绝对强度大于v值的光线。如果光线不交于物体,则该标志为false。X_IALT(n,v):在物体n上绝对强度小于v值的光线。如果光线不交于物体,则该标志为false。 其中 v 的单位需与光线强度单位匹配。 例如:如下图,若光线强度单位是 “瓦特”,且探测器峰辐照度为 48.89 W/cm²(总功率 7.41 W,探测器面积 124mm×124mm≈153.76 cm²,则平均单光线强度≈7.41 W / 4400 条 ≈ 0.0017 W/条)。

此时若设置 X_IAGT(34, 0.0017),可筛选出单光线强度仅 > 0.0017 W的像素点,即这些像素点至少被两条光线击中。
一点思考:此时设定的X_IAGT(34, 0.001),此阈值下总撞击数刚好为我此次追迹设定的总光线数4400,似乎是刚好过滤掉鬼像等光线。后续尝试(如下图),设定字符串!G0筛选出非鬼像光线,此时撞击数恰好是4400,证明了X_IAGT(34, 0.001)确实过滤掉了鬼像。

3. Zemax探测器查看器概念解释(2025-08-07)
- 1、非相干照度 :随探测器上空间位置变化的单位面积上的非相干辐射通量。是光线辐照度的叠加,不考虑相位因素。与其对应的是,相干辐照度,是光线复振幅相加,考虑相位因素,得到的是相干辐射通量。也就说后者会考虑相干因素;
- 2、峰值辐照度:光束中任意点的单位面积的最大功率;
- 3、总功率:对整个光束辐照度的积分(也就是光束总能量)。这里边辐照度你就可以理解成光功率密度,只是差一个视见函数而已。至于总功率为什么会随之探测器大小变化,我觉得是因为当探测面小时,其实部分光线未被接收所以导致小探测器的功率也小,另外大的探测器面也会接收一些杂散光,只能要把光斑包住,两者应该差距不大;
- 4、非相干辐照度,即每个像素点对应辐照度值。
4. 像素点功率数据分析遇到问题(2025-08-12)
- 1、不同强度的杂散光对望远镜成像的影响?(用来划分不同灰度区间的比较权重)
5. Matlab数据对比方案(2025-08-14)
数据分析
- 1、梳理之前的结果:方案一:以探测器中心为圆心,逐渐增加圆半径,圆域内相同灰度区间像素个数统计、强度加权统计+差集区域分析,仅使用鬼像数据,结论:平均相似度较高。方案二:统计各强度区间像素点数量、加权值,说明功率相似性(
Code:sta_scrip.m),同时通过SSIM说明结构相似性(Code: SSIM_UQI.m),总体说明相似度。 - 2、引入SSIM和UQI指标来比较两系统的相似性和可替换性,具体可参考PSNR、SSIM等图像质量评估指标详解。
Code:"C:\Users\Lyra Alpha\Documents\MATLAB\tools\SSIM_UQI.m" - 3、根据杂散光评价指标来对比:分别根据两个系统得到的逐像素功率数据进行杂散光评估、比较它们的相似性和可替代性。
Code:stray_light_evaluation.m 和 stray_light_evaluation2.m
数据预处理
注意:如果直接使用原系统与缩比系统探测器数据4096×4096矩阵作为原始数据进行对比分析,结果将出现不合理的差距。这种结果的原因是光线追迹的随机性会导致每次追迹时,追迹光线必然会出现轻微的偏移,但是4096×4096矩阵将探测器划分得过于精密,导致光线只要出现一点点细小的偏移就有较大得概率落在与上一次不同但相邻或接近得像素点,从而异常拉低两矩阵相似度。 考虑两种解决方案: (1)对原始矩阵先进行卷积操作再分析;(建议) (2)对同一个系统进行两次追迹得到两个4096×4096矩阵,做相似性分析作为对照。用研究内容得相似度除以这两个矩阵得相似度。
6. 进度(2025-09-06)
总结一下这段时间的进度:
- 1、之前对灰度的理解有误,之前的想法是将得到的150×150功率密度矩阵作为初始数据进行后续的分析,划分不同的功率密度区间,每个区间作为一个灰度来进行统计分析。这样其实不正确,实际情况下,探测器并没有办法得到像面上每个像素点处具体的功率值,这个功能是光功率计的功能,光功率计可以放到系统前探测具体功率,但是不能封装在光学系统内部,在像面上放置的其实是探测器,而它只能探测灰度值,是纯图像信号。
- 2、那么后续的所有分析与统计都要基于实际中可以得到的数据(即灰度值),所有只需要将之前的150×150功率密度矩阵(单位是W/cm2)转换为150×150灰度矩阵即可。 转换基于公式:
Vana=R×Popt+Vdark。其中 Vana 为输出电压,R 为探测器响应度,V_{dark} 为暗电流电压。随后设定相关参数,量化位数根据区间自动计算(如下设定条件下量化位数 N:16位(灰度范围0~65535)),将电压转换为灰度值。总体路径:功率密度→模拟电压→灰度值。 有一个问题:探测器响应度的计算值不一定能在现实中找到合适的探测器。 - 3、使用灰度数据重新进行分析,考虑两种方法:SSIM、UQI、MSE、相关系数,在设定半视场内相似性极高;圆域+差集分析,在设定视场内外相似性均很高。
- 4、在Soildworks中将原机械结构文件转换为零件后可以进行缩放,缩放后直接得到缩比机械模型。原系统和缩比系统的完整光机系统分别在0°视场进行非序列追迹,得到光功率密度矩阵,存于文件
compare_systems_01ob_8000l_raw_cone.xlsx,通过上述方案进行分析,结果很好。但是有个问题:Zemax追迹时,由于“错误”而停止追迹的数值很大,需要进一步分析是否为正常现象。
7. 关于Synopsys学习(2025-11-12)
1. 背景
- 之前构建的系统是一次成像系统,现在发现二次成像系统更好,具体可以参看“光学设计学习”专题,也可以问AI;
- 已有系统使用的玻璃材料难以生产(加工难度高、有毒、成本高等)。
所以决定重新构建望远系统。通过Synopsys构建中红外望远系统的初始结构(选用522.8mm焦距系统),记录学习软件过程遇到的问题及解决方案。
2. 学习记录
1、找了一段DSEARCH.MAC初始结构搜索宏(可见光区的广角目镜)运行,成功跑通初始结构,样例链接:SYNOPSYS 光学设计软件课程三十七:自动查找和更改镜头结构 2、随后查询命令含义,按望远系统需求修改宏,运行报错,红外材料找不到。红外材料与可见光搜索方法有异,需要指定红外材料,找到可行宏语句:
GLASS POS ! 指定正透镜玻璃材料G D-FK61GLASS NEG ! 指定负透镜玻璃材料G H-ZF883、由2延申到正负透镜的搭配,记录在:镜头设计中透镜材料的选择及搭配 4、接2,更改了材料(选用Synopsys的红外材料库Unusual,用U表示)后运行报错:GLASS-TABLE ERROR OR CONFLICT WITH MULTIPLE CORES(玻璃表错误或与多个核心冲突)。找到原因:增加材料时,U前面不能出现其他字符,空格也不行。
删除之后可以运行,如果此时报错:NO GOOD CASES FOUND,应该是没有找到类似的初始结构,可以尝试更改搜索参数尤其是材料。
正常运行之后,如果搜索得到结构像面在最后一片透镜之前,说明正负透镜材料的设置可能反了,交换POS和NEG的材料后尝试,可以得到正常结构。
5、尝试不同的正负透镜组合,多次搜索,发现模型形状难看,发现它居然像是广角镜头(佩服我自己,这都能看出来),突然想起来用的是广角目镜的搜索宏,只修改了系统参数,并未修改优化参数(约束),后续学习优化参数的使用方法。
8. 系统设计及公差分析(2025-12-07)
- 重新设计中红外望远系统:采用7片透镜,两个非球面,二次成像系统,光阑置于像面之前。
- 系统所有材料均可找到供应商(包括成都光明的HWS系列和SILICON等常用材料),随后进行数据标准化(厚度保留两位小数,曲率半径保留三位小数),固定净口径(已保留5%净口径余量)。
- 效果:除边缘视场外,点列图均小于艾里斑,MTF全视场大于0.55。


- 进行公差分析以及收缩公差 首先根据现代光学加工等级表(如下图)填写公差分析向导,软件会在公差数据编辑器自动生成函数,随后运行公差分析得到结果。

随后收缩公差,可以参考Zemax教学视频第五弹——公差分析,最终得到公差数据结果如下图。

这个效果应该还可以,但是对公差分析时MTF和RMS光斑半径标准并不是很明确,目前对公差效果的判断来源于网上的信息即一些论文,发了个帖子提问,蹲回答:中红外系统设计的MTF标准
9. NSC转换与非序列模式(2025-12-13)
转换之后自动生成矩形探测器和光源,接下来手动添加颜色探测器,注意为颜色探测器的Z位置设置一个小量,否则会挡住其他视场的矩形探测器。选择光线追迹,在探测器查看器查看。
10. 缩比方式
考虑多种缩比方式:
- 方案一:将整合后的系统A(透镜厚度、曲率半径保留特定小数位,固定口径)按焦距缩比得到系统B’,此时系统B’的小数位会变得不再符合要求,进行小数整合,重新保留小数,但是不进行优化,最终可以得到符合加工要求的系统B,进行后续的公差分析和NSC追迹。注:可以慢慢调,找到一个平衡点,比如如果某个变量四舍五入会造成像质明显下降:假设增大了凸透镜前一面厚度,那么就增大一点前一面的曲率半径。
- 方案二:直接对未整合的系统A’进行缩比得到系统B’‘,随后进行小数整合……但是这样的路径,两个系统都不可以在整合系统时进行优化,否则两系统的参数很可能不再具有缩比映射性。
注:系统A'在整合为系统A过程中,使用了局部优化。
本项目目前使用方案一推进,给出公差对比图如下:

左列为点列图公差,右列为MTF公差; 第一行为方案一得到的系统B的公差,第二行为系统A的公差,第三行为方案二得到的未经整合系统B’‘的公差。
11. Solidworks光机结构建模(2025-12-20)
模型导入
在 Zemax 中,点击顶部菜单栏的 File (文件) -> CAD Files (CAD文件)导出STEP文件; 打开Solidworks,点击 打开 (Open),选择刚才导出的 STEP 文件,点击打开对话框(资源管理器)中的 选项 (Options),配置为如下图选项:

随后会打开SW系统界面,并弹出如下界面:

点击确认并保存即可,这样每个透镜会成为装配体中的一个独立零件,方便后续管理。
注:如果前面的弹窗未正确出现,并且最终导入的文件并不是以装配体(.SLDASM)的格式,而是以零件的格式(.SLDPRT),这种情况下SW左边的零件列表栏应该是一系列蓝色的import num图标,而不是黄色的surfaces num图标(如下所示)

这个问题是Zemax未按预期方式导出文件导致的(我觉得是这样),应该与SW的PMI选项有关。解决方案:打开Zemax设置 -> OpticStudio选项 -> 常规,勾选使用Parasolid数据库选项即可:

重新导出STEP再导入SW即可。
插入光阑与像面
光阑和像面未正确导入,删除重新插入模型。 分别插入两个新零件,在对应位置新建基准面,在基准面上绘制光阑(圆环)和像面(旋转45°)。 关于厚度的设置:像面(4096×4096)厚度设置为6mm,因为查找探测器参数指标发现 640×512 探测器一般厚度为1mm;光阑厚度设置为3mm,目前看来只需要保证机械强度即可(控制口径-厚度比)。
镜片组装配
压圈应该拧紧后可以起到固定作用,此时大概无需放置隔圈。
12. TracePro光线追迹
1. 模型导入
Solidworks 导出为 STEP 格式,用 TracePro 打开即可。
2. 设置材料
- 镜片:设置对应的玻璃材料,可以使用 python 脚本将用到的 Zemax 玻璃库导入 TracePro 再设置,非常方便;
- 机械结构(镜筒、压圈、隔圈):如果仅进行杂散光分析,可以不设置材料,影响不大,膜层的影响才是主要的。
如果设置材料,目前设置:镜筒、镜室:
Metals --> Aluminum; 压圈:Metals --> Titanium(由于内置钛波长未覆盖所需波长,暂时更换为铝); 隔圈:Metals --> Stainless Steel 304(304不锈钢)。 - 冷光阑:使用高导热材料
Metals --> Copper
3. 设置膜层
镜片:需要镀增透膜,目前选择 Default --> MgF2 Single Layer AR 单层膜,如果不能满足要求,也可以考虑成本更高效果更好的三层膜:Default --> 3 Layer AR
机械结构:全镀 Acktar --> Fractal Black #1776 (TP自带的红外消光膜)
重要:注意胶合面不要镀膜!!!
4. 光线追迹
可能会出现光线在胶合面中断(无法穿过),可能是两个镜片的胶合面有重合,本系统尝试将两胶合镜片拉远 0.0005mm,追迹成功,由于 Zemax 中设置的距离精度为小数点后三位,故不影响结果。
5. 追迹进度————原系统追迹
追迹出现问题,光线可以正常追迹,但是会报一行错:警告: 不完整的 Glass 5 有可能被加入到光线追迹之中.更糟糕的是,Glass 7 没有任何偏折作用,从 Glass 6 出射的光线视若无物地通过第七片透镜,遂排查错误。
- 排查 Glass 7 材料、镀膜、曲率设置均未出错;
- 忽略除 Glass 7 、像面、格点光源之外的所有元件,即仅对 Glass 7 进行光线追迹,发现 Glass 7 可以正常偏折光线,说明镜片设置没有问题,那么问题一定出在系统的其他地方;
- 逐步考虑(取消忽略)其他元件,找到使 Glass 7 无法偏折的问题元件。取消忽略 Glass 6 ,光路正常;继续…… 考虑到警告:
警告: 不完整的 Glass 5 有可能被加入到光线追迹之中.,大概率 Glass 5 是问题元件。故考虑所有元件,仅忽略 Glass 5 ,重新追迹,光路偏折正常,取消忽略 Glass 5 ,追迹出现异常(光线无法偏折),显然 Glass 5 就是问题元件。 - 警告显示 Glass 5 不完整,考虑是 Glass 5 和 Glass 6 出现重合部分(两片透镜胶合),忽略 Glass 6 重新追迹,依然出现警告,显然是 Glass 5 本身有问题;
- 警告原因应为:Glass 5 的几何模型不完整(比如实体未闭合、存在破面 / 缺失面、曲面导入失败等),应该是镜片组从 Zemax 导入 SW 再导入 TracePro 过程出现错误,修复模型较为麻烦,考虑重新导入Glass 5 模型:从Zemax导出STEP格式的 Glass 5 并导入 TracePro 替换原来的 Glass 5 ,设置材料、膜层等,重新追迹,成功,光线在像面处汇聚正常。 问题解决。
感想:为了减少面型错误的发生,在进行光机模型的构建过程中,可以将模型从 Zemax 中导出为STEP文件,并分别导入 SW 和 TracePro (oml)中,在 SW 中构建机械模型并将机械结构部分设置为子装配体(此时 SW 整个模型就是由两个子装配体构成),仅导出机械结构部分装配体为STEP文件,并将此文件用 TracePro 打开并保存为oml文件,这样就有两个oml文件,分别是镜片组和机械机构。用 TracePro 打开镜片组,选择插入零件,插入机械结构oml文件,这样就组装成了完整的光机结构文件。
6. 追迹进度————缩比系统追迹
由于从缩比 Zemax 模型生成缩比 SW 模型需要重新绘制机械结构,无法保证两系统几何结构完全相同,故考虑直接由原系统SW模型缩放生成缩比系统模型。 导入流程:
- 将整个原系统的 SW 装配体文件夹
SW_SecImag_simp复制过来,打开后另存为 SW 零件.SLDPRT,此时可以进行缩放 (只有零件可以缩放,装配体不可以); - 随后打开此零件,选择 “插入 -> 特征 -> 缩放比例”,比例缩放点选择原点,缩放0.5倍后保存为
SecImag_simp_Scale.SLDPRT,并另存为SecImag_simp_Scale.STEP,使用TracePro打开,保存为SecImag_simp_Scale.oml,由于 Glass 5 追迹是发生重叠错误,按上述方法生成Glass 5.oml文件并在 TracePro “插入 -> 插入零件” 选项中替换本透镜,追迹成功。 - SW 放缩过程可参考:SolidWorks装配体等比例缩放的方法
注:开始的时候使用另一种方式导入出现错误(光线不按预想的方式分布,并未在像面上汇聚成一个点,而是一个很大的弥散斑),原因是多次转换文件出现较大误差。不合理方式:没有直接复制整个原系统的 SW 装配体文件夹 SW_SecImag_simp ,而是导出为 STEP 文件( SW 打开后为 .SLDPRT 零件形式)后,缩放并再次另存为 STEP 文件 SecImag_simp_Scale.STEP,此种方式再导入 TracePro 时会出错。
7. 功率密度图像(数据)设置
FFT grid:128×128 到 1024×1024 这些表示的是探测面的像素点个数,像素点越多,图形越精细,选择不同只会影响最小最大值,如果只在于结果的效率那就没必要设置高分辨率。No.of Pixels:是做平滑处理的,给个经验值参数,20万条光线设置60-80 tracepro有选取光线区域的操作,如果出现意外光斑,可以选取这部分查看光路
进度:
- 做平滑处理时,导出的功率密度数据统计比较好看,各区间的像素数都有,但是此时 TracePro 中的
FFT grid最大只能设置为 1024×1024,不满足 4K 探测器的追迹结果。 - 不做平滑处理,则是通过
No.of Pixels设置分辨率,可以任意设置,导出的功率密度数据统计不太好看,但是转换为灰度还可以,各灰度区间的像素数都有,目前选用。
8. 内存不足
设置光线追迹阈值为1E-06,每个视场光线200环约35万条光线,内存不足追迹失败。解决方案参考 tracepro提示内存如何解决?
解决:
- 打开
应用特性 -> 选择探测器前表面 -> 将此表面设置为光出射面 - 开启
光线追迹 -> 仿真模式 (M)
9. 开启光线 (.sim)档案时的问题
- TracePro打开.sim文件方法:选择
工具 -> 拟真结果检视器,就会打开仿真模式文件管理器,选择索引文件 (.ndx),管理器会自动打开.ndx下保存的所有.sim文件列表,选择需要的打开即可。注意:如果需要重命名或者更换顺序,可以用记事本打开.ndx文件更改索引名,并重命名光线文件 (.sim),但是每次使用该模型追迹后,.ndx保存的文件名都会自动格式化,但是手动重命名的.sim文件不会,需要手动修改成对应的名字。

- 使用上述方法打开.sim文件后,可以通过辐照度选项操作作图,但是其横纵坐标是追迹时的x-y坐标,z代表法线方向,而我的探测器是旋转了45°的,所以此时导出功率密度数据 (.txt)或者作图都不符合要求,但是绘图平面方位设定也只有默认选项,无法修改使其旋转 (如下图所示)。

解决方案:在追迹之前添加绘图平面方位设定的预设选项,添加方式如下图:

打开 应用特性 -> 选择探测器前表面 -> 将此表面设置为光出射面 -> 同时加入(预设)一个方位,设置其法线和指上向量 -> 点击应用; 重新追迹,在辐照度选项的绘图平面方位设定中就会出现设置好的预设方位。
10. 错误排查
排查1
几乎得到所有数据后,发现致命问题:格点光源的尤拉角设置错误,都设置成了负角。当前设置下应该是正角才能使过格点圆形光源圆心的法线通过坐标原点。 为了修正问题,重新追迹所有视场,注意在此之前要重新设置光出射面选项中的指上向量。
排查2
matlab数据处理并可视化后,发现系统空间分布对比(差异绝对值)图像在$\theta = 1.188°、2.375°、4.75°、15°$视场下差异较大,是红色图像,而其他视场下的差异就要小很多,是蓝色图像。 回到TracePro 中查看格点光源设置发现:上述四个视场的格点光源原点 y 坐标设置有误,y 的计算公式为 $y = z*tan(\theta)$,两套系统的 y 值均为如此计算,在计算过程中保留两位小数,此时会出现误差。

修正方法:修正这四个视场下原系统 的 y 值为缩比系统对应 y 值的2 倍,避免直接计算保留小数破坏原系统与缩比系统的二倍关系,修正后重新对原系统的上述四个视场和全视场追迹并重新分析,图像全变蓝,SSIM 的特异值也恢复正常。
13. matlab图像处理
1. 修改相似性对比指标
增删一些指标在,完善stray_light_evaluation_conv_nostray.m文件。
- 单系统指标:VGI (杂光系数),SPR (峰值比),EC (能量集中度),Spread (扩展度)
- 双系统对比指标:灰度一致性回归分析,系统空间分布对比,径向平均照度分布,强度统计分布对比,穿过光斑水平截面轮廓,Log-Correlation,PST Curve RMSE,Ghost Shift (鬼像质心位移),SSIM (结构相似性),UQI (质量指数)
2. 最终文件说明
power2gray_fromTxt.m :功率密度-灰度转换,按灰度统计像素数;
stray_light_evaluation_conv_nostray.m :单视场下,方法一+方法二:详细杂散光多指标对比分析(基于卷积去噪)
stray_light_evaluation_conv_nostray_fullfield.m :多视场下,方法一 + 方法二:详细杂散光多指标对比分析(基于卷积去噪)
windows_circle2_gray_conv.m :方法三:基于卷积去噪的圆域与差集分析
3. 原始数据 4096×4096 数据集获取问题
之前的数据在TracePro中采集时,由于探测器是旋转45°放置,故保存数据时连带了下图中的四个角的黑边。
(图像使用了平滑化,实际操作中没有平滑,此处平滑是因为这样便于观察,因为4K的高密度像素图中亮点太小不宜观察)

如果直接使用此数据,为了保证红外探测器实现4K采样,那么数据采集率需要达到 $4096×\sqrt{2}$,显然这样浪费了多余的像素而且后期还要带着无用的像素处理,故通过TracePro中辐照度选项->绘图平面方位设定修改指上向量来改变辐照度图像的显示,使其只显示全探测器图,而没有多余边角,修改如下。

此设置之后,图像变为:

此时导出数据就没有多余数据。
同时变更 matlab 代码,找到正确的理想像点中心。