本帖最后由 伊人在水一方 于 2025-10-13 17:33 编辑
Zemax—Matlab API 交互教程(8)_在FFT MTF中检索数据
附件:
相关教程:
Zemax—Matlab API 交互教程(1) _初始化:http://www.optzmx.com/thread-42088-1-1.html
Zemax—Matlab API 交互教程(2) _插入评价函数操作数:http://www.optzmx.com/thread-42091-1-1.html
Zemax—Matlab API 交互教程(3) _插入操作数并进行优化:http://www.optzmx.com/thread-42095-1-1.html
Zemax—Matlab API 交互教程(4) _批量添加操作数_从高斯光到平顶光:http://www.optzmx.com/thread-42099-1-1.html
Zemax—Matlab API 交互教程(5)_新文件和快速聚焦:http://www.optzmx.com/thread-42325-1-1.html
Zemax—Matlab API 交互教程(6)_NSC光线追迹:http://www.optzmx.com/thread-42382-1-1.html
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 代码功能:
% 加载示例文件(….\sequence\Objectives\Cooke 40 degree field.zmx),
% 并打开新的FFT MTF分析窗口。修改最大频率和采样。更新结果并绘制数据图;
% OpticStudio 重新创建FFT MTF图。
% 参考官方示例代码:"Documents\Zemax\ZOS-APISampleCode\MATLAB\MATLABStandalone_04_pull_data_from_FFTMTF.m"
% 代码已测试成功
% 相关附件已上传
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% =============== 1. 初始化 Zemax 连接 ===============
% 添加路径,此路径为你的:文档\Zemax\ZOS-APIProjects\MATLABZOSConnection1
addpath("C:\Users\Documents\Zemax\ZOS-APIProjects\MATLABZOSConnection1");
TheApplication = MATLABZOSConnection1;
TheSystem = TheApplication.PrimarySystem;
%% =============== 2.打开示例文件 ==============
sampleDir = TheApplication.SamplesDir; % 获取官方示例文件目录路径,SamplesDir表示的路径是: Documents\Zemax\SAMPLES
% 构建示例文件路径(Cooke 40度视场镜头)
testFile = System.String.Concat(sampleDir, '\Sequential\Objectives\Cooke 40 degree field.zos');
TheSystem.LoadFile(testFile, false);% 加载文件(false表示不保存当前系统)
%为了防止改变官方的示例文件,也可以把示例文件复制到到其他路径,改为自定义路径,别忘了路径后面还需要填写文件名和后缀.ZMX
% sampleDir_yours ="C:\Users\Desktop\savefile";% 将sampleDir替换为其他的路径
% testFile = fullfile(sampleDir_yours, 'new2.ZMX');% 路径拼接
%% ===============3.创建FFT MTF 分析==============
newWin = TheSystem.Analyses.New_FftMtf(); % 创建FFT MTF 分析
%% 配置分析参数
newWin_Settings = newWin.GetSettings(); % 获取设置对象
newWin_Settings.MaximumFrequency = 50; % 设置最大空间频率为50cycles/mm
newWin_Settings.SampleSize =ZOSAPI.Analysis.SampleSizes.S_256x256; % 采样尺寸256x256
%% 执行分析并获取结果
newWin.ApplyAndWaitForCompletion(); % 执行分析并等待完成
newWin_Results = newWin.GetResults(); % 获取分析结果,注意,这里的分析结果并不是具体的数据,后面的数据处理需要从此进一步调用
%% =============== 4.FFT MTF 绘图 ==============
%% 创建绘图窗口
figure('position', [50,150, 900, 600]) %指定窗口位置和大小
hold on; % 允许叠加绘图
grid on; % 显示网格
%% 从newWin_Results中读取数据
dataSeries = newWin_Results.DataSeries; % 获取分析数据
% 生成颜色映射(根据数据系列数量)
cc = lines(double(newWin_Results.NumberOfDataSeries));
% 遍历所有数据系列
for gridN =1:newWin_Results.NumberOfDataSeries
data =dataSeries(gridN);% 获取当前数据系列
% 提取Y数据(MTF值,包含子午方向和弧矢方向数据)
y =data.YData.Data.double; % 矩阵格式:Nx2
% 提取X数据(空间频率)
x =data.XData.Data.double;
% 绘制子午方向曲线(实线)
plot(x, y(:,1), '-', 'color',cc(gridN, : );
% 绘制弧矢方向曲线(虚线)
plot(x, y(:,2), ':', 'color',cc(gridN, : );
end
%% 绘制图表
title('FFT MTF'); % 标题
xlabel('Spatial Frequency incycles per mm'); % X轴标签
ylabel('Modulus of the OTF');% Y轴标签
% 图例说明(对应不同视场角)
legend('0^\circ tangential','0^\circ sagittal', '14^\circtangential', ...
'14^\circ sagittal', '20^\circtangential', '20^\circ sagittal');
✨感谢阅读,您的点赞是我持续分享的动力。喜欢的话麻烦下方点个赞吧!✨

|