ZEMAX | 使用API模擬旋轉(zhuǎn)對稱不規(guī)則性(RSI)
繼上次的內(nèi)容 《ZEMAX | 旋轉(zhuǎn)對稱不規(guī)則性(RSI)簡介》 ,在這篇文章中,我們將展示 Zemax 應(yīng)用程序編程接口(ZOS-API)與 Matlab 的強大功能如何用于模擬關(guān)鍵制造缺陷,例如拋物面鏡上的旋轉(zhuǎn)對稱不規(guī)則性(RSI)。
旋轉(zhuǎn)對稱不規(guī)則性(RSI) 是指光學(xué)表面形狀中的一組旋轉(zhuǎn)對稱誤差。誤差由 Zernike 多項式表示,具有三階球差和高階球差的形式。
拋物面鏡示例
我們將演示如何向拋物面鏡添加 RSI 和總不規(guī)則性。示例為F/3,有效焦距為150 mm的反射鏡。
為了演示,我們將根據(jù)以下規(guī)范在表面上添加總不規(guī)則性和 RSI :
這將在表面上放置1個完全不規(guī)則的P-V波,以及0.3個P-V波的PSI。以納米為單位,這將是500 nm的總表面不規(guī)則性和150 nm的RSI。
代碼結(jié)構(gòu)
我們創(chuàng)建了示例 Matlab 代碼來對 RSI 進行建模。此代碼包括與建模不規(guī)則性和RSI 相關(guān)的函數(shù)。函數(shù) prepare surface 將標準或均勻非球面表面更改為 Zernike 標準凹陷表面。還包括幾個基本的支持功能,例如用于顯示來自.ZMX文件的鏡頭數(shù)據(jù)編輯器 (LDE) 信息的顯示LDE。
最重要的函數(shù)是 AddBC(表面數(shù),波長,B,C),其中B是最大總表面不規(guī)則度,C是最大允許 RSI。AddBC 函數(shù)的工作原理如下:
為RSI項分配隨機值:Z11、Z22、Z37和Z56。
檢查RMS表面誤差。
縮放以達到C的正確值。
這僅需要一次縮放,因為將每個Zernike系數(shù)縮放一個常數(shù)會使RMS縮放相同的常數(shù)。
將隨機值分配給模型B的其他Zernike多項式,完全不規(guī)則。
在不干擾RSI項的值的情況下使用:Z11、Z22、Z37和Z56。
使用Z5 – Z37模擬總不規(guī)則性。
迭代縮放Zernike項以達到正確的總不規(guī)則性。
在交互模式下運行Matlab示例代碼
與Matlab的API交互模式很方便,因為您可以使用 Matlab 命令行控制 API。這使您可以即時嘗試新命令和更改命令。
您可以從編程選項卡中選擇 Matlab,然后選擇交互式擴展,以交互模式進行連接,如下所示:
連接代碼將自動打開:
回到 OpticStudio,單擊變成選項卡上的“交互式擴展”將使 OpticStudio 進入“偵聽”模式。
在 Matlab 中,現(xiàn)在可以使用以下命令進行連接:
>> TheApplication = MATLABZOSConnection9(7)
請注意,您的 MATLABZOSConnection 編號和實例可能與此處給出的不同。例如,如果這是您第一次連接,您可能有 MATLABZOSConnection(1)。
使用Matlab模擬RSI
建立連接后,我們可以從 Matlab 命令行加載 .ZMX 文件并從文件中收集信息,如下所示:
>> primary system = TheApplication.PrimarySystem
>> theLDE = primarySystem.LDE
>> theMFE = primarySystem.MFE
>> systemData = primarySystem.SystemData
>> savefilename = System.String.Concat
(pwd,'\LensFileForTesting.zmx')
>> primarySystem.SaveAs(savefilename)
所有必需的函數(shù)都包含在文件 ErinsABCFunctions.m 中。通過在 Matlab 中打開它,我們可以加載各個函數(shù)。
>> abc = ErinsABCFunctions
我們通過將其更改為 Zernike 標準凹陷表面來預(yù)設(shè)表面。
>> ldetable = abc.displayLDE(primarySystem); disp(ldetable);
>> surfacetable = abc.prepareSurface(primarySystem,3);
disp(surfacetable);
上述兩個命令的輸出如下所示:
稍后,我們將設(shè)定鏡面的起始缺陷。
>> startingsag = abc.getSag(primarySystem,3);
>> figure(); imagesc(startingsag); axis square;
現(xiàn)在我們可以使用 AddBC 添加 B和C 的表面不規(guī)則性。
>> bctable = abc.AddBC( primarySystem, 3, 500.0, 1, 0.3);
>> disp( bctable);
請注意,此時,如果我們正在運行公差,我們可以在調(diào)用 AddBC 時為 B和C 選擇隨機值。收集鏡子的擾動缺陷,并減去起始缺陷,使表面誤差擾動可見。
>> bcsag = abc.getSag( primarySystem, 3);
>> sagdiff = bcsag-startingsag;
>> figure(); imagesc( sagdiff ); axis square;
我們也可以檢查這些表面誤差的最終P-V。
>> abs(max( sagdiff(:))-min( sagdiff(:))
/ (500*10^-6))
該值為0.995,而不是我們要求的B = 1.000。這是與縮放 Zernikes 的迭代期間使用的精度設(shè)置有關(guān)。更嚴格的精度設(shè)置將返回更接近1.000的結(jié)果,但計算時間會更長。
完成模擬后,我們關(guān)閉交互模式。
>> TheApplication.CloseApplication()