基于Python的自适应光学(AO)工具集,可用于简化AO系统的建模和分析流程,包含光传播、波前传感器等
AOtools 是一个开源的 Python 工具包,专为AO研究和应用而设计。它由全球多位 AO 科学家共同开发,旨在为研究人员和工程师提供一个统一、可靠且易于使用的工具集合,避免重复造轮子,提升研究效率。
它提供了丰富的模块,涵盖了自适应光学系统中的多个关键方面,包括大气湍流建模、波前传感器模拟、图像处理以及光学传播模拟等功能。下面演示如何实现工具的安装以及部分模块的使用吧。
依赖项:Python ≥ 3.6
必要包:numpy、scipy、matplotlib、numba
Conda 安装,自动拉取并安装所有依赖
conda install -c aotools aotools
Pip 安装
pip install aotools
从源码安装
# 解压或 git clone 到本地目录
cd aotools-1.0.7
python setup.py install
四大核心函数:angularSpectrum(角谱法传播)、oneStepFresnel(一步 Fresnel 近似衍射)、TWoStepFresnel(两步 Fresnel 近似衍射)、lensAgainst(透镜焦平面衍射(物平面紧贴透镜))
1. angularSpectrum
Uout = angularSpectrum(inputComplexAmp, wvl, inputSpacing, outputSpacing, z)
源代码:
- inputComplexAmp (ndarray):源平面上 N×N 的复振幅数组
- wvl (float):光波长(m)
- inputSpacing (float):源平面采样间距 d₁ (m/px)
- outputSpacing (float):目标平面采样间距 d₂ (m/px)
- z (float):传播距离 z (m)
2. lensAgainst
Uout = lensAgainst(Uin, wvl, d1, f)
源代码:
- Uin (ndarray):入瞳(源)复振幅
- wvl (float):光波长(m)
- d1 (float):入瞳平面采样间距 (m/px)
- f (float):透镜焦距 (m)
3. oneStepFresnel
Uout = oneStepFresnel(Uin, wvl, d1,d, z)
源代码:
- Uin (ndarray):源平面复振幅
- wvl (float):光波长(m)
- d1 (float):源平面采样间距 (m/px)
- z (float):传播距离 (m)
4. twoStepFresnel
Uout = twoStepFresnel(Uin, wvl, d1, d2, z)
源代码:
- Uin (ndarray):源平面复振幅
- wvl (float):光波长(m)
- d1 (float):源平面采样间距 (m/px)
- d2 (float):目标平面采样间距 (m/px)
- z (float):总传播距离 (m)
下面演示从相位屏产生复振幅、再用两步 Fresnel 衍射到指定采样间距的完整流程
import numpy as np
import matplotlib.pyplot as plt
from aotools.turbulence.phasescreen import PhaseScreenVonKarman
from aotools.opticalpropagation import twoStepFresnel
from aotools.functions.pupil import circle
# 参数
N = 256 # 网格大小
dx = 5e-3 # 源面采样间距 m/px
d2 = 2e-3 # 目标面采样间距 m/px
wvl = 632.8e-9 # He–Ne 激光 λ
z = 0.2 # 传播距离 m
radius = 80 # 入瞳半径 px
# 1. 生成大气湍流相位屏
screen = PhaseScreenVonKarman(N, dx, r0=0.15, L0=30.0, random_seed=1)
phase = screen.scrn
# 2. 构造入瞳复振幅
pupil = circle(radius, N)
Uin = pupil * np.exp(1j * phase)
# 3. 两步 Fresnel 传播到新的采样间距
Uout = twoStepFresnel(Uin, wvl, dx, d2, z)
# 4. 计算并显示归一化强度
psf = np.abs(Uout)**2
psf /= psf.max()
plt.imshow(psf, extent=[-N/2*d2, N/2*d2, -N/2*d2, N/2*d2])
plt.xlabel('输出面横坐标 (m)')
plt.ylabel('输出面纵坐标 (m)')
plt.title('Two–Step Fresnel PSF')
plt.colorbar(label='归一化强度')
plt.show()
免责声明:本文旨在传递更多科研资讯及分享,所有其他媒、网来源均注明出处,如涉及版权问题,请作者第一时间联系我们,我们将协调进行处理,最终解释权归旭为光电所有。