文章目录
- 光场和光束
- 基础孔径
- 屏幕
光场和光束
LightPipes主要用于物理光学和光束传输仿真,基于角谱法(Angular Spectrum Method)、菲涅耳衍射(Fresnel diffraction)、夫琅禾费衍射(Fraunhofer diffraction)等经典物理光学理论,能够模拟光波在自由空间、通过光学元件(如透镜、光阑、相位板等)以及受扰动(如像差、湍流)后的传播行为。
在Python中可用pip安装该库
pipinstallLightPipes作为入门示例,下面创建一个633nm波长的光场,并在光束传播的法平面上取出10mm的方格,进行512 × 512 512\times512512×512栅格化。然后基于此光场,创建一个束腰为1mm的高斯光束,并传播1m,其光斑图像为
代码如下
fromLightPipesimport*importmatplotlib.pyplotasplt plt.rcParams['font.sans-serif']='Times New Roman'# 创建高斯光束Field=Begin(10*mm,633*nm,512)Field=GaussBeam(Field,w0=1*mm)# 束腰 1mmField=Forvard(Field,1*m)# 传播 1 米# 光强可视化plt.subplot(121)plt.imshow(Intensity(Field),cmap='hot')plt.subplot(122)plt.imshow(Phase(Field),cmap='hot')plt.show()【Begin】是LightPipes的开始指令,用于生成光场,其输入参数分别是方孔尺寸、波长以及栅格线数。
【GaussBean】用于生成高斯光束,其输入参数分别是激光注入的光场和高斯光束的束腰。此外,该函数还有一些可缺省参数,其中
- x_shift, y_shift 用于设置x , y x,yx,y方向的偏移
- tx, ty 用于设置x , y x,yx,y方向的倾斜角,单位是弧度
- doughnut 为True时,生成环形光束(常用于L G 01 LG_{01}LG01模近似)
- LG 为True时,生成Laguerre-Gaussian光束
【Forvard】可将光场传输一段距离,其输入参数除了光场、距离之外,还有一个usepyFFTW,为True时,将使用pyFFTW库来实现快速Fourier变换(FFT),否则使用自身的FFT。
【Intensity】可获取光场的强度分布,其输入参数除了光场外,还有一个flag用于归一化,默认为0,即不进行归一化;为1时归一化到1;flag=2时归一化到255。
【Phase】用于获取光场的相位分布。
基础孔径
LightPipes提供了三种基础孔径和屏幕,分别是
| 孔 | 屏 | |
|---|---|---|
| 圆形 | CircAperture | CircScreen |
| 矩形 | RectAperture | RectScreen |
| 高斯型 | GaussAperture | GaussScreen |
三种孔径如图所示
代码如下
fromLightPipesimport*importmatplotlib.pyplotasplt Field=Begin(10*mm,532*nm,512)dct={}dct["Circle"]=CircAperture(Field,0.7*mm,1*mm,1.5*mm)dct["Rect"]=RectAperture(Field,1*mm,1*mm,-1.5*mm,-1.5*mm,-0.002)dct["Gauss"]=GaussAperture(Field,4*mm,0,0,1)fori,keyinenumerate(dct):ax=plt.subplot(131+i)ax.imshow(Intensity(0,dct[key]))plt.title(key+" Aperture")plt.axis('off')plt.show()屏幕
官方文档提供了一个屏幕遮挡的示例
GridSize=10*mm GridDimension=256lambda_=1000*nm#lambda_ is used because lambda is a Python build-in function.R=2.5*mm#Radius of the aperturexs=1*mm;ys=1*mm#shift of the apertureField=Begin(GridSize,lambda_,GridDimension)Field=CircScreen(0.7*mm,1*mm,1.5*mm,Field)Field=RectScreen(1*mm,1*mm,-1.5*mm,-1.5*mm,-0.002,Field)Field=RectScreen(1*mm,3.5*mm,-2*mm,2.5*mm,30,Field)Field=GaussAperture(4*mm,0,0,1,Field)I=Intensity(0,Field)plt.imshow(I);plt.axis('off')plt.show()