MATLAB实现高斯光束到平顶光束的转变 基于GS算法或者直接计算SLM相位分布。

一、程序核心目标

该程序基于Gerchberg-Saxton(GS)算法与角谱传输理论,实现光束整形功能,通过迭代优化空间光调制器(SLM)的相位分布,将初始高斯光束转换为目标超高斯(平顶)光束。程序严格遵循光学传输的数学模型,通过数值计算模拟光束在自由空间中的传输过程,并通过迭代调整相位实现振幅分布的精准调控。

二、程序文件组成与模块划分

程序由以下核心文件构成,各文件功能明确且通过数据交互形成完整流程:

  • 主程序(untitled系列.m):控制整体流程,包括参数初始化、迭代控制、结果输出
  • gussian.m:生成初始高斯光束与目标超高斯光束的振幅分布
  • free_space.m:实现基于角谱理论的自由空间传输函数计算

三、核心模块功能解析

(一)参数初始化模块(主程序)

所有计算参数在主程序起始部分定义,直接决定光束特性与计算精度,核心参数及原始定义逻辑如下:

lambda = 1.064e-6;   % 激光波长(固定为1064nm)
L = 0.5;             % 传输距离(0.5m或1m,根据版本调整)
a1 = 10e-3;          % 初始高斯光束束腰
a2 = 2e-3;           % 目标超高斯光束束腰
D = 1e-2;            % 计算区域尺寸(10mm×10mm)
N = 1024;            % 采样点数(1024×1024,2的幂次以优化FFT)
nn = 5;              % 超高斯光束阶数(控制平顶陡峭度)
itera = 120;         % 迭代次数(120/200/500,平衡精度与效率)

参数设置严格遵循光学系统实际尺寸比例,未引入假设性参数,所有数值均有明确物理意义。

(二)光束生成模块(gussian.m)

功能:根据输入参数生成初始高斯光束与目标超高斯光束的振幅分布,核心代码逻辑如下:

% 生成坐标网格
x = linspace(-D/2, D/2-D/N, N);
y = linspace(-D/2, D/2-D/N, N);
[X, Y] = meshgrid(x, y);
[~, r] = cart2pol(X, Y);  % 转换为极坐标计算径向距离

% 光束振幅分布计算
E0 = exp(-(r.^2 ./ w0^2));   % 高斯光束(二次衰减特性)
E1 = exp(-(r.^nn ./ w1^nn)); % 超高斯光束(nn阶衰减,平顶特性)

程序通过极坐标转换简化径向对称光束的计算,严格遵循高斯光束与超高斯光束的数学定义,未添加额外修正因子。生成的振幅分布直接用于后续迭代的振幅约束条件。

(三)角谱传输模块(free_space.m)

功能:基于角谱理论计算光束在自由空间传输的频域传输函数,核心公式与代码实现如下:

角谱传输函数数学表达式:

$$H(fx,fy) = \exp\left(\pm i k0 dz \sqrt{1-(\lambda fx)^2-(\lambda f_y)^2}\right)$$

其中$k0=2\pi/\lambda$为波数,$fx,f_y$为空间频率,$dz$为传输距离。

代码实现:

dfx = 1/D; dfy = 1/D;       % 空间频率间隔
k0 = 2*pi/wvl0;             % 计算波数
fx = (-N/2:N/2-1)*dfx;      % 频率坐标生成
fy = (-N/2:N/2-1)*dfy;
[fx, fy] = meshgrid(fx, fy);
% 正/逆传输函数计算(SLM到接收屏/接收屏到SLM)
H = exp(-1i*k0*dz*sqrt(1-(wvl*fx).^2-(wvl*fy).^2));
H0 = fftshift(H);           % 正传输函数
H = exp(1i*k0*dz*sqrt(1-(wvl*fx).^2-(wvl*fy).^2));
H1 = fftshift(H);           % 逆传输函数

程序严格实现角谱传输的数学模型,通过fftshift调整频率坐标顺序,确保传输函数的物理正确性,未对理论模型进行简化或近似处理。

(四)GS算法迭代模块(主程序核心)

功能:通过交替迭代优化SLM相位分布,核心流程如下:

  1. 初始复振幅构建:$U1 = A0 \cdot \exp(i\phi0)$,其中$A0$为初始高斯振幅,$\phi_0$为初始相位(通常为随机相位)
  2. 正传输计算:$U2 = \text{ifft2}(\text{fft2}(U1) \cdot H_0)$(SLM面到接收面)
  3. 接收面约束:固定目标振幅$A1$,保留相位信息:$U2' = A1 \cdot (U2 / |U_2|)$
  4. 逆传输计算:$U1' = \text{ifft2}(\text{fft2}(U2') \cdot H_1)$(接收面到SLM面)
  5. SLM面更新:保留初始振幅$A0$,更新相位:$U1 = A0 \cdot (U1' / |U_1'|)$
  6. 误差计算:通过均方根误差(RMS)评估迭代效果:$\text{RMS} = \sqrt{\text{mean}((A0 - |U1'|)^2)}$

迭代过程代码片段:

for n = 1:itera
    % 正传输
    U2 = ifft2(fft2(U1) .* H0);
    % 接收面振幅约束
    U2_new = Amplitude1 .* (U2 ./ abs(U2));
    % 逆传输
    U1_new = ifft2(fft2(U2_new) .* H1);
    % 计算误差
    RMS(n) = sqrt(mean2((Amplitude0 - abs(U1_new)).^2));
    % 更新SLM面复振幅
    U1 = Amplitude0 .* (U1_new ./ abs(U1_new));
end

程序严格遵循GS算法的原始迭代逻辑,未引入额外优化策略(部分版本中的步长因子为参数调整,非算法核心修改)。

四、程序执行流程

graph TD
    A[参数初始化] --> B[调用gussian.m生成振幅分布]
    B --> C[调用free_space.m计算传输函数H0/H1]
    C --> D[初始化SLM面复振幅U1]
    D --> E[正传输计算接收面U2]
    E --> F[接收面振幅约束生成U2_new]
    F --> G[逆传输计算SLM面U1_new]
    G --> H[计算RMS误差]
    H --> I[更新U1相位]
    I --> J{迭代次数达标?}
    J -- 否 --> E
    J -- 是 --> K[输出相位图/光束分布/误差曲线]

五、结果输出内容

程序输出三类核心结果,均基于原始计算数据,未进行美化或修正:

  1. SLM相位分布:最终优化得到的相位调制图,直接用于控制空间光调制器
  2. 整形后光束分布:接收面的振幅分布,用于验证是否逼近目标超高斯光束
  3. 迭代误差曲线:RMS误差随迭代次数的变化,反映算法收敛过程

六、程序设计特点

  1. 理论忠实性:严格遵循GS算法与角谱传输的数学模型,无算法层面的假设或简化
  2. 模块化清晰:光束生成、传输计算、迭代控制分离,各模块功能单一明确
  3. 参数透明化:所有物理参数直接定义,可追溯且便于调整
  4. 计算可复现:基于确定性算法与数值计算,相同参数输入可获得完全一致结果

七、使用约束

  1. 所有长度参数单位需统一(程序默认米制)
  2. 采样点数N需为2的幂次(确保FFT计算效率)
  3. 计算区域D需大于光束实际尺寸(避免边界截断误差)
  4. 迭代次数需根据精度需求调整(次数不足则整形效果差,过多则计算耗时增加)

该程序的核心意图是通过数值模拟实现基于GS算法的光束整形过程,所有功能设计均服务于这一目标,未添加超出原始算法与传输模型的扩展功能。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐