简介涡旋电磁波相位图与OAM场强相位分析数据包面向光学工程、电磁场理论、无线通信及量子信息领域的研究者与学生可帮助直观理解轨道角动量OAM的螺旋相位结构以及不同拓扑荷下涡旋电磁波的场强分布特征。压缩包共19个文件体积约2.87MB其中含8个dat格式的OAM模式数据文件覆盖l为0、1、2、4及1.5、4.5等整数与半整数状态另有5个Matlab脚本用于绘制相位平面、相位箭头、电场与光强分布并配有4个txt说明文档和2个系统辅助文件整体结构紧凑适合直接运行与二次扩展。目前已有552人学习/下载。利用这些数据与脚本读者可复现OAM涡旋光束的中心空洞、螺旋相位旋转、l值正负对应的旋向变化等关键现象深入理解相位因子e^(ilφ)的物理含义对于涡旋电磁波通信容量提升、高分辨率成像、微粒操控等前沿应用这套资料也能提供可行的数值实验起点与代码基础。1. 涡旋电磁波相位图为什么模式判断绕不开它做涡旋电磁波OAM相关项目的人第一张图往往不是场强而是相位。OAM 通信、涡旋雷达、轨道角动量成像这些方向里模式数 l 直接决定信息容量和探测维度而 l 并不会老老实实写在强度分布里。只看强度图l2 和 l-2 长得一模一样都是甜甜圈把相位图画出来螺旋方向、旋转圈数一目了然。这就是为什么“涡旋电磁波相位图”会成为从业者绕不开的入门门槛。这篇笔记从一个常用仿真出发走到工程实现相位图怎么读、怎么生成、怎么从相位图里提取 OAM 谱、硬件上最容易在哪里翻车。适合刚接触 OAM 的研究生、做相控阵和天线工程的硬件工程师以及想验证自己算法有没有复现对的电磁场仿真用户。下面先讲最核心的数学基础再给可复现代码。2. 从数学到第一张图OAM 涡旋电磁波的相位与场强先立住2.1 相位因子 exp(ilφ)为什么相位图能判定模式涡旋电磁波区别于普通平面波的核心是一个方位角方向的相位因子。复振幅可以写成u(r, φ, z) A(r, z) × exp(ilφ) × exp(-ikz)其中 l 是拓扑荷整数可正可负φ 是柱坐标里的方位角k 是波数。exp(ilφ) 的含义是绕传播轴走一圈φ 从 0 变到 2π相位累积量正好是 2πl。l0 时相位不随方位变化就是普通平面波l1 时相位沿一圈从 0 线性爬到 2π等相位面变成一个螺旋面l2 时走一圈相位跨了 4π螺旋面“拧”了两圈。相位图就是把 arg(u) 按颜色画出来。用色调映射相位时同一个颜色对应同一个相位所以颜色沿方位角转了几圈就是拓扑荷 l。颜色旋转方向相反就是 l 正负相反。这就是“为什么做 OAM 的人不看场强看相位”的根本原因场强分布只告诉你能量在哪儿相位分布才告诉你波前长什么样。还有一点值得强调相位图和瞬时相位是两个概念。相位图通常指某一时刻、某一传播距离 z 处的横向相位分布。如果做时域仿真要固定时间 t 再取横向切片否则看到的是场强随时间的演化不是波前结构。2.2 相位奇点与暗场中心甜甜圈分布从哪里来在 r0 处exp(ilφ) 里的 φ 没有定义因为极坐标奇点在那里。为了保持场的物理意义振幅 A(r) 必须随 r→0 趋于 0所以涡旋光束/电磁波的中心天然是暗的。l 越大暗区半径越大。这是干涉相消的结果是由相位缠绕导致的拓扑保护不是吸收也不是遮挡。很多新手第一次仿真 l1 时看到强度图中心有个小黑点会怀疑是不是算法错了。其实这是对的。反过来如果强度图中心不是暗的那说明相位因子没有真正构造到位——检查点在于网格中心是否落在 r0 处以及有没有在极坐标变换时把奇点避开。这个问题我在第 5 章会专门给出现象和解法。相位奇点还有一个重要性质在奇点周围沿着闭合路径绕一圈相位变化量是 2πl 的整数倍。这个整数就是拓扑荷。所以相位图不光能“看”还能通过数值绕圈算出 l 来这部分在第 4 章展开。2.3 用 Python 生成最小可复现的相位图和场强图下面是生成 OAM 涡旋电磁波相位图和场强图的最短路径用拉盖尔-高斯光束的径向形式简化版外加一个环绕相位项。脚本依赖 numpy 和 matplotlib。import numpy as np import matplotlib.pyplot as plt # 仿真参数 lam 1.0 # 波长单位任意只要全场统一 w0 10.0 # 束腰半径决定环形场强的半径 l 2 # 拓扑荷试试改成 1、-1、3 看差异 N 512 # 网格边长越大相位奇点越清楚 extent 20.0 # 横向空间范围单位与波长一致 # 构造直角网格 x np.linspace(-extent, extent, N) y np.linspace(-extent, extent, N) X, Y np.meshgrid(x, y) # 转极坐标 R np.sqrt(X**2 Y**2) Phi np.arctan2(Y, X) # 振幅高斯包络乘上 (r/w0)^|l|模拟涡旋径向分布 A (R / w0) ** abs(l) * np.exp(-R**2 / w0**2) # 复振幅 E A * np.exp(1j * l * Phi) # 相位图用 hsv 循环色标避免色阶截断 phase np.angle(E) plt.figure(figsize(12, 5)) plt.subplot(1, 2, 1) plt.pcolormesh(X, Y, phase, cmaphsv, shadingauto) plt.colorbar(labelphase (rad)) plt.title(fOAM phase, l {l}) plt.axis(equal) plt.subplot(1, 2, 2) plt.pcolormesh(X, Y, np.abs(E)**2, cmapinferno, shadingauto) plt.colorbar(labelintensity) plt.title(fIntensity, l {l}) plt.axis(equal) plt.tight_layout() plt.savefig(oam_phase_intensity.png, dpi150)这段代码的逻辑分四步先造二维网格转极坐标然后用高斯包络乘上 (R/w0)^|l| 构造振幅保证中心为 0再加 exp(1j * l * Phi) 构造螺旋相位最后分别画相位和强度。相位图里颜色沿方位角变化 l 圈强度图是环形分布。参数上最需要调整的是 w0 和 extent。w0 越大环形半径越大extent 与 N 的比值决定采样率。经验是环形半径处每个 2π 相位周期至少要有 4 个像素否则相位图会有明显锯齿。仿真波长只是比例基准不参与绝对尺寸所以只要全场单位统一即可。把 l 改成负数再跑一次你会发现强度图完全不变但相位图颜色旋转方向反转。这是验证“相位图携带方向信息”最直观的实验。3. 生成 OAM 涡旋电磁波的工程方案相位板、相控阵与全息片怎么选3.1 螺旋相位板相位差转厚度差加工误差直接进相位图工程上最常见的 OAM 生成方式之一是螺旋相位板。它是一块厚度沿方位角方向线性增加的介质板电磁波穿过不同方位角处时走过的光程不同从而产生螺旋相位。设材料折射率为 n厚度 h(φ)则相位改变量是Δφ(φ) 2π (n-1) h(φ) / λ要让输出相位为 lφ厚度设计就是 h(φ) l λ φ / [2π (n-1)]。φ 从 0 到 2π 变化厚度最多增加到 lλ/(n-1)然后跳回 0。这个跳变处是加工最难的地方也是相位图最容易出瑕疵的位置。实际用相位板时有几个参数要敲定。首先是折射率 n 在工作频段的值很多材料在毫米波和光波段色散差异大查资料时务必确认频点。其次是加工精度相位误差和厚度误差成正比例厚度误差 1% 对应的相位误差大约 0.01×2πll 越大越敏感所以高次 OAM 对加工精度要求更高。还有相位板材料损耗介质损耗会让场强不再轴对称相位图依然存在但幅度被破坏实际近场扫描时会看到强度分布变扁。相位板的优点是只要一片被动结构就能实现固定 l 的模式适合批量复现缺点是 l 不可调。如果需要动态切换模式就要看相控阵或空间光调制器方案。常见的做法是准备一组 l 不同的相位板或者把相位板切成几个扇区拼装类似准光学实验室里常用的分扇区相位板。3.2 相控阵天线与 FPGA相位查找表决定模式纯度相控阵生成 OAM 的思路很直接把天线阵元摆成一个圆环第 j 个阵元的激励相位设为β_j l × φ_j其中 φ_j 是第 j 个阵元相对圆心的方位角。这样一来每个阵元辐射的球面波叠加后在阵轴方向就形成一个携带螺旋相位的波前。这里会有人问“fpga 可以控制相控阵的相位吗”答案是肯定的而且工程化很成熟。FPGA 内部做两件事维护每个阵元的相位增量累加器以及按查表输出相移控制字给移相器或波束成形芯片。阵元数 M 是关键参数。圆环阵列相邻阵元之间的角度间隔是 2π/M。每两个阵元之间的相位差是 l×2π/M当 |l| 接近 M/2 时相邻阵元相位差接近 π会出现方向图栅瓣相位图也乱掉。一般建议 |l| 不超过 M/4。阵元数量的经验值是 M 4|l|最好留到 8|l|。下面是用 Python 计算阵列相位的脚本可以直接导出成 FPGA 查找表的初始化文件import numpy as np M 16 # 阵元数 l 3 # 拓扑荷 phase (l * np.arange(M)) * 2 * np.pi / M # 归一化到 12 位 FPGA 相位控制字 phase_ctrl (phase / (2 * np.pi) * 4095) % 4096 phase_ctrl phase_ctrl.astype(int) for j in range(M): print(felement {j:2d} phase{np.degrees(phase[j]):7.1f} deg fctrl{phase_ctrl[j]:4d})这段代码把目标相位换算成控制字。phase 数组是浮点弧度phase_ctrl 是 12 位定点整型。FPGA 里移相器芯片通常接受 6 到 12 位相位控制。位数越低量化误差越大模式纯度越差具体表现为角向 OAM 谱里出现 l±1、l±2 等杂散分量。我在实际项目里踩过的坑是只用仿真相位分布去推 FPGA 控制字没有做近场校准。因为每个移相器和功放链路的固有相位不一样同一根馈线在不同频率下相位延迟也不同直接用理论值会让 OAM 模式谱混入很多杂散。正确的流程应该是先用矢量网络分析仪测每个阵元的 S21 相位扣除固有相位差再叠加上目标相位 β_j最后量化成控制字。这一步不做后患无穷。3.3 计算全息图与叉形光栅生成、测量二合一另一种很常用的 OAM 相位图生成途径是计算全息图尤其是光学和太赫兹波段。原理是把目标涡旋波和参考平面波做干涉记录干涉条纹的强度分布然后制作成振幅或相位型全息片。用平面波照射全息片在特定衍射级次上可以还原出涡旋相位。全息片的透过率函数可以写成T(φ) |A_ref A_oam exp(ilφ)|^2展开后包含了 exp(ilφ) 项和 exp(-ilφ) 项对应两个对称的一级衍射斑。这就是为什么全息片产生的 OAM 模式有正负两个拓扑荷。如果只想保留一个衍射级次可以设计相位型光栅把能量集中到指定级次工程上叫“偏置光栅”。叉形光栅是计算全息图的特例干涉条纹在中心分叉分叉数等于拓扑荷 l。测量一个波的 OAM 模式时把它和平面波干涉从干涉条纹分叉数就能读出 l。这个办法在学校实验室里非常实用不需要相干探测设备一颗激光器加一个分束镜就行。全息方案的优点是结构简单、成本低、频段适应性强缺点是差损大一级衍射效率通常只有 10%~40%并且对入射光斑位置敏感。入射光轴偏了涡旋中心会偏离光轴相位图中心奇点位置也会移动。在散射成像场景里全息图还会遭遇更麻烦的问题散射介质破坏了入射平面波的相位参考干涉条纹变模糊相位图被“糊掉”。此时需要借助相位恢复算法从强度数据迭代反演波前这直接引出第 4 章的内容。下面用一段表格对比三种方案的适用场景方便选型时做快速决策。方案典型频段是否可调相位误差来源系统复杂度螺旋相位板微波/太赫兹/光固定 l厚度加工误差、材料色散极低相控阵环形阵列射频/毫米波可编程支持多 l 切换阵元相位校准、量化误差高计算全息片太赫兹/光固定 l更换全息片刻蚀深度误差、对准误差中实际工程项目里射频段选相控阵的不少因为同时支持波束管理和模式切换太赫兹和光学实验室则常用相位板和全息片因为阵列天线在那些频段做不出可接受的辐射效率。相位图在这三种方案里都是验收工具近场扫描出来的相位分布和理论相位图对比均方根误差小于多少才算达标这是项目验收时最常见的判据。4. 从相位图读出 OAM 信息模式谱、奇点定位与相位恢复4.1 角向 OAM 谱在固定半径圆环上做傅里叶展开相位图不只是用来看的还要量化分析。量化 OAM 模式最常用的是角向模式谱也叫角向 OAM 谱。原理很简单在柱坐标里相位因子 exp(ilφ) 是关于方位角 φ 的谐波函数不同 l 相互正交。任意一个复场 E(r, φ) 可以在给定半径 r 处沿 φ 方向做傅里叶级数展开c_l(r) (1/2π) ∫_0^{2π} E(r, φ) exp(-ilφ) dφ|c_l(r)|^2 就是在半径 r 处、模式 l 上的相对能量占比。对在场强最大半径处做这个展开得到的谱最能反映主模式。实操时先用仿真或者近场扫描得到 E(r, φ) 的离散数据通常是二维复数矩阵。在以涡旋中心为圆心的圆上插值取点等间隔采样 Nφ 个点然后做一维 FFT。import numpy as np from scipy.interpolate import RegularGridInterpolator # E 是复数场二维数组X/Y 是坐标网格 # 假设已有仿真复场 E网格坐标 X, Y center_x, center_y 0.0, 0.0 # 涡旋中心仿真里通常为 0 radius 6.0 # 选在场强环半径附近可扫描多个值 Nphi 256 # 方位角采样点数 phi np.linspace(0, 2*np.pi, Nphi, endpointFalse) xs center_x radius * np.cos(phi) ys center_y radius * np.sin(phi) # 用双线性插值从网格场里取圆环上的值 interp RegularGridInterpolator( (np.unique(X[:,0]), np.unique(Y[0,:])), E, bounds_errorFalse, fill_value0) Ec interp(np.column_stack((xs, ys))) # 沿方位角 FFT spec np.fft.fft(Ec) / Nphi l_axis np.fft.fftfreq(Nphi, 1/Nphi).astype(int) # 已归一化 # 打印前几个模式的能量占比 power np.abs(spec)**2 for idx in np.argsort(power)[-5:]: l_val l_axis[idx] print(fl {l_val:3d} relative power {power[idx]:.4f})这里 RegularGridInterpolator 负责把直角网格场插值到圆环上。插值步数越大越接近连续积分结果更干净但要注意 Nφ 必须大于 2|l|1否则最高模式折叠混叠。频率轴 l_axis 的类型转换是为了让负l正常显示。打印出来的前五名里如果主模式能量占比低于 90%说明波前不纯可能来自振幅畸变、中心偏移或者相位解包裹错误。这个步骤是 OAM 通信系统里接收端测模式纯度最常见的做法。配合相控阵做动态多模式传输时每个符号周期提取一次谱就能判断模式间串扰有多大。4.2 相位奇点定位与拓扑荷检测绕一圈数相位角向模式谱适合定量分析但如果只需要知道一个相位图里包含哪个 l更直接的方法是算缠绕数。绕中心一周累计相位变化 2πl。数值实现时对圆环上相邻两个采样点的相位差做 unwrap避免跳跃误差然后累加。import numpy as np def winding_number(phase_along_ring): # phase_along_ring: 圆环上等间隔采样的相位数组 delta np.diff(phase_along_ring) # 把相位差限制到 (-pi, pi) delta_wrapped np.angle(np.exp(1j * delta)) return int(round(delta_wrapped.sum() / (2 * np.pi))) # 示例构造一个 l3 的相位圆环 N 300 phi np.linspace(0, 2*np.pi, N, endpointFalse) phase (3 * phi) % (2*np.pi) print(topological charge , winding_number(phase))这段代码的要点是相位差不直接累加而是先取角度再累加因为 phase 数组可能跨越 ±π 边界。用 np.angle(np.exp(1j * delta)) 等价于把每个差分值都折叠回主值区间这是绕开相位缠绕的标准手法。工程上这个方法对噪声有一定容忍度因为缠绕数只关心总变化量局部抖动会被折叠过程抵消。需要注意绕行半径的选取。半径太小时插值噪声大相位跳变多半径太大时可能跨过多个强度环相位分布被径向变化污染。经验做法是从中心向外扫多个半径分别计算缠绕数取稳定的那个值。如果不同半径的缠绕数不一致说明相位图里有未解开的奇点对通常源于仿真边界截断或近场扫描时探头位置偏差。4.3 散射环境下的相位恢复为什么实测相位图会“糊”近场扫描或光场相机拍到的通常是强度图相位要从干涉或全息重构中算出来。最干净的场景里干涉法能直接得到相位一旦介质有散射干涉条纹对比度下降相位图就出现随机褶皱。很多做散射成像和穿墙雷达的人会卡在这一步明明目标应该是个干净的 OAM 相位螺旋重建出来却像被揉过的纸团。这个问题的背后是相位恢复问题。经典的 Gerchberg-Saxton 算法利用强度约束和傅里叶变换约束交替迭代重建出相位分布。对 OAM 场景来说已知条件是场强图 |E|² 和传播距离重建目标是相位 arg(E)。迭代步骤大致是随机初始相位 → 构造复场 → 传播到另一个平面 → 替换幅度为实测值 → 反向传播 → 再替换幅度重复。相位恢复的成败由三个参数决定迭代次数、支撑域、初始相位猜测。迭代次数通常要 100 到 1000 次支撑域要把主要能量区域包含进去太大会让算法发散初始相位猜测也可以不随机用上一帧结果或者用平面波相位启动。很多初学者以为是“玄学”其实是对约束条件理解不到位——散射严重时单个平面的强度约束不够需要多个角度或者多个波长的强度图做冗余约束这属于散射成像相位恢复方向的标准做法。我的建议是正常仿真里别把相位恢复当成默认选项。先用相位板和平面波干涉拿到干净的参考相位图再逐步加散射介质。这样你能区分哪部分畸变来自介质哪部分来自重建算法本身。相位恢复是那种“输出很漂亮但必须验证”的黑匣子验证方法就是第 6 章要讲的干涉法对照。5. 避坑与排查相位图最常见的 5 个坑和对应解法5.1 相位图出现硬性颜色跳变不是数据错误现象相位图上有一条清楚的边界紧挨着的两个像素颜色从一端跳到另一端看起来像“断层”。尤其是使用 matplotlib 的 jet 色标时边界呈现一条红蓝分界线。原因角度函数返回的是主值 [-π, π)真实相位跨过 π 时会强制跳变回 -π于是出现一条不连续的割线。这是相位缠绕(phase wrapping)物理上不存在“断层”只是表示方式的副作用。解决如果要展示连续相位面用 np.unwrap 处理一维数据二维相位图需要专门的解包裹算法常见的是质量图引导算法或最小范数法。如果只是判断拓扑荷不需要解包裹直接用缠绕数法更稳妥。展示时推荐 hsv 循环色标因为它的色相本身就设计成首尾衔接能直观显示相位缠绕结构。5.2 强度图中心不是暗的现象l≠0 时强度图中心出现了亮点或者中心暗区比预期小很多。原因网格中心没有真正落在 r0 上。用 np.linspace(-20, 20, 512) 生成的网格里没有 0 这个点奇点落在四个网格中央插值后中心强度被“抹平”。另外如果用了 fftshift 处理频谱场也可能把场中心偏移半格。解决网格改用 np.linspace(-extent, extent, N, endpointFalse) 并配合适当的平移保证中心是 0。更简单的方法是让 x 坐标从 -(N-1)/2×dx 到 (N-1)/2×dx奇数 N 时天然包含 0。仿真强度中心不暗的另一个原因可能是漏乘了 (R/w0)^|l| 因子检查振幅表达式中是否包含 R 的高次项。5.3 l1 和 l-1 的相位图让人看不出差别现象从两张图看都是螺旋颜色分布说不清哪个是正哪个是负。原因坐标约定不统一。φ atan2(Y, X) 时逆时针旋转方位角为正l0 时相位沿逆时针增加色彩旋转方向为逆时针。如果不说明观察方向很容易把正负搞反。解决统一约定为“观察者沿 z 方向看向波源”此时 l0 对应相位沿逆时针线性增加。在代码注释和论文里写明这一句避免团队里 A 用右手系 B 用左手系结果相位图对比了半天全是镜像。5.4 相控阵 OAM 谱出现 l±1 杂散分量现象实测角向 OAM 谱里除了主模式l1 或 l-1 也有 5% 以上的能量。原因最典型的是 FPGA 相位控制字量化误差。相位步进若只有 6 位等价于相位量化间隔约 5.6°产生的相位误差方差会让模式谱出现邻近模式。另一个原因是阵元固有相位未被校准各阵元的馈线长度、放大器相位差异直接叠进了辐射相位。解决把 FPGA 相位控制字提高到 10 位以上向移相器芯片写码时优先选分辨率高的型号在现场测试前做一次相位校准用近场探头绕环形阵列测一圈得到每个阵元的固有相位偏差数组然后从目标相位中扣除。这个校准数据建议在每次测试前更新一次因为温度漂移会缓慢改变馈线相位。5.5 相位恢复结果不稳定每次跑出来的拓扑荷不一样现象同一组强度图程序每次运行得到不同的相位图计算的缠绕数时而是 1 时而是 2。原因GS 算法对初始相位敏感随机初始相位会把迭代引向不同局部解。散射较严重时更是如此强度约束不够强算法没有收敛到唯一解。解决固定随机种子只能掩盖问题治本的方法是增加约束。常见手段有三个一是给支撑域加框限制相位恢复范围在能量显著区域二是引入两个平面的强度图交替迭代而不是单平面往返三是用多次初始猜测取一致性检验比如初始化 10 次统计缠绕数出现最多的值作为最终结果。如果多次结果分布离散说明这套测量数据本身信息量不足需要换个测量方案而不是继续调算法。6. 进阶技巧用共振干涉法验证 OAM 相位图的正确性拿到仿真或实测相位图后别急着入库先用一种不依赖算法本身的独立方法做交叉验证。我最常用的是共振干涉法也就是让涡旋波与一束平面参考波共轴干涉然后看干涉条纹。典型共振干涉法的相位比较原理图里参考波和信号波合成等相位差位置形成亮暗条纹。当信号波是 OAM 波时干涉条纹中心会出现分叉分叉数等于拓扑荷 l。这个“叉形条纹”是相位图的另一种表现但它的来源是强度测量和直接算相位是两条独立路径能互相证明。仿真阶段就可以先做这一步import numpy as np import matplotlib.pyplot as plt # 复用前面的 X, Y, Phi, R # 平面波参考振幅 1相位 0 E_ref np.ones_like(X) # 涡旋波l2使用之前的振幅 E_oam (R / 10.0) ** 2 * np.exp(-R**2 / 10.0**2) * np.exp(1j * 2 * Phi) # 干涉强度 I_interf np.abs(E_ref E_oam)**2 plt.figure(figsize(6, 5)) plt.pcolormesh(X, Y, I_interf, cmapgray, shadingauto) plt.title(Interference with plane wave: fork pattern) plt.axis(equal) plt.show()逻辑上参考光和涡旋光叠加后相位差为 2π 的整数倍的轨迹会形成明条纹。因为涡旋波相位沿方位角变化了 2πl所以条纹在中心处需要多分叉 l 次才能满足相位匹配。数出几个分叉就等于验证了拓扑荷。这是我在项目验收里最常用的一招不争论仿真软件对不对直接输出叉形条纹给客户看分叉数就是最直观的证据。实际测试中我还有两个习惯。一是把仿真相位图保存成 npy 文件同时导出 png实测结果用相位板或相控阵扫出来后和仿真做差相位差均方根大于 π/4 就回头查校准不硬调算法。二是建立相位基线库把不同 l 值、不同频点的干净相位图都存下来后面所有新数据先和基线库匹配匹配分值不到阈值就不往下走。这个方法帮我避开了很多“数据看着像但实际上模式混叠”的翻车。每个项目做完了我都会提醒自己相位图是涡旋电磁波的指纹先把指纹库做扎实比堆十个指标都有用。希望帮到你。本文还有配套的精品资源点击获取