许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  Python怎么跑HFSS超表面仿真?理论加实操全流程

Python怎么跑HFSS超表面仿真?理论加实操全流程

阅读数 5
点赞 0
article_banner

超表面设计:理论、应用与仿真概述

本教程的大纲包括:理论讲解、历史部分、应用、Python代码、HFSS中的自动化结构、HFSS仿真,最后将讨论仿真结果。

在本教程的第一部分“理论讲解”中,我们将讨论超表面设计的不同理论方面。首先,我们将介绍超表面的一些背景知识;接着,我们将解释如何计算超表面每个单元的相位;然后,我们将展示不同超表面配置的公式;最后,我们将展示一些不同超表面配置的实例。

背景知识

为了更熟悉超表面的概念,让我们先解释一些背景信息。超表面是人工设计的结构材料,用于控制电磁波。它由一系列单元(通常称为“超原子”)组成,这些单元可以独立操控入射波的幅度、相位和偏振。操控和控制波的能力来自于在超表面的每个单元上引入特定的相移。

超原子相位的计算

我们尝试解释如何获得超表面每个单元所需相位的公式。本幻灯片展示的公式用于计算反射阵列(超表面的一种,设计用于将波反射并导向指定方向)中每个单元所需的相移。

让我们将公式分解成几个易于理解的部分:

  • 距离R的计算:这部分计算馈源点(xc, yc, zc)与每个单元位置(xi, yi, z)之间的距离。这个距离在相位调整中起关键作用,因为单元引入的相移取决于其与馈源点的距离(由于波的传播)。
  • 仰角调整:该项考虑了反射波束方向的仰角θ(用θ_di表示)和波束方向的方位角(用φ表示)。想象一下手电筒的光束倾斜一个角度,该项就模拟了将反射波导向期望方向所需的相移。
  • 共形性调整:该项修正了单元高度z对波束指向的影响。如果超表面不是完全平坦的,或者我们有意引入高度偏移,该项会相应地调整相位。
  • OAM相位:最后一项加入轨道角动量(OAM)模式。当OAM模式索引值非零时,会引入螺旋状相位分布,使波前携带螺旋相位结构,形成OAM波束。这对于产生涡旋波束或携带轨道角动量的波束非常有用。

这是一个关于阵列天线波束成形与轨道角动量(OAM)调制的相位综合公式。我们将整个相位函数记为 %5CPsi(x_i%2C%20y_i%2C%20z_i),它是空间坐标 (x_i%2C%20y_i%2C%20z_i) 的标量场。

设自由空间波数为 k:

k%20%3D%20%5Cfrac%7B2%5Cpi%7D%7B%5Clambda%7D%20%3D%20%5Comega%20%5Csqrt%7B%5Cmu_0%20%5Cepsilon_0%7D

其中 %5Clambda 为波长,%5Comega 为角频率。

定义第 i 个辐射单元的位置矢量为 %5Cmathbf%7Br%7D_i:

%5Cmathbf%7Br%7D_i%20%3D%20x_i%20%5Chat%7B%5Cmathbf%7Bx%7D%7D%20%2B%20y_i%20%5Chat%7B%5Cmathbf%7By%7D%7D%20%2B%20z_i%20%5Chat%7B%5Cmathbf%7Bz%7D%7D%20%3D%20%5Cbegin%7Bbmatrix%7D%20x_i%20%5C%5C%20y_i%20%5C%5C%20z_i%20%5Cend%7Bbmatrix%7D

定义参考点(或馈源相位中心)的位置矢量为 %5Cmathbf%7Br%7D_%7Bcor%7D:

%5Cmathbf%7Br%7D_%7Bcor%7D%20%3D%20x_%7Bcor%7D%20%5Chat%7B%5Cmathbf%7Bx%7D%7D%20%2B%20y_%7Bcor%7D%20%5Chat%7B%5Cmathbf%7By%7D%7D%20%2B%20z_%7Bcor%7D%20%5Chat%7B%5Cmathbf%7Bz%7D%7D%20%3D%20%5Cbegin%7Bbmatrix%7D%20x_%7Bcor%7D%20%5C%5C%20y_%7Bcor%7D%20%5C%5C%20z_%7Bcor%7D%20%5Cend%7Bbmatrix%7D

定义目标波束指向的单位方向矢量 %5Chat%7B%5Cmathbf%7Bu%7D%7D(%5Ctheta_%7Bdir%7D%2C%20%5Cphi_%7Bdir%7D)。在球坐标系中,该矢量由俯仰角 %5Ctheta_%7Bdir%7D%20%5Cin%20%5B0%2C%20%5Cpi%5D 和方位角 %5Cphi_%7Bdir%7D%20%5Cin%20%5B0%2C%202%5Cpi) 确定:

%5Chat%7B%5Cmathbf%7Bu%7D%7D%20%3D%20%5Csin%5Ctheta_%7Bdir%7D%5Ccos%5Cphi_%7Bdir%7D%20%5Chat%7B%5Cmathbf%7Bx%7D%7D%20%2B%20%5Csin%5Ctheta_%7Bdir%7D%5Csin%5Cphi_%7Bdir%7D%20%5Chat%7B%5Cmathbf%7By%7D%7D%20%2B%20%5Ccos%5Ctheta_%7Bdir%7D%20%5Chat%7B%5Cmathbf%7Bz%7D%7D

原公式可以重写为矢量形式以便于分析:

%5CPsi(%5Cmathbf%7Br%7D_i)%20%3D%20%5Cunderbrace%7Bk%20%5C%7C%20%5Cmathbf%7Br%7D_%7Bcor%7D%20-%20%5Cmathbf%7Br%7D_i%20%5C%7C%7D_%7B%5CPsi_%7Bdist%7D%7D%20%5Cunderbrace%7B-%20k%20%5Csin%5Ctheta_%7Bdir%7D%20(x_i%20%5Ccos%5Cphi_%7Bdir%7D%20%2B%20y_i%20%5Csin%5Cphi_%7Bdir%7D)%7D_%7B%5CPsi_%7Belev%7D%7D%20%5Cunderbrace%7B-%20k%20z_i%20%5Ccos%5Ctheta_%7Bdir%7D%7D_%7B%5CPsi_%7Bconf%7D%7D%20%2B%20%5Cunderbrace%7Bm%20%5Ccdot%20%5Ctext%7Batan2%7D(y_i%2C%20x_i)%7D_%7B%5CPsi_%7Boam%7D%7D

其中 m%20%3D%20OAM_m 为拓扑荷数。

距离项 %5CPsi_%7Bdist%7D 的几何意义

%5CPsi_%7Bdist%7D%20%3D%20k%20%5C%7C%20%5Cmathbf%7Br%7D_%7Bcor%7D%20-%20%5Cmathbf%7Br%7D_i%20%5C%7C%20%3D%20k%20%5Csqrt%7B(%5Cmathbf%7Br%7D_%7Bcor%7D%20-%20%5Cmathbf%7Br%7D_i)%20%5Ccdot%20(%5Cmathbf%7Br%7D_%7Bcor%7D%20-%20%5Cmathbf%7Br%7D_i)%7D

  • 这一项代表了从参考点 到单元 的球面波相位延迟。
  • 在波动方程的解中,向外传播的球面波具有形式 。
  • 若系统是一个空间馈电阵列(如反射阵或透射阵),入射波从 发出,到达 时的相位滞后为 。
  • 为了在远场形成特定波前,单元必须提供共轭相位补偿或特定的相位变换。公式中的正号 通常意味着这是一个相位补偿项,用于抵消路径长度带来的相位滞后,或者用于构建一个以 为焦点的汇聚/发散波前变换函数。

扫描项的矢量投影 (%5CPsi_%7Belev%7D%20%2B%20%5CPsi_%7Bconf%7D)

我们将后两项合并,考察其矢量结构。令扫描相位项为 %5CPsi_%7Bscan%7D%20%3D%20%5CPsi_%7Belev%7D%20%2B%20%5CPsi_%7Bconf%7D。

%5CPsi_%7Bscan%7D%20%3D%20-k%20%5B%20%5Csin%5Ctheta_%7Bdir%7D%20(x_i%20%5Ccos%5Cphi_%7Bdir%7D%20%2B%20y_i%20%5Csin%5Cphi_%7Bdir%7D)%20%2B%20z_i%20%5Ccos%5Ctheta_%7Bdir%7D%20%5D

展开括号内的项:

%5Ctext%7BInner%7D%20%3D%20x_i%20(%5Csin%5Ctheta_%7Bdir%7D%20%5Ccos%5Cphi_%7Bdir%7D)%20%2B%20y_i%20(%5Csin%5Ctheta_%7Bdir%7D%20%5Csin%5Cphi_%7Bdir%7D)%20%2B%20z_i%20(%5Ccos%5Ctheta_%7Bdir%7D)

观察系数,这正是位置矢量 %5Cmathbf%7Br%7D_i 与目标方向单位矢量 %5Chat%7B%5Cmathbf%7Bu%7D%7D 的点积(内积):

%5Cmathbf%7Br%7D_i%20%5Ccdot%20%5Chat%7B%5Cmathbf%7Bu%7D%7D%20%3D%20%5Cbegin%7Bbmatrix%7D%20x_i%20%5C%5C%20y_i%20%5C%5C%20z_i%20%5Cend%7Bbmatrix%7D%20%5Ccdot%20%5Cbegin%7Bbmatrix%7D%20%5Csin%5Ctheta_%7Bdir%7D%5Ccos%5Cphi_%7Bdir%7D%20%5C%5C%20%5Csin%5Ctheta_%7Bdir%7D%5Csin%5Cphi_%7Bdir%7D%20%5C%5C%20%5Ccos%5Ctheta_%7Bdir%7D%20%5Cend%7Bbmatrix%7D

因此,扫描项可以紧凑地写为:

%5CPsi_%7Bscan%7D%20%3D%20-k%20(%5Cmathbf%7Br%7D_i%20%5Ccdot%20%5Chat%7B%5Cmathbf%7Bu%7D%7D)

  • 这是相控阵理论中的核心公式。
  • 远场辐射方向图 是阵列激励的傅里叶变换(在远场近似下)。
  • 为了使波束最大值出现在方向 ,第 个单元的激励相位必须抵消该单元相对于原点在该方向上的空间相位延迟 。
  • 即,我们需要当 时, 。故 必须包含 项。

我们可以把位置矢量 %5Cmathbf%7Br%7D_i 与目标方向单位矢量 %5Chat%7B%5Cmathbf%7Bu%7D%7D 的点积(内积)%5Cmathbf%7Br%7D_i%20%5Ccdot%20%5Chat%7B%5Cmathbf%7Bu%7D%7D%20 拆分为两部分之和。首先,我们需要明确什么是“横向”和“纵向”分量:

  • 纵向(Vertical/Longitudinal): 对应 轴方向。 位置分量: 方向分量: (这是球坐标系中 轴方向的投影)
  • 横向(Horizontal/Transverse): 对应 平面。 位置分量: 方向分量:

原点积公式为:

%5Cmathbf%7Br%7D_i%20%5Ccdot%20%5Chat%7B%5Cmathbf%7Bu%7D%7D%20%3D%20(x_i%20%5Chat%7B%5Cmathbf%7Bx%7D%7D%20%2B%20y_i%20%5Chat%7B%5Cmathbf%7By%7D%7D%20%2B%20z_i%20%5Chat%7B%5Cmathbf%7Bz%7D%7D)%20%5Ccdot%20(u_x%20%5Chat%7B%5Cmathbf%7Bx%7D%7D%20%2B%20u_y%20%5Chat%7B%5Cmathbf%7By%7D%7D%20%2B%20u_z%20%5Chat%7B%5Cmathbf%7Bz%7D%7D)

根据矢量点积的性质,不同轴向的单位矢量点积为0(例如 %5Chat%7B%5Cmathbf%7Bx%7D%7D%20%5Ccdot%20%5Chat%7B%5Cmathbf%7Bz%7D%7D%20%3D%200),只有同轴的点积为1(例如 %5Chat%7B%5Cmathbf%7Bz%7D%7D%20%5Ccdot%20%5Chat%7B%5Cmathbf%7Bz%7D%7D%20%3D%201)。因此,我们可以把 %5Cmathbf%7Br%7D_i%20%5Ccdot%20%5Chat%7B%5Cmathbf%7Bu%7D%7D%20 拆分为两部分之和:

%5Cmathbf%7Br%7D_i%20%5Ccdot%20%5Chat%7B%5Cmathbf%7Bu%7D%7D%20%3D%20%5Cunderbrace%7B(x_i%20%5Chat%7B%5Cmathbf%7Bx%7D%7D%20%2B%20y_i%20%5Chat%7B%5Cmathbf%7By%7D%7D)%20%5Ccdot%20(u_x%20%5Chat%7B%5Cmathbf%7Bx%7D%7D%20%2B%20u_y%20%5Chat%7B%5Cmathbf%7By%7D%7D)%7D_%7B%5Ctext%7B%E6%A8%AA%E5%90%91%E5%88%86%E9%87%8F%7D%7D%20%2B%20%5Cunderbrace%7B(z_i%20%5Chat%7B%5Cmathbf%7Bz%7D%7D)%20%5Ccdot%20(u_z%20%5Chat%7B%5Cmathbf%7Bz%7D%7D)%7D_%7B%5Ctext%7B%E7%BA%B5%E5%90%91%E5%88%86%E9%87%8F%7D%7D

A. 纵向分量 (Vertical Component),直接对应 z 轴:

%5Ctext%7B%E7%BA%B5%E5%90%91%7D%20%3D%20(z_i%20%5Chat%7B%5Cmathbf%7Bz%7D%7D)%20%5Ccdot%20(%5Ccos%5Ctheta_%7Bdir%7D%20%5Chat%7B%5Cmathbf%7Bz%7D%7D)%20%3D%20z_i%20%5Ccos%5Ctheta_%7Bdir%7D

物理意义: 这就是图片中提到的 Conformality Adjustment。如果天线阵元有高度差(z_i%20%5Cneq%200),这一项就不为零,必须补偿。

B. 横向分量 (Horizontal Component),这是 xy 平面内的点积运算:

%5Ctext%7B%E6%A8%AA%E5%90%91%7D%20%3D%20(x_i%20%5Chat%7B%5Cmathbf%7Bx%7D%7D%20%2B%20y_i%20%5Chat%7B%5Cmathbf%7By%7D%7D)%20%5Ccdot%20(%5Csin%5Ctheta_%7Bdir%7D%5Ccos%5Cphi_%7Bdir%7D%20%5Chat%7B%5Cmathbf%7Bx%7D%7D%20%2B%20%5Csin%5Ctheta_%7Bdir%7D%5Csin%5Cphi_%7Bdir%7D%20%5Chat%7B%5Cmathbf%7By%7D%7D)

展开计算(%5Chat%7B%5Cmathbf%7Bx%7D%7D%5Ccdot%5Chat%7B%5Cmathbf%7Bx%7D%7D%3D1%2C%20%5Chat%7B%5Cmathbf%7By%7D%7D%5Ccdot%5Chat%7B%5Cmathbf%7By%7D%7D%3D1):

%3D%20x_i%20(%5Csin%5Ctheta_%7Bdir%7D%5Ccos%5Cphi_%7Bdir%7D)%20%2B%20y_i%20(%5Csin%5Ctheta_%7Bdir%7D%5Csin%5Cphi_%7Bdir%7D)

提取公因式 %5Csin%5Ctheta_%7Bdir%7D:

%3D%20%5Csin%5Ctheta_%7Bdir%7D%20(x_i%20%5Ccos%5Cphi_%7Bdir%7D%20%2B%20y_i%20%5Csin%5Cphi_%7Bdir%7D)

物理意义: 这就是图片中提到的 Elevation Adjustment。它描述了波束在水平面上的投影关系。当 %5Ctheta_%7Bdir%7D%3D0(垂直向上看)时,%5Csin(0)%3D0,这一项消失,符合物理直觉。

OAM(轨道角动量)相位项 %5CPsi_%7Boam%7D 的拓扑性质

普通平面波的波前是平整的,相位在横截面上均匀分布;而OAM涡旋波的波前则呈螺旋状,如同旋转楼梯一般,绕轴一周相位会累积 2%5Cpi 的整数倍变化。正是这种独特的螺旋波前结构,使得其相位必须随方位角线性变化。

平面波之所以没有角度项,是因为它是角向模式数 m%20%3D%200 的特例。它的相位只随传播距离(z 轴)变化,而在横截面(xy 平面)上是均匀分布的,不存在随方位角旋转而产生的相位延迟。

为了从数学上严格描述这一物理图像并导出角向分量 %5CPsi%20%3D%20m%5Cvarphi 这一核心关系,我们需要回到波动方程本身进行求解。

在柱坐标系 (%5Crho%2C%20%5Cvarphi%2C%20z) 下求解标量亥姆霍兹方程(即波动方程的频域形式)时,我们采用分离变量法,假设电场分布 E 可以分解为径向、角向和纵向三个独立函数的乘积。为了保证物理场的单值性——即绕着传播轴旋转 360%5E%5Ccirc (2%5Cpi) 回到原点时,电磁场必须重合且连续——角向分量 %5CPhi(%5Cvarphi) 必须满足严格的周期性边界条件。满足这一条件的唯一数学解是复指数形式:

%5CPhi(%5Cvarphi)%20%3D%20e%5E%7Bjm%5Cvarphi%7D其中,m 必须是整数。当我们把这个解写成标准的幅度-相位形式 A%20e%5E%7Bj%5CPsi%7D 时,可以直接从指数部分提取出相位项 %5CPsi%20%3D%20m%5Cvarphi。这就是 OAM 相位随方位角 %5Cvarphi 线性变化的根本物理来源。

在柱坐标系 (%5Crho%2C%20%5Cvarphi%2C%20z) 中,标量亥姆霍兹方程为:

%5Cnabla%5E2%20E%20%2B%20k%5E2%20E%20%3D%200

其中拉普拉斯算子在柱坐标下的表达式为:

%5Cnabla%5E2%20%3D%20%5Cfrac%7B1%7D%7B%5Crho%7D%20%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%20%5Crho%7D%20%5Cleft(%20%5Crho%20%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%20%5Crho%7D%20%5Cright)%20%2B%20%5Cfrac%7B1%7D%7B%5Crho%5E2%7D%20%5Cfrac%7B%5Cpartial%5E2%7D%7B%5Cpartial%20%5Cvarphi%5E2%7D%20%2B%20%5Cfrac%7B%5Cpartial%5E2%7D%7B%5Cpartial%20z%5E2%7D

采用分离变量法,假设电场分布 E(%5Crho%2C%20%5Cvarphi%2C%20z)%20%3D%20R(%5Crho)%20%5CPhi(%5Cvarphi)%20Z(z)。将其代入亥姆霍兹方程,并除以 E,可得:

%5Cfrac%7B1%7D%7B%5Crho%20R%7D%20%5Cfrac%7Bd%7D%7Bd%5Crho%7D%20%5Cleft(%20%5Crho%20%5Cfrac%7BdR%7D%7Bd%5Crho%7D%20%5Cright)%20%2B%20%5Cfrac%7B1%7D%7B%5Crho%5E2%20%5CPhi%7D%20%5Cfrac%7Bd%5E2%20%5CPhi%7D%7Bd%5Cvarphi%5E2%7D%20%2B%20%5Cfrac%7B1%7D%7BZ%7D%20%5Cfrac%7Bd%5E2%20Z%7D%7Bdz%5E2%7D%20%2B%20k%5E2%20%3D%200

由于 z 方向的传播通常具有平移不变性(或为行波形式),我们设纵向部分为 Z(z)%20%3D%20e%5E%7B-j%5Cbeta%20z%7D,则 %5Cfrac%7B1%7D%7BZ%7D%20%5Cfrac%7Bd%5E2%20Z%7D%7Bdz%5E2%7D%20%3D%20-%5Cbeta%5E2。方程简化为:

%5Cfrac%7B1%7D%7B%5Crho%20R%7D%20%5Cfrac%7Bd%7D%7Bd%5Crho%7D%20%5Cleft(%20%5Crho%20%5Cfrac%7BdR%7D%7Bd%5Crho%7D%20%5Cright)%20%2B%20%5Cfrac%7B1%7D%7B%5Crho%5E2%20%5CPhi%7D%20%5Cfrac%7Bd%5E2%20%5CPhi%7D%7Bd%5Cvarphi%5E2%7D%20%2B%20k%5E2%20-%20%5Cbeta%5E2%20%3D%200

令 k_c%5E2%20%3D%20k%5E2%20-%20%5Cbeta%5E2(横向波数平方),并将含 %5Cvarphi 的项分离出来:

%5Cfrac%7B%5Crho%7D%7BR%7D%20%5Cfrac%7Bd%7D%7Bd%5Crho%7D%20%5Cleft(%20%5Crho%20%5Cfrac%7BdR%7D%7Bd%5Crho%7D%20%5Cright)%20%2B%20%5Crho%5E2%20k_c%5E2%20%2B%20%5Cfrac%7B1%7D%7B%5CPhi%7D%20%5Cfrac%7Bd%5E2%20%5CPhi%7D%7Bd%5Cvarphi%5E2%7D%20%3D%200

由于第一项只与 %5Crho 有关,第二项只与 %5Cvarphi 有关,它们必须分别等于常数。我们令角向部分的分离常数为 -m%5E2(通常取负值以保证振荡解),即:

%5Cfrac%7B1%7D%7B%5CPhi%7D%20%5Cfrac%7Bd%5E2%20%5CPhi%7D%7Bd%5Cvarphi%5E2%7D%20%3D%20-m%5E2%20%5Cimplies%20%5Cfrac%7Bd%5E2%20%5CPhi%7D%7Bd%5Cvarphi%5E2%7D%20%2B%20m%5E2%20%5CPhi%20%3D%200

上述二阶常微分方程的通解可以写为三角函数形式或复指数形式:

%5CPhi(%5Cvarphi)%20%3D%20A%20%5Ccos(m%5Cvarphi)%20%2B%20B%20%5Csin(m%5Cvarphi)%20%3D%20C_1%20e%5E%7Bjm%5Cvarphi%7D%20%2B%20C_2%20e%5E%7B-jm%5Cvarphi%7D

根据物理场的单值性要求,绕传播轴(z 轴)旋转 360%5E%5Ccirc(即 2%5Cpi 弧度)回到原点时,场必须重合且连续。这意味着角向分量必须满足:

%5CPhi(%5Cvarphi%20%2B%202%5Cpi)%20%3D%20%5CPhi(%5Cvarphi)

我们将通解代入该条件进行分析。以复指数基函数 e%5E%7Bjm%5Cvarphi%7D 为例:

%5CPhi(%5Cvarphi%20%2B%202%5Cpi)%20%3D%20C_1%20e%5E%7Bjm(%5Cvarphi%20%2B%202%5Cpi)%7D%20%2B%20C_2%20e%5E%7B-jm(%5Cvarphi%20%2B%202%5Cpi)%7D%20%3D%20C_1%20e%5E%7Bjm%5Cvarphi%7D%20e%5E%7Bjm2%5Cpi%7D%20%2B%20C_2%20e%5E%7B-jm%5Cvarphi%7D%20e%5E%7B-jm2%5Cpi%7D

为了满足 %5CPhi(%5Cvarphi%20%2B%202%5Cpi)%20%3D%20%5CPhi(%5Cvarphi)%20%3D%20C_1%20e%5E%7Bjm%5Cvarphi%7D%20%2B%20C_2%20e%5E%7B-jm%5Cvarphi%7D,必须有:

e%5E%7Bjm2%5Cpi%7D%20%3D%201%20%5Cquad%20%5Ctext%7B%E4%B8%94%7D%20%5Cquad%20e%5E%7B-jm2%5Cpi%7D%20%3D%201

根据欧拉公式 e%5E%7Bj%5Ctheta%7D%20%3D%20%5Ccos%5Ctheta%20%2B%20j%5Csin%5Ctheta,要使 e%5E%7Bjm2%5Cpi%7D%20%3D%201,必须满足:

%5Ccos(2%5Cpi%20m)%20%3D%201%20%5Cquad%20%5Ctext%7B%E4%B8%94%7D%20%5Cquad%20%5Csin(2%5Cpi%20m)%20%3D%200

这说明 2%5Cpi%20m 必须是 2%5Cpi 的整数倍,即:

m%20%3D%200%2C%20%5Cpm%201%2C%20%5Cpm%202%2C%20%5Cpm%203%2C%20%5Cdots

m 必须为整数(称为角向模数)。

当 m 为整数时,e%5E%7Bjm%5Cvarphi%7D 和 e%5E%7B-jm%5Cvarphi%7D 都是满足周期性条件的独立解(对于 m%3D0,两者重合为常数)。

在电磁场理论中,为了方便表示旋转方向(如左旋/右旋)以及进行傅里叶级数展开,我们通常选取复指数形式作为基函数。对于给定的整数 m,最简洁且完备的角向函数就是:

%5CPhi(%5Cvarphi)%20%3D%20e%5E%7Bjm%5Cvarphi%7D%20%5Cquad%20(m%20%5Cin%20%5Cmathbb%7BZ%7D)

  • 当 时, 表示沿 增加方向相位滞后的波。
  • 当 时, 表示沿 增加方向相位超前的波。
  • 当 时,,表示轴对称(无角向变化)的场,平面波没有“角度依赖性”。

由于任何满足周期的实函数(如 %5Ccos%20m%5Cvarphi%2C%20%5Csin%20m%5Cvarphi)都可以由 e%5E%7Bjm%5Cvarphi%7D 和 e%5E%7B-jm%5Cvarphi%7D 线性组合而成,因此复指数形式 e%5E%7Bjm%5Cvarphi%7D 是满足单值性周期性边界条件的最基础、唯一的数学本征解形式。

基于上述理论推导,在设计反射阵或超表面以产生 OAM 波束时,我们需要为第 i 个单元(或空间中任意一点)赋予特定的附加相移。该相位项 %5CPsi_%7Boam%7D 仅依赖于该点在横截面(xy 平面)上的方位角 %5Cvarphi_i,其核心定义公式为:

%5CPsi_%7Boam%7D(%5Crho_i%2C%20%5Cvarphi_i%2C%20z_i)%20%3D%20m%20%5Ccdot%20%5Cvarphi_i

在这个公式中,包含两个关键参数:

  • (拓扑荷数):也称为 OAM 模式数。它决定了波前螺旋的“陡峭”程度和手性。通常规定 对应左旋波束, 对应右旋波束(具体取决于坐标系定义)。
  • (方位角):这是柱坐标系下的角度变量,也是连接理论与实际坐标的关键桥梁。

为了将上述理论公式应用于计算机仿真或实际的阵列排布,必须建立方位角 %5Cvarphi_i 与直角坐标 (x_i%2C%20y_i) 之间的数值计算关系。这里存在一个从理想数学到工程计算的细节处理。最直观的数学表达是使用标准的反正切函数 %5Carctan:

%5Cvarphi_i%20%3D%20%5Carctan%5Cleft(%5Cfrac%7By_i%7D%7Bx_i%7D%5Cright)

然而,标准的 %5Carctan 函数值域被限制在 (-%5Cfrac%7B%5Cpi%7D%7B2%7D%2C%20%5Cfrac%7B%5Cpi%7D%7B2%7D) 之间(仅覆盖第一、四象限)。当单元位于第二或第三象限(即 x_i%20%3C%200)时,%5Cfrac%7By_i%7D%7Bx_i%7D 的符号会导致计算出的角度发生 180%5E%5Ccirc 的错误跳变。这种不连续性会破坏 OAM 波束螺旋相位的完整性,导致相位奇点错误。

因此,为了在数学上严格处理全平面 (-%5Cpi%2C%20%5Cpi%5D 的角度连续性,必须使用四象限反正切函数 atan2。最终的工程计算公式为:

%5Cvarphi_i%20%3D%20%5Coperatorname%7Batan2%7D(y_i%2C%20x_i)

该函数能够根据 x_i 和 y_i 的正负号自动判断象限,从而确保生成的相位分布在 360%5E%5Ccirc 范围内是严格连续且平滑的。

直角坐标 (x_i%2C%20y_i)、极径 %5Crho_i 与方位角 %5Cvarphi_i 之间遵循标准的柱坐标变换关系:

%5Cbegin%7Bcases%7D%0Ax_i%20%3D%20%5Crho_i%20%5Ccos%20%5Cvarphi_i%20%5C%5C%0Ay_i%20%3D%20%5Crho_i%20%5Csin%20%5Cvarphi_i%20%5C%5C%0A%5Crho_i%20%3D%20%5Csqrt%7Bx_i%5E2%20%2B%20y_i%5E2%7D%0A%5Cend%7Bcases%7D

这一组关系式确保了我们可以灵活地在直角网格(用于加工制造)和柱坐标相位分布(用于物理原理)之间进行转换。

注记(分支割线):%5Cmathrm%7Batan2%7D 在负 x 轴(射线 %5Cvarphi%20%3D%20%5Cpi)上引入了分支割线,%5Cvarphi_i 跨线时跳变 2%5Cpi。但物理场中只出现单值因子 e%5E%7Bj%5CPsi_%7Boam%7D%7D,故割线的选取不影响任何物理量;同时,下文将看到 %5Cnabla%20%5CPsi_%7Boam%7D 在 %5Cmathbb%7BR%7D%5E2%20%5Csetminus%20%5C%7B0%5C%7D 上是光滑、单值的矢量场,与分支选取无关。多值性恰恰是该场拓扑非平庸的表现。

在波动光学中,场的复振幅通常包含因子 e%5E%7Bj%5CPsi%7D。对于 OAM 项,我们有:

e%5E%7Bj%5CPsi_%7Boam%7D%7D%20%3D%20e%5E%7Bj%20m%20%5Cvarphi_i%7D

利用欧拉公式 e%5E%7Bj%5Cvarphi%7D%20%3D%20%5Ccos%20%5Cvarphi%20%2B%20j%20%5Csin%20%5Cvarphi%20%3D%20%5Cdfrac%7Bx%20%2B%20jy%7D%7B%5Crho%7D,我们可以将其重写为直角坐标形式:

e%5E%7Bj%20m%20%5Cvarphi_i%7D%20%3D%20%5Cleft(%20e%5E%7Bj%20%5Cvarphi_i%7D%20%5Cright)%5Em%20%3D%20%5Cleft(%20%5Cfrac%7Bx_i%20%2B%20j%20y_i%7D%7B%5Csqrt%7Bx_i%5E2%20%2B%20y_i%5E2%7D%7D%20%5Cright)%5Em%20%3D%20%5Cfrac%7B(x_i%20%2B%20j%20y_i)%5Em%7D%7B%5Crho_i%5Em%7D

引入复坐标 %5Czeta%20%3D%20x_i%20%2B%20j%20y_i,上式即 %5Czeta%5Em%20%2F%20%7C%5Czeta%7C%5Em。这个表达式 (x_i%20%2B%20j%20y_i)%5Em 揭示了 OAM 波束在复平面上的解析性质:它在原点 (0%2C0) 处有一个 m 阶零点(若 m%20%3E%200)或极点(若 m%20%3C%200)。

在原点处 %5Crho_i%20%3D%200,方位角 %5Cvarphi_i 无定义(所有角度射线在此交汇),故 %5CPsi_%7Boam%7D 在该点不能连续取值,称为相位奇点(Phase Singularity)。为保证场在物理上连续且有限,振幅必须在奇点处趋于零(物理光束中振幅在原点附近通常满足 A(%5Crho_i)%20%5Cpropto%20%5Crho_i%5E%7B%7Cm%7C%7D,恰好抵消极点发散),即

%5Clim_%7B%5Crho_i%20%5Cto%200%7D%20%7CE%7C%20%3D%200

因此波束中心光强为零,形成著名的暗核(Dark Core)现象。

为了量化波束波前在绕 z 轴旋转一周时的相位累积总量,我们通过计算相位梯度沿闭合回路的线积分来进行分析。

考虑一个以 z 轴为中心、半径为 %5Crho_0(%5Crho_0%20%3E%200)的圆形闭合路径 C。路径参数化为:

%5Cmathbf%7Bl%7D(%5Cvarphi)%20%3D%20%5Crho_0%20%5Ccos%20%5Cvarphi%20%5C%2C%20%5Chat%7B%5Cmathbf%7Bx%7D%7D%20%2B%20%5Crho_0%20%5Csin%20%5Cvarphi%20%5C%2C%20%5Chat%7B%5Cmathbf%7By%7D%7D%2C%20%5Cquad%20%5Cvarphi%20%5Cin%20%5B0%2C%202%5Cpi%5D

对参数求微分,得切向路径微元:

d%5Cmathbf%7Bl%7D%20%3D%20%5Cfrac%7Bd%5Cmathbf%7Bl%7D%7D%7Bd%5Cvarphi%7D%20d%5Cvarphi%20%3D%20%5Cleft(%20-%5Crho_0%20%5Csin%20%5Cvarphi%20%5C%2C%20%5Chat%7B%5Cmathbf%7Bx%7D%7D%20%2B%20%5Crho_0%20%5Ccos%20%5Cvarphi%20%5C%2C%20%5Chat%7B%5Cmathbf%7By%7D%7D%20%5Cright)%20d%5Cvarphi%20%3D%20%5Crho_0%20%5C%2C%20%5Chat%7B%5Cboldsymbol%7B%5Cvarphi%7D%7D%20%5C%2C%20d%5Cvarphi

其中 %5Chat%7B%5Cboldsymbol%7B%5Cvarphi%7D%7D%20%3D%20-%5Csin%20%5Cvarphi%20%5C%2C%20%5Chat%7B%5Cmathbf%7Bx%7D%7D%20%2B%20%5Ccos%20%5Cvarphi%20%5C%2C%20%5Chat%7B%5Cmathbf%7By%7D%7D 为柱坐标系方位角单位矢量。

柱坐标系下梯度算子为 %5Cnabla%20%3D%20%5Chat%7B%5Cboldsymbol%7B%5Crho%7D%7D%20%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%20%5Crho%7D%20%2B%20%5Chat%7B%5Cboldsymbol%7B%5Cvarphi%7D%7D%20%5Cfrac%7B1%7D%7B%5Crho%7D%20%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%20%5Cvarphi%7D%20%2B%20%5Chat%7B%5Cmathbf%7Bz%7D%7D%20%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%20z%7D。作用于 %5CPsi_%7Boam%7D%20%3D%20m%5Cvarphi(仅 %5Cvarphi 方向有变化),得在 %5Crho%20%5Cneq%200 处:

%5Cnabla%20%5CPsi_%7Boam%7D%20%3D%20%5Cfrac%7Bm%7D%7B%5Crho%7D%20%5Chat%7B%5Cboldsymbol%7B%5Cvarphi%7D%7D%20%5Cqquad%20%5Cleft(%20%5Ctext%7B%E7%9B%B4%E8%A7%92%E5%9D%90%E6%A0%87%E5%BD%A2%E5%BC%8F%EF%BC%9A%7D%20%5C%3B%20%5Cnabla%20%5CPsi_%7Boam%7D%20%3D%20%5Cfrac%7Bm(-y_i%20%5Chat%7B%5Cmathbf%7Bx%7D%7D%20%2B%20x_i%20%5Chat%7B%5Cmathbf%7By%7D%7D)%7D%7Bx_i%5E2%20%2B%20y_i%5E2%7D%20%5Cright)

该矢量场在 %5Cmathbb%7BR%7D%5E2%20%5Csetminus%20%5C%7B0%5C%7D 上处处光滑、单值,且局部无旋:%5Cnabla%20%5Ctimes%20(%5Cnabla%20%5CPsi_%7Boam%7D)%20%3D%200。在路径 C 上 %5Crho%20%3D%20%5Crho_0 为常数,代入并利用 %5Chat%7B%5Cboldsymbol%7B%5Cvarphi%7D%7D%20%5Ccdot%20%5Chat%7B%5Cboldsymbol%7B%5Cvarphi%7D%7D%20%3D%201:

%5Cnabla%20%5CPsi_%7Boam%7D%20%5Ccdot%20d%5Cmathbf%7Bl%7D%20%3D%20%5Cleft(%20%5Cfrac%7Bm%7D%7B%5Crho_0%7D%20%5Chat%7B%5Cboldsymbol%7B%5Cvarphi%7D%7D%20%5Cright)%20%5Ccdot%20%5Cleft(%20%5Crho_0%20%5Chat%7B%5Cboldsymbol%7B%5Cvarphi%7D%7D%20%5C%2C%20d%5Cvarphi%20%5Cright)%20%3D%20m%20%5C%2C%20d%5Cvarphi

于是:

%5CDelta%20%5CPsi_%7Boam%7D%20%3D%20%5Coint_C%20%5Cnabla%20%5CPsi_%7Boam%7D%20%5Ccdot%20d%5Cmathbf%7Bl%7D%20%3D%20%5Cint_0%5E%7B2%5Cpi%7D%20m%20%5C%2C%20d%5Cvarphi%20%3D%202%5Cpi%20m

路径无关性。 设 C_1%2C%20C_2 为任意两条包围原点的闭合路径,二者围成一个不含原点的环形区域 D。在 D 上 %5Cnabla%20%5Ctimes%20%5Cnabla%20%5CPsi%20%3D%200,由斯托克斯定理 %5Coint_%7BC_1%7D%20-%20%5Coint_%7BC_2%7D%20%3D%20%5Ciint_D%20(%5Cnabla%20%5Ctimes%20%5Cnabla%20%5CPsi)%5Ccdot%20d%5Cmathbf%7BS%7D%20%3D%200,故积分值与路径形状无关,只取决于路径是否包围奇点(不包围原点时积分为 0)。因此 2%5Cpi%20m 是拓扑不变量,而非某条特殊圆路径的巧合。

结论:

%5CDelta%20%5CPsi_%7Boam%7D%20%3D%202%5Cpi%20m

这意味着,当围绕 z 轴旋转一周时,相位增加了 2%5Cpi 的整数倍 m。

  • 如果 ,相位单值,波前是封闭的(平面或球面)。
  • 如果 ,相位多值,波前无法封闭,形成螺旋结构(Helical Wavefront)。就像螺旋楼梯一样,走一圈后高度(相位)上升了 个波长。
  • 这个积分结果 是一个拓扑不变量,只要路径包围了原点(相位奇点),无论路径形状如何变形,积分值保持不变。

为了理解波是如何传播的,我们需要分析总相位的梯度。总相位 %5CPsi_%7Btotal%7D 包含扫描项和 OAM 项。这里我们专注于 OAM 项产生的局部波矢量分量。

在柱坐标系 (%5Crho%2C%20%5Cvarphi%2C%20z) 中,梯度算子为:

%5Cnabla%20%3D%20%5Chat%7B%5Cboldsymbol%7B%5Crho%7D%7D%20%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%20%5Crho%7D%20%2B%20%5Chat%7B%5Cboldsymbol%7B%5Cvarphi%7D%7D%20%5Cfrac%7B1%7D%7B%5Crho%7D%20%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%20%5Cvarphi%7D%20%2B%20%5Chat%7B%5Cmathbf%7Bz%7D%7D%20%5Cfrac%7B%5Cpartial%7D%7B%5Cpartial%20z%7D

对 %5CPsi_%7Boam%7D%20%3D%20m%5Cvarphi 应用梯度算子:

  • (无径向相位变化)
  • (假设均匀沿 z 传播,忽略衍射发散带来的微小 z 依赖)

因此,OAM 项贡献的相位梯度为:

%5Cnabla%20%5CPsi_%7Boam%7D%20%3D%20%5Cfrac%7B1%7D%7B%5Crho%7D%20(m)%20%5Chat%7B%5Cboldsymbol%7B%5Cvarphi%7D%7D%20%3D%20%5Cfrac%7Bm%7D%7B%5Crho%7D%20%5Chat%7B%5Cboldsymbol%7B%5Cvarphi%7D%7D

局部波矢量 %5Cmathbf%7Bk%7D_%7Blocal%7D:

根据几何光学近似,局部波矢量定义为总相位的梯度:

%5Cmathbf%7Bk%7D_%7Blocal%7D%20%3D%20%5Cnabla%20%5CPsi_%7Btotal%7D%20%3D%20%5Cnabla%20%5CPsi_%7Bscan%7D%20%2B%20%5Cnabla%20%5CPsi_%7Bdist%7D%20%2B%20%5Cnabla%20%5CPsi_%7Boam%7D

其中 %5Cnabla%20%5CPsi_%7Boam%7D%20%3D%20%5Cfrac%7Bm%7D%7B%5Crho%7D%20%5Chat%7B%5Cboldsymbol%7B%5Cvarphi%7D%7D 是一个纯粹沿方位角方向的分量。

这表明,除了主要的传播方向(由 %5Cnabla%20%5CPsi_%7Bscan%7D 决定,通常沿 z 轴或扫描方向 %5Chat%7B%5Cmathbf%7Bu%7D%7D)外,波矢量还有一个横向的旋转分量。

波矢量的大小(模)应满足色散关系 %7C%5Cmathbf%7Bk%7D%7C%20%3D%20k_0%20%3D%20%5Cfrac%7B2%5Cpi%7D%7B%5Clambda%7D。

设主传播方向为 z 轴,则 %5Cmathbf%7Bk%7D%20%5Capprox%20k_z%20%5Chat%7B%5Cmathbf%7Bz%7D%7D%20%2B%20k_%5Cvarphi%20%5Chat%7B%5Cboldsymbol%7B%5Cvarphi%7D%7D。

k_%5Cvarphi%20%3D%20%5Cfrac%7Bm%7D%7B%5Crho%7D

k_z%20%3D%20%5Csqrt%7Bk_0%5E2%20-%20k_%5Cvarphi%5E2%7D%20%3D%20%5Csqrt%7Bk_0%5E2%20-%20%5Cfrac%7Bm%5E2%7D%7B%5Crho%5E2%7D%7D

(注:这仅在 %5Crho%20%3E%20%7Cm%7C%2Fk_0 时成立,即在暗核之外。在暗核内部,傍轴近似失效,需使用严格的衍射理论)。

这个横向分量 k_%5Cvarphi 意味着光线不是直线向前传播,而是沿着螺旋线路径传播。

坡印廷矢量与能量流

坡印廷矢量 %5Cmathbf%7BS%7D 描述了电磁能量的流动方向。在无耗散介质中,%5Cmathbf%7BS%7D 的方向与局部波矢量 %5Cmathbf%7Bk%7D_%7Blocal%7D 平行(对于各向同性介质)。

%5Cmathbf%7BS%7D%20%5Cpropto%20%5Ctext%7BRe%7D(%5Cmathbf%7BE%7D%20%5Ctimes%20%5Cmathbf%7BH%7D%5E*)%20%5Cparallel%20%5Cmathbf%7Bk%7D_%7Blocal%7D

由于 %5Cmathbf%7Bk%7D_%7Blocal%7D 包含方位角分量 %5Cfrac%7Bm%7D%7B%5Crho%7D%20%5Chat%7B%5Cboldsymbol%7B%5Cvarphi%7D%7D,能量流密度 %5Cmathbf%7BS%7D 也具有方位角分量:

%5Cmathbf%7BS%7D%20%3D%20S_z%20%5Chat%7B%5Cmathbf%7Bz%7D%7D%20%2B%20S_%5Cvarphi%20%5Chat%7B%5Cboldsymbol%7B%5Cvarphi%7D%7D

其中 S_%5Cvarphi%20%5Cpropto%20%5Cfrac%7Bm%7D%7B%5Crho%7D%20%7CE%7C%5E2。

能量不仅沿 z 轴向前传输,还绕着 z 轴旋转。能流线(Streamlines)呈螺旋状。这种旋转的能量流正是轨道角动量的宏观表现。

轨道角动量 (OAM) 的量子化与经典对应

经典电磁学视角:

电磁场的角动量密度 %5Cmathbf%7Bj%7D 定义为:

%5Cmathbf%7Bj%7D%20%3D%20%5Cmathbf%7Br%7D%20%5Ctimes%20%5Cmathbf%7Bp%7D

其中 %5Cmathbf%7Bp%7D 是线性动量密度,%5Cmathbf%7Bp%7D%20%3D%20%5Cfrac%7B%5Cmathbf%7BS%7D%7D%7Bc%5E2%7D (在真空中)。

我们要计算的是沿传播方向(z 轴)的角动量分量 J_z。

J_z%20%3D%20%5Cint%20(%5Cmathbf%7Br%7D%20%5Ctimes%20%5Cmathbf%7Bp%7D)_z%20%5C%2C%20dV%20%3D%20%5Cint%20(x%20p_y%20-%20y%20p_x)%20%5C%2C%20dV

在柱坐标下,(%5Cmathbf%7Br%7D%20%5Ctimes%20%5Cmathbf%7Bp%7D)_z%20%3D%20%5Crho%20p_%5Cvarphi。

由于 p_%5Cvarphi%20%5Cpropto%20S_%5Cvarphi%20%5Cpropto%20%5Cfrac%7Bm%7D%7B%5Crho%7D%20%7CE%7C%5E2,则:

%5Crho%20p_%5Cvarphi%20%5Cpropto%20%5Crho%20%5Ccdot%20%5Cfrac%7Bm%7D%7B%5Crho%7D%20%7CE%7C%5E2%20%3D%20m%20%7CE%7C%5E2

可以看到,%5Crho 被消去了。这意味着角动量密度与能量密度 u%20%5Cpropto%20%7CE%7C%5E2 成正比,比例系数为 m。总角动量 L_z 与总能量 W 的关系为:

%5Cfrac%7BL_z%7D%7BW%7D%20%3D%20%5Cfrac%7Bm%7D%7B%5Comega%7D

其中 %5Comega 是角频率。

量子力学视角:

如果我们把电磁波看作光子流,每个光子的能量为 E_%7Bphoton%7D%20%3D%20%5Chbar%20%5Comega。设光子通量为 N(每秒光子数),则总功率 P%20%3D%20N%20%5Chbar%20%5Comega,总能量流对应的时间平均角动量流率(扭矩)为 %5Ctau%20%3D%20%5Cfrac%7BdL_z%7D%7Bdt%7D。

由经典关系 %5Cfrac%7BL_z%7D%7BW%7D%20%3D%20%5Cfrac%7Bm%7D%7B%5Comega%7D,我们可以推导出单个光子携带的角动量:

%5Cfrac%7BL_%7Bz%2C%20total%7D%7D%7BW_%7Btotal%7D%7D%20%3D%20%5Cfrac%7BN%20%5Ccdot%20l_%7Bz%2C%20photon%7D%7D%7BN%20%5Ccdot%20%5Chbar%20%5Comega%7D%20%3D%20%5Cfrac%7Bl_%7Bz%2C%20photon%7D%7D%7B%5Chbar%20%5Comega%7D

令其等于 %5Cfrac%7Bm%7D%7B%5Comega%7D:

%5Cfrac%7Bl_%7Bz%2C%20photon%7D%7D%7B%5Chbar%20%5Comega%7D%20%3D%20%5Cfrac%7Bm%7D%7B%5Comega%7D%20%5Cimplies%20l_%7Bz%2C%20photon%7D%20%3D%20m%20%5Chbar

结论:每个光子携带的 OAM 为 m%5Chbar。

  • 是每个光子的轨道角动量量子数。
  • 是约化普朗克常数。
  • 这与自旋角动量(SAM,对应圆极化,每个光子 )不同,OAM 可以取任意整数值 ,从而提供了无限维度的希尔伯特空间,这在通信中被称为模分复用的基础。

不同布局配置的公式


  • 平面超表面的法向(Broadside)情形:期望方向角为 θ_di = 0 且 φ = 0。这使得仰角调整项实际上为零(因为sinθ=0),共形性调整项也简化了(因为cos0=1)。因此,在这种情形下,主要任务是确保超表面的所有单元根据其与馈源点的距离引入相移。简化后的公式纯粹基于馈源到每个单元的距离来计算相移。这种配置简单有效,可将波垂直于平面超表面反射。
  • 单元共形的法向情形:超表面的单元存在高度变化。假设每个单元i具有不同的高度z,其主要影响是基于单元的不同高度引入相位调整。期望方向角仍可为 θ=0 和 φ=0,但此时共形性调整项变得更加重要,以补偿不同的高度。额外的z项有助于补偿高度差异,确保所有单元尽管存在物理偏移仍能同相反射。
  • 波束指向特定角度:当期望方向角 θ≠0 或 φ≠0 时,仰角调整项和共形调整项在相位计算中起核心作用。这些项确保每个单元贡献正确的相移,将波束导向期望角度。
  • 携带OAM的波束:基于每个单元的坐标,引入OAM相位项。OAM模式索引决定了波前的“扭转”数量。

实例展示

本幻灯片展示了不同配置下超表面的单元相位分布实例:

平面超表面法向波束、


凹面超表面法向波束、


凸面超表面法向波束、


凸面超表面波束指向60°、


凸面超表面OAM模式3/10/20的法向波束、


凹面超表面OAM模式3/10/20的法向波束、

凸面/凹面超表面OAM模式3且波束指向60°的情形。


历史时间线

  • 1960至1970年代:反射阵列的发展。反射阵列最初被构想为抛物面反射器的替代方案。传统抛物面反射器虽然有效,但体积庞大且波束赋形不够灵活。反射阵列以平面形式出现,由谐振单元(如偶极子天线)阵列组成,设计用于对入射电磁波引入特定相移,从而有效地整形和导向反射波束。
  • 1980至1990年代:反射阵列的改进。这一时期的研究专注于使用更复杂的单元和改进的解析模型来改进反射阵列设计,目标是以更低的剖面实现传统反射器的功能。反射阵列在卫星通信中的应用日益增多,因为重量和尺寸限制在那里至关重要。
  • 2000年代:电磁超材料的兴起。“超材料”一词开始流行,指具有自然界中不存在的特性(如负折射率)的工程材料。研究人员开始探索特殊设计的单元阵列如何以前所未有的精度控制电磁波。超表面的概念作为三维超材料的二维类似物被引入,提供了一种利用亚波长尺寸单元操控波的新途径。
  • 2010至2015年:可调谐和有源超表面的发展。材料科学和制造技术的进步推动了可调超表面的发展。通过使用具有可调特性的单元(如变容二极管或MEMS结构),研究人员创造了能够动态控制波前的超表面。编码超表面的概念也随之出现,单元被设计成用数字代码(0和1)表示不同的相位响应,这为可编程表面奠定了基础。
  • 2016至2018年:智能反射表面(IRS)的引入。引入了智能反射表面的概念,即利用先进算法和可编程单元来反射和优化入射电磁波。这些新型超表面将传统反射阵列与智能控制电子器件相结合,实时动态整形和导向波束。单元可通过外部控制信号重新配置,使IRS能够适应变化的环境。IRS被视为改善无线通信网络(尤其是5G及未来)的关键技术。
  • 2019年至今:IRS技术的进步。研究人员专注于通过更好的可重构性、能效以及与机器学习算法的集成来增强IRS。新材料如可调液晶、基于石墨烯的结构和电控超原子已被研究,以提高IRS的性能和适应性。IRS技术目前处于无线通信和信号处理研究的前沿,有望重塑动态环境中信号的传输和接收方式。

应用

  1. 增强无线通信容量:超表面和IRS可通过动态调整各单元的相移将信号聚焦到特定接收器,减少干扰并增强信号强度,从而提高无线网络的容量和可靠性。IRS可以通过智能反射信号来增加独立通信路径的数量,从而增强MIMO系统,扩展可用自由度,带来更高的数据速率和频谱效率。IRS还可以通过智能反射信号到达阴影区或盲区来扩展无线网络的覆盖范围,这对于室内环境、城市峡谷或障碍物密集的区域至关重要。
  2. 频谱和能效提升:IRS和超表面可被编程为以最优方式导向信号,从而最大限度地减少信号能量损失并降低功耗,这在绿色通信网络中尤为重要。通过动态重构反射信号,IRS可以减轻密集环境中用户之间的干扰,提高网络的整体频谱效率。
  3. 通信安全与隐私:IRS可以控制信号反射,为窃听者制造人工干扰区,通过控制信号的空间分布来保护无线通信。超表面可以将信号导向预期用户,同时在其他方向上形成零陷,增强隐私并降低未授权接收的风险。
  4. 感知与成像应用:通过调整反射波,IRS可用于执行环境感知和雷达功能,反射波可提供附近物体的信息,适用于室内定位和运动检测等应用。超表面可以操控波前生成全息图像,可用于高级成像系统、虚拟现实(VR)和增强现实(AR)应用。具有可编程能力的超表面可以通过操控波穿透障碍物并在另一侧重建图像,帮助透视墙壁或致密介质成像。
  5. 可重构光学和微波系统:超表面被广泛用于在光学系统中创建可重构透镜、反射镜和全息图,包括可按需聚焦或散焦光线的透镜,在相机、望远镜和显微镜中很有用。超表面可被设计为在微波通信系统中切换不同的辐射方向图或偏振,实现灵活的自适应天线设计。
  6. 无线功率传输与能量收集:IRS可用于聚焦能量波束,实现向特定设备的高效无线功率传输,可帮助同时为多个设备充电或为偏远地区的物联网传感器供电。超表面可被编程将电磁能量导向能量收集设备,提高从环境信号中收集能量的效率。
  7. 5G及未来:赋能智能网络架构:IRS被视为5G和6G网络的关键使能技术,支持超可靠低时延通信、海量连接和高容量数据传输。通过实时可编程控制,IRS可以适应不断变化的网络条件、用户移动性和动态干扰场景,以保持最佳的网络性能。

Python代码与HFSS自动化结构

在本部分中,我们解释用于在HFSS环境中自动化创建结构的三个Python代码部分,包括:json_data_creator.py(代码讲解)、generate_hfss_script.py(代码讲解)、plotter.py(代码讲解)。


json_data_creator.py 相位综合与贴片尺寸预计算


所需软件包:

  • numpy:用于数值计算的库,尤其适用于数组和矩阵运算
  • pandas:用于数据处理和分析的库
  • scipy:用于科学和技术计算的库
  • matplotlib:绘图库

安装所需软件包:打开命令提示符或终端,运行 pip install numpy pandas scipy matplotlib

功能解析

这段代码是超表面(反射阵列)设计流程中的“相位综合与贴片尺寸预计算”脚本。它本身不做任何电磁仿真,而是完成纯数学计算:根据反射阵列的经典相位公式,算出口径面上每个超原子单元需要提供多少相位补偿,再通过查找表把这个相位“翻译”成贴片的物理尺寸,输出两个数据文件,供后续脚本在 HFSS 中自动建模和绘图。

它在自动化流程中的位置是:

代码块

PlainText


     自动换行
   


     复制代码
   

1234567


HFSS 单元仿真(Floquet 端口 + 贴片尺寸参数扫描)
        │  导出 phase_vs_size.csv(相位-尺寸查找表)
        ▼
★ 本脚本:相位综合 + 尺寸映射
        │
        ├──> patch_data.json ──> generate_hfss_script.py(HFSS 自动建模)
        └──> phase_data.csv  ──> plotter.py(绘制相位分布图)
        
      复制成功
     
     
     
     

查找表来自前期 HFSS 中对单元的 Floquet 端口仿真与贴片尺寸参数扫描,记录了“贴片边长 → 反射相位”的单调对应关系,例如贴片从 1%5C%2C%5Cmathrm%7Bmm%7D 增大到 4.6%5C%2C%5Cmathrm%7Bmm%7D 时,反射相位从 %2B170%5E%5Ccirc 单调降至 -170%5E%5Ccirc。它是连接理论与工程的桥梁:理论告诉每个单元“需要多少相位”,查找表告诉工程师“多大的贴片能提供这个相位”。

三个函数的分工

① `load_unit_cell_data()` — 加载查找表。用 pandas 读取 CSV,把相位列 %5C%7B%5Cvarphi_j%5C%7D 和尺寸列 %5C%7Bs_j%5C%7D 分别转成 numpy 数组返回。

② `calculate_patch_size()` — 相位到尺寸的最近邻匹配。查找表只含有限个离散尺寸点(步长由 HFSS 参数扫描决定),算出的目标相位一般不会精确命中表中的某个值,因此采用最近邻匹配:

j%5E*%20%3D%20%5Carg%5Cmin_%7Bj%7D%5Cleft%7C%5C%2C%5Cvarphi_j%20-%20%5Cvarphi_%7B%5Cmathrm%7Btarget%7D%7D%5C%2C%5Cright%7C%2C%20%5Cqquad%20s%20%3D%20s_%7Bj%5E*%7D

即在全表中找相位差绝对值最小的条目并返回其尺寸。这种处理天然带有量化误差,误差上界就是查找表的步长,属于反射阵列设计的固有近似。

③ `pre_calculate_data()` — 主函数,封装全部设计逻辑,下面逐步展开。

主函数执行流程

1. 基本电磁参数

工作频率取 f_0%20%3D%2030%5C%2C%5Cmathrm%7BGHz%7D(必须与 HFSS 单元仿真同频点,否则查找表失效),由此计算波长与波数:

%5Clambda%20%3D%20%5Cfrac%7Bc%20%5Ctimes%201000%7D%7Bf_0%7D%20%5Capprox%2010%5C%2C%5Cmathrm%7Bmm%7D%2C%20%5Cqquad%20k%20%3D%20%5Cfrac%7B2%5Cpi%7D%7B%5Clambda%7D%20%5Capprox%200.6288%5C%2C%5Cmathrm%7Brad%2Fmm%7D

其中 %5Ctimes%201000 是把光速从 %5Cmathrm%7Bm%2Fs%7D 换算到 %5Cmathrm%7Bmm%2Fs%7D 的单位换算。

2. 设计参数

期望波束指向取 (%5Ctheta%2C%20%5Cvarphi)%20%3D%20(0%5E%5Ccirc%2C%200%5E%5Ccirc),即法向 broadside 辐射;馈源(喇叭天线相位中心)坐标取 (x_c%2C%20y_c%2C%20z_c)%20%3D%20(0%2C%200%2C%2055)%5C%2C%5Cmathrm%7Bmm%7D;口径直径 D%20%3D%20100%5C%2C%5Cmathrm%7Bmm%7D,真实半径为 D%2F2%20%3D%2050%5C%2C%5Cmathrm%7Bmm%7D;单元间距 d%20%3D%205%5C%2C%5Cmathrm%7Bmm%7D%20%5Capprox%20%5Clambda%2F2,满足亚波长周期、抑制栅瓣的要求;OAM 模式指数 m%20%3D%200(普通波束,m%20%5Cneq%200 时产生涡旋波束);焦径比 F%2FD%20%3D%201000。参考相位 %5Cvarphi_%7B%5Cmathrm%7Bzer%7D%7D%20%3D%20-180%5E%5Ccirc 的作用是把取模后落在 %5B0%5E%5Ccirc%2C%20360%5E%5Ccirc) 的相位平移到工程范围 %5B-180%5E%5Ccirc%2C%20180%5E%5Ccirc),与 HFSS 导出的 S 参数相位范围对齐:

%5Cvarphi_%7B%5Cmathrm%7Bfinal%7D%7D%20%5Cin%20%5B-180%5E%5Ccirc%2C%5C%20180%5E%5Ccirc)

3. 共形面(抛物面)参数

焦距与矢高按以下公式计算:

f%20%3D%20%5Cfrac%7BF%7D%7BD%7D%20%5Ccdot%20D%2C%20%5Cqquad%20h%20%3D%20%5Cfrac%7BD%5E2%7D%7B16%20f%7D

本例 F%2FD%20%3D%201000 使 h%20%5Capprox%200.006%5C%2C%5Cmathrm%7Bmm%7D,几乎可以忽略——实质上把共形面近似成了平面口径。而馈源实际位于 z_c%20%3D%2055%5C%2C%5Cmathrm%7Bmm%7D 处的偏离由相位公式中的路径项独立补偿,两者并不矛盾。每个单元的高度服从旋转抛物面方程:

z_i%20%3D%20%5Cpm%5Cleft(h%20-%20%5Cfrac%7Bx_i%5E2%20%2B%20y_i%5E2%7D%7B4%20f%7D%5Cright)

符号由 sign_z 控制(%2B1 为凸面,-1 为凹面),中心处 z_i%20%3D%20%5Cpm%20h,边缘处(r_i%20%3D%20D%2F2)z_i%20%3D%200。

4. 网格生成与 OAM 相位

以单元间距 d 为步长生成覆盖 %5Cleft%5B-D%2F2%2C%5C%20D%2F2%5Cright%5D 的 21%20%5Ctimes%2021 方形网格(rad % uedim 项保证口径直径非单元间距整数倍时网格仍对称居中),并在每个网格点上计算 OAM 螺旋相位项:

%5Cvarphi_%7B%5Cmathrm%7BOAM%7D%7D%20%3D%20m%20%5Ccdot%20%5Carctan2(y%2C%5C%20x)

当 m%20%3D%200 时该项恒为零;当 m%20%5Cneq%200 时,形成绕中心旋转 2%5Cpi%20m 的螺旋相位面,产生涡旋波束。

5. 核心:反射阵列相位公式

对每个通过圆形口径筛选 r_i%20%3D%20%5Csqrt%7Bx_i%5E2%20%2B%20y_i%5E2%7D%20%3C%20D%2F2 的单元(最终约 305 个有效单元),先计算馈源到它的空间距离:

R_i%20%3D%20%5Csqrt%7B(x_c%20-%20x_i)%5E2%20%2B%20(y_c%20-%20y_i)%5E2%20%2B%20(z_c%20-%20z_i)%5E2%7D

再套入全脚本的相位公式:

%5Cpsi_i%20%3D%20k%5Cleft%5BR_i%20-%20z_i%20%5Ccos%5Ctheta%20-%20%5Csin%5Ctheta%5Cleft(x_i%20%5Ccos%5Cvarphi%20%2B%20y_i%20%5Csin%5Cvarphi%5Cright)%5Cright%5D

三项各有分工:

  • — 路径补偿项:补偿馈源球面波传播到该单元的路径相位,把球面波前“拉平”成平面;
  • — 共形校正项:补偿单元高度沿波束方向的投影,确保表面起伏时各单元仍能同相叠加;
  • — 波束扫描项:在口径上叠加沿指向方向的线性相位梯度;当 时该项自然消失,公式退化为纯路径补偿 。

这个公式本质上是标准反射阵列综合条件的代码化。设期望波束方向的单位矢量为:

%5Chat%7Br%7D%20%3D%20%5Cleft(%5Csin%5Ctheta%5Ccos%5Cvarphi%2C%5C%20%5Csin%5Ctheta%5Csin%5Cvarphi%2C%5C%20%5Ccos%5Ctheta%5Cright)

单元位置矢量为 %5Cmathbf%7Br%7D_i%20%3D%20(x_i%2C%5C%20y_i%2C%5C%20z_i),则综合条件为:

%5Cpsi_i%20%3D%20k_0%5Cleft(R_i%20-%20%5Cmathbf%7Br%7D_i%20%5Ccdot%20%5Chat%7Br%7D%5Cright)

展开内积即得上面的三项式,完全等价。

6. 相位合成与取模

空间相位与 OAM 相位相加后,对 2%5Cpi 取模(利用相位周期性,相差 2%5Cpi 整数倍的波前完全等价),再转成度数并加上参考相位:

%5Cvarphi_i%20%3D%20%5Coperatorname%7Bmod%7D%5Cleft(m%20%5Carctan2(y_i%2C%5C%20x_i)%20%2B%20%5Cpsi_i%2C%5C%202%5Cpi%5Cright)%2C%20%5Cqquad%20%5Cvarphi_%7Bi%2C%5Cmathrm%7Bdeg%7D%7D%20%3D%20%5Cfrac%7B180%5E%5Ccirc%7D%7B%5Cpi%7D%5C%2C%5Cvarphi_i%20-%20180%5E%5Ccirc

7. 尺寸映射与结果

最终相位 %5Cvarphi_%7Bi%2C%5Cmathrm%7Bdeg%7D%7D 一方面存入二维相位矩阵(口径外保持 NaN,绘图时自然显示空白),另一方面送入最近邻匹配得到贴片边长 s_i%20%3D%20s_%7Bj%5E*%7D,连同坐标一起记录为一条单元数据 %5C%7Bx_i%2C%5C%20y_i%2C%5C%20z_i%2C%5C%20s_i%2C%5C%20%5Cvarphi_%7Bi%2C%5Cmathrm%7Bdeg%7D%7D%5C%7D。循环结束后输出两个文件:

  • `phase_data.csv` — 整个口径的二维相位分布矩阵(无表头无索引),供 plotter.py 用 imshow 直接可视化,效果类似 Matlab 的 imagesc;
  • `patch_data.json` — 每单元一条记录,供 generate_hfss_script.py 逐条读取,在 HFSS 中创建地面层(PEC)、介质层和顶部金属贴片的三层结构。

关键代码逐步讲解

  • 导入软件包:numpy(np)处理数值运算和数组操作;pandas(pd)用于处理表格数据、读取和保存CSV或JSON文件;scipy.constants.speed_of_light 提供光速常数,计算波长时需要。
  • 定义 `load_unit_cell_data` 函数:用途是将CSV文件中的反射相位与尺寸数据加载到两个数组(phases和sizes)中。pd.read_csv 读取位于 file_path 的CSV文件;.to_numpy() 将列转换为numpy数组以便操作。
  • 定义 `calculate_patch_size` 函数:用途是根据计算出的目标相位确定合适的贴片尺寸。过程是找到计算的目标相位与现有相位之间差值最小的索引idx,返回sizes数组中对应的尺寸。
  • 定义 `pre_calculate_data` 函数:用途是计算相位和贴片数据并保存到文件中的主函数。参数:output_file(保存贴片数据的JSON文件名)、phase_data_file(保存相位数据的CSV文件名)。
  • 加载反射数据:从CSV文件 phase_versus_size.csv 加载反射相位与尺寸数据。
  • 定义参数:频率(本代码以10 GHz为例,仿真中我们将使用30 GHz作为超表面工作频率);波长计算(将光速从m/s转换为mm/s并除以频率得到波长);波数k(计算为2π/波长)。
  • 示例值:方向角(theta_d 和 phi_d 分别为θ和φ方向的角度,单位为度);馈源坐标(xc, yc, zc为馈源天线位置);直径(rad为数列的整体直径,单位毫米);单元间距(weum为数列中单元之间的距离);OAM模式(oam_m为轨道角动量模式,作为示例设置);F/D比(fod为焦距与直径之比);焦距f计算为fod乘以rad。
  • 计算高度参数:使用公式 rad²/16f 计算高度参数。
  • 设置共形模式:确定表面是凸面还是凹面。
  • 生成坐标网格:使用 np.meshgrid 在给定半径内创建点网格。x_range 和 y_range 是坐标范围。
  • 计算角相位:使用 xi、yi 的反正切计算角相移。
  • 初始化相位数据:创建一个空的二维数组来存储计算出的相位值。
  • 遍历网格:遍历所有网格点,检查它们是否落在半径范围内。
  • 计算高度和距离:计算高度z以及从馈源坐标出发的距离r。
  • 计算相移:计算每个网格点的相移。
  • 计算修正相位(以度为单位):将计算出的相位转换为度数,并加上参考相位。
  • 将相位存储到二维数组中。
  • 确定贴片尺寸:根据计算出的相位确定贴片尺寸。
  • 追加贴片数据:将计算出的数据追加到 patch_data 列表中。
  • 将相位数据保存到CSV:将二维相位数据保存为CSV文件。
  • 将贴片数据保存到JSON:将贴片数据保存为JSON文件。
  • 执行主函数:如果脚本直接运行,则调用 pre_calculate_data 函数。

详细注释版代码

脚本末尾的 if __name__ == "__main__" 保证它被直接运行时才执行主函数,被 import 时不产生副作用。

代码块

PlainText


     自动换行
   


     复制代码
   

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152


import numpy as np
import pandas as pd
from scipy.constants import speed_of_light
# 导入科学计算库:numpy用于数值计算,pandas用于数据读写,speed_of_light为光速常量(299792458 m/s)


# ===================== 函数1:加载单元胞数据 =====================
def load_unit_cell_data(file_path):
    """
    从CSV文件中加载预仿真的单元胞(phase vs size)数据。
    CSV文件应包含两列:'Phase'(反射相位,单位度) 和 'Size'(patch尺寸,单位mm)。
    这是超表面设计的基础查找表(Look-Up Table)。
    """
    df = pd.read_csv(file_path)
    # 读取CSV文件,假设列名为 'Phase' 和 'Size'
    phases = df['Phase'].to_numpy()   # 提取相位列,转为numpy数组
    sizes = df['Size'].to_numpy()     # 提取尺寸列,转为numpy数组
    return phases, sizes


# ===================== 函数2:根据目标相位查找patch尺寸 =====================
def calculate_patch_size(target_phase, phases, sizes):
    """
    给定一个目标相位值,在查找表中找到最接近的相位对应的patch尺寸。
    这是超表面设计的核心映射:相位 → 几何尺寸。
    """
    idx = (np.abs(phases - target_phase)).argmin()
    # 计算目标相位与所有预仿真相位的绝对差,取最小值的索引
    return sizes[idx]
    # 返回该索引对应的patch尺寸


# ===================== 函数3:预计算所有patch数据(主函数) =====================
def pre_calculate_data(output_file="patch_data.json", phase_data_file="phase_data.csv"):
    """
    主计算函数:根据超表面设计参数,计算每个单元胞的位置、高度、所需相位和对应patch尺寸,
    最终输出两个文件:
      - patch_data.json:每个patch的坐标和尺寸(供HFSS脚本读取建模)
      - phase_data.csv:2D相位分布图数据(供Plotter.py绘图)
    """

    # ---------- 1. 加载单元胞查找表 ----------
    phases, sizes = load_unit_cell_data("phase_vs_size.csv")
    # 从 "phase_vs_size.csv" 加载预仿真的 相位-尺寸 对应关系

    # ---------- 2. 用户自定义参数 ----------
    freq = 30e9                        # 工作频率:30 GHz
    wavelength = (speed_of_light * 1000) / freq
    # 计算自由空间波长(mm):λ = c / f,乘以1000将m转换为mm
    k = 2 * np.pi / wavelength         # 自由空间波数(rad/mm)

    the_dir = 0                        # 波束指向:theta方向(度),0表示法线方向
    phi_dir = 0                        # 波束指向:phi方向(度),0表示x-z平面
    pha_zer = -180                     # 参考相位偏移(度),用于调整整体相位基准

    x_cor, y_cor, z_cor = 0, 0, 55    # 馈源位置坐标(mm):位于z=55mm处,即焦点附近
    rad = 100                          # 超表面口径直径(mm)
    uedim = 5                          # 单元胞间距/周期(mm)

    OAM_m = 0                          # 轨道角动量(OAM)模式数,0表示不携带OAM
    FOD = 1000                         # F/D比(焦距/口径比),1000表示近似平面波(准直)
    f = FOD * rad                      # 焦距(mm) = F/D × D = 1000 × 100 = 100000 mm

    # ---------- 3. 计算共形曲面参数 ----------
    h = (rad ** 2) / (16 * f)
    # 抛物面顶点高度(mm):h = D²/(16f),这是抛物面方程 z = h - (x²+y²)/(4f) 的顶点值

    sign_z = +1                        # 共形模式:+1=凸面(Convex),-1=凹面(Concave)

    # ---------- 4. 生成二维坐标网格 ----------
    xi_range = np.arange(-rad/2 + rad % uedim, rad/2 + uedim, uedim)
    yi_range = np.arange(-rad/2 + rad % uedim, rad/2 + uedim, uedim)
    # 在 [-rad/2, rad/2] 范围内以 uedim 为步长生成离散坐标点
    # rad % uedim 用于处理口径不能被周期整除时的边界对齐

    XI, YI = np.meshgrid(xi_range, yi_range)
    # 生成二维网格坐标矩阵

    # ---------- 5. 计算OAM角向相位 ----------
    angular_phase = OAM_m * np.arctan2(YI, XI)
    # OAM相位 = m × arctan(y/x),当 OAM_m=0 时此项为0(不携带涡旋相位)

    # ---------- 6. 初始化存储数组 ----------
    phase_deg_2d = np.full(XI.shape, np.nan)
    # 初始化2D相位数组,用NaN填充(圆口径外的区域保持NaN)

    patch_data = []
    # 初始化patch数据列表,每个元素是一个字典

    # ---------- 7. 遍历网格,逐个计算patch参数 ----------
    for ix, xi in enumerate(xi_range):
        for iy, yi in enumerate(yi_range):

            # 只处理圆形口径内的单元胞
            if np.sqrt(xi**2 + yi**2) < rad/2:

                # --- 7a. 计算该位置的曲面高度(抛物面方程) ---
                zi = sign_z * (h - (xi**2 + yi**2) / (4 * f))
                # 抛物面方程:z = ±[h - (x²+y²)/(4f)]
                # sign_z=+1 为凸面,sign_z=-1 为凹面

                # --- 7b. 计算馈源到该单元胞的距离 ---
                R = np.sqrt((x_cor - xi)**2 + (y_cor - yi)**2 + (z_cor - zi)**2)
                # 三维欧氏距离:从馈源(x_cor,y_cor,z_cor)到patch中心(xi,yi,zi)

                # --- 7c. 计算补偿相位(空间相位延迟) ---
                phase = k * (
                    R                                          # 球面波传播相位
                    - zi * np.cos(np.deg2rad(the_dir))         # 波束指向补偿(theta分量)
                    - np.sin(np.deg2rad(the_dir)) * (          # 波束指向补偿(横向分量)
                        xi * np.cos(np.deg2rad(phi_dir))
                        + yi * np.sin(np.deg2rad(phi_dir))
                    )
                )
                # 总相位 = k × [R - zi·cosθ - sinθ·(xi·cosφ + yi·sinφ)]
                # 这是将球面波转换为指定方向平面波所需的相位补偿公式

                # --- 7d. 叠加OAM相位并转换为角度 ---
                m_phase = np.mod(angular_phase[iy, ix] + phase, 2 * np.pi)
                # 总相位 = (OAM角向相位 + 空间补偿相位) mod 2π,限制在[0, 2π)

                m_phase_deg = m_phase * 180 / np.pi + pha_zer
                # 转换为角度制,并加上参考相位偏移(-180°)

                # --- 7e. 存储相位到2D数组 ---
                phase_deg_2d[iy, ix] = m_phase_deg

                # --- 7f. 根据相位查找对应的patch尺寸 ---
                patch_size = calculate_patch_size(m_phase_deg, phases, sizes)
                # 在查找表中找最接近 m_phase_deg 的相位,返回对应的patch尺寸

                # --- 7g. 记录该patch的所有参数 ---
                patch_data.append({
                    "xi": xi,                  # x坐标(mm)
                    "yi": yi,                  # y坐标(mm)
                    "zi": zi,                  # z坐标/曲面高度(mm)
                    "patch_size": patch_size,  # patch边长(mm)
                    "m_phase_deg": m_phase_deg # 计算得到的目标相位(度),仅供参考
                })

    # ---------- 8. 保存结果文件 ----------
    # 保存2D相位分布到CSV(供Plotter.py绘制相位分布图)
    pd.DataFrame(phase_deg_2d).to_csv(phase_data_file, header=False, index=False)

    # 保存patch数据到JSON(供Generate_hfss_script.py读取并在HFSS中自动建模)
    pd.DataFrame(patch_data).to_json(output_file, orient="records")


# ===================== 程序入口 =====================
if __name__ == "__main__":
    pre_calculate_data("patch_data.json", "phase_data.csv")
    # 执行预计算,输出 patch_data.json 和 phase_data.csv
    
      复制成功
     
     
     
     

generate_hfss_script.py

HFSS 内置的 Python 解释器基于 Python 2.7,默认只认 ASCII。文件开头添加 # -*- coding: utf-8 -*-

本脚本使用HFSS内嵌的Python环境(Python 2.7),该环境与功能完整的Python不同。需确保已安装HFSS并设置好项目。

代码块

PlainText


     自动换行
   


     复制代码
   

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114


# -*- coding: utf-8 -*-
import ScriptEnv
import json
# ScriptEnv: HFSS内置脚本环境模块(非标准Python库,仅在HFSS脚本编辑器中可用)
# json: 用于读取patch_data.json数据文件


def main():
    # ===================== 1. HFSS环境初始化 =====================
    ScriptEnv.Initialize("Ansoft.ElectronicsDesktop")
    # 初始化HFSS脚本环境,连接到Ansys Electronics Desktop应用

    oDesktop.RestoreWindow()
    # 恢复HFSS桌面窗口到前台

    oProject = oDesktop.SetActiveProject("metasurface")
    # 激活名为 "meta-surface7" 的已有项目(项目名称硬编码,需与实际项目名一致)

    oDesign = oProject.SetActiveDesign("HFSSDesign1")
    # 激活项目中名为 "HFSSDesign1" 的设计

    oEditor = oDesign.SetActiveEditor("3D Modeler")
    # 激活3D建模器,后续所有几何创建操作都通过此对象执行

    # ===================== 2. 加载预计算的patch数据 =====================
    with open("F:\\patch_data.json", "r") as f:
        patch_data = json.load(f)
    # 硬编码的绝对路径!从Jason_data_creator输出的JSON文件中读取所有patch参数
    # 每个元素包含: xi, yi, zi, patch_size, m_phase_deg

    # ===================== 3. 用户定义的全局固定参数 =====================
    ground_height = 0.1          # 接地板厚度(mm)
    dielectric_height = 1.0      # 介质基板厚度(mm)
    top_patch_height = 0.1       # 顶部金属贴片厚度(mm)
    dielectric_material = "Rogers RO3003 (tm)"  # 基板材料名称(必须在HFSS材料库中存在)
    uedim = 5                    # 单元胞间距/周期(mm),与Jason_data_creator中的uedim一致

    # ===================== 4. 遍历每个patch,创建三层结构 =====================
    for i, patch in enumerate(patch_data):
        xi = patch["xi"]              # patch所在单元胞的x坐标(mm)
        yi = patch["yi"]              # patch所在单元胞的y坐标(mm)
        zi = patch["zi"]              # patch所在曲面高度z坐标(mm),来自抛物面方程
        patch_size = patch["patch_size"]  # 该位置对应的patch边长(mm)

        # 计算patch中心坐标(在单元胞内居中)
        xi_center = xi + uedim / 2
        yi_center = yi + uedim / 2
        # 注意:这里将(xi,yi)视为单元胞左下角,patch在其中心偏移uedim/2处

        # ---------- 4a. 创建接地板(Ground) ----------
        oEditor.CreateBox(
            [
                "NAME:BoxParameters",
                "XPosition:=", "{}mm".format(xi),           # X起点 = 单元胞左下角x
                "YPosition:=", "{}mm".format(yi),           # Y起点 = 单元胞左下角y
                "ZPosition:=", "{}mm".format(zi - 0.0001),  # Z起点 = 曲面高度略下方(避免与patch重叠)
                "XSize:=", "{}mm".format(uedim - 0.0001),   # X尺寸 = 周期略小(避免相邻ground接触)
                "YSize:=", "{}mm".format(uedim - 0.0001),   # Y尺寸 = 周期略小
                "ZSize:=", "{}mm".format(ground_height)     # Z尺寸 = 接地板厚度
            ],
            [
                "NAME:Attributes",
                "Name:=", "Ground_{}".format(i),            # 唯一命名: Ground_0, Ground_1, ...
                "MaterialValue:=", "\"pec\"",               # 材料: 理想电导体(PEC)
                "SolveInside:=", False                      # PEC内部不求解电磁场
            ]
        )
        # zi - 0.0001 和 uedim - 0.0001 是防止几何重合/相交的微调技巧

        # ---------- 4b. 创建介质基板(Dielectric/PCB) ----------
        oEditor.CreateBox(
            [
                "NAME:BoxParameters",
                "XPosition:=", "{}mm".format(xi),           # 与ground对齐
                "YPosition:=", "{}mm".format(yi),
                "ZPosition:=", "{}mm".format(zi + ground_height),  # 紧贴接地板顶面
                "XSize:=", "{}mm".format(uedim - 0.0001),
                "YSize:=", "{}mm".format(uedim - 0.0001),
                "ZSize:=", "{}mm".format(dielectric_height)       # 基板厚度
            ],
            [
                "NAME:Attributes",
                "Name:=", "Dielectric_{}".format(i),        # 唯一命名: Dielectric_0, ...
                "MaterialValue:=", "\"{}\"".format(dielectric_material),  # Rogers RO3203
                "SolveInside:=", True,                      # 介质内部需要求解场
                "Color:=", "(128 128 128)"                   # 灰色显示
            ]
        )

        # ---------- 4c. 创建顶部金属贴片(Top Patch) ----------
        oEditor.CreateBox(
            [
                "NAME:BoxParameters",
                "XPosition:=", "{}mm".format(xi_center - patch_size / 2),  # 居中放置
                "YPosition:=", "{}mm".format(yi_center - patch_size / 2),
                "ZPosition:=", "{}mm".format(zi + ground_height + dielectric_height),  # 基板顶面
                "XSize:=", "{}mm".format(patch_size),       # patch边长(每个不同!)
                "YSize:=", "{}mm".format(patch_size),
                "ZSize:=", "{}mm".format(top_patch_height)  # 贴片厚度
            ],
            [
                "NAME:Attributes",
                "Name:=", "TopPatch_{}".format(i),          # 唯一命名: TopPatch_0, ...
                "MaterialValue:=", "\"pec\"",               # 理想电导体
                "SolveInside:=", False                      # PEC内部不求解
            ]
        )
        # 每个patch的尺寸(patch_size)不同,但都在各自单元胞内居中
        # z坐标 = zi + ground_height + dielectric_height,随曲面高度zi变化 → 共形


# ===================== 程序入口 =====================
if __name__ == "__main__":
    main()
    
      复制成功
     
     
     
     

代码逐步讲解:

  1. 导入软件包:ScriptEnv 是用于与Ansys Electronics Desktop交互的特殊HFSS软件包,通过HFSS脚本接口实现自动化;json用于读取存储在JSON文件中的预计算贴片数据。
  2. 定义main函数:该函数作为脚本的入口点,封装了在HFSS中生成超表面设计所需的所有逻辑。
  3. 初始化HFSS环境:ScriptEnv.Initialize 初始化HFSS环境以允许Python脚本控制它;oDesktop.RestoreWindow 在最小化或隐藏时恢复HFSS主窗口。
  4. 设置活动项目和设计:oProject 将HFSS中的活动项目设置为"Project1"(确保名称与您在HFSS中的实际项目匹配);oDesign 将活动设计设置为"HFSSDesign1"(同样确保该名称与HFSS项目中的设计匹配);oEditor 将活动编辑器设置为"3D Modeler",负责3D建模操作(如创建和修改3D对象)。
  5. 加载预计算贴片数据:从JSON文件加载预计算的贴片数据,确保正确指定文件路径。json.load 将JSON数据读入Python字典/列表以便访问。
  6. 用户定义尺寸:设置每层(地面、介质和顶部贴片)的尺寸以及单元间距等其他参数;weum代表单元尺寸。
  7. 遍历预计算贴片数据:遍历预计算贴片数据中的每个条目,提取每个贴片的坐标和尺寸值。
  8. 顶部贴片居中:将顶部贴片的中心在X和Y方向上偏移半个单元间距,使其在每个单元内居中。
  9. 创建地面层:使用HFSS API创建代表地面层的长方体。box属性包括:name(使用循环索引i为每个地面层命名)、material(将材料设置为PEC,即理想电导体)、solve inside(设为false,因为理想电导体内部不需要求解)。
  10. 创建介质PCB层:在地面层之上创建介质PCB层的长方体;color使用RGB值(128, 128, 128)将介质层颜色设置为灰色。
  11. 创建顶部金属贴片:在每个单元内创建居中的顶部金属贴片长方体。居中:X和Y位置偏移 patch_size/2 使贴片在每个单元内居中。
  12. 执行main函数:确保仅在脚本直接执行时(而非作为模块导入时)调用main函数。

在HFSS中运行脚本的指南:确保已安装HFSS(脚本直接与HFSS交互,因此必须安装并配置该软件);验证项目和设计名称(确保 Project1 和 HFSSDesign1 与 在HFSS中的项目和设计名称匹配);检查文件路径(确认文件路径正确且可访问)。

运行脚本:打开HFSS,Tools > Run Script...,在HFSS中加载并运行脚本以自动化生成超表面。该脚本通过利用预计算的贴片数据自动创建超表面设计。它从JSON文件读取数据,在HFSS中设置各层,并根据预计算信息确保每个单元的位置和尺寸正确。 (Record Script 可以记录界面图形化操作到 Python 文件)


plotter.py

代码块

PlainText


     自动换行
   


     复制代码
   

1234567891011121314151617181920212223242526272829


import numpy as np  # 导入NumPy库,用于数值计算
import pandas as pd  # 导入Pandas库,用于数据处理和分析
import matplotlib.pyplot as plt  # 导入Matplotlib的pyplot模块,用于绘图
 
def plot_phase_data(phase_data_file="phase_data_file", output_image_file="phase_plot.png"): 
    # 功能:绘制相位分布图
    # 输入:包含相位数据的CSV文件名(默认值 "phase_data_file")
    # 输出:生成的图片文件名(默认值 "phase_plot.png")
    
    # 从CSV文件加载2D相位数据
    # header=None 表示文件不包含标题行
    # to_numpy() 将DataFrame转换为NumPy数组
    phase_deg_2d = pd.read_csv(phase_data_file, header=None).to_numpy() 
 
    # 绘制相位数据
    plt.figure(figsize=(8, 8))  # 创建一个8x8英寸的图形窗口
    # 使用imshow绘制2D数组作为图像
    # cmap='jet' 设置颜色映射为jet(蓝-青-黄-红)
    # origin='lower' 设置坐标原点在左下角
    plt.imshow(phase_deg_2d, cmap='jet', origin='lower') 
    plt.colorbar(label="Phase (degrees)")  # 添加颜色条,标签为 "Phase (degrees)"
    plt.title("Phase Distribution")  # 设置图表标题为 "Phase Distribution"
    plt.xlabel("X (mm)")  # 设置X轴标签为 "X (mm)"
    plt.ylabel("Y (mm)")  # 设置Y轴标签为 "Y (mm)"
    plt.savefig(output_image_file)  # 将图形保存为文件
    plt.close()  # 关闭图形窗口,释放内存
 
if __name__ == "__main__":  # 如果脚本作为主程序运行
    plot_phase_data("phase_data.csv", "phase_plot.png")  # 调用绘图函数,指定输入输出文件
    
      复制成功
     
     
     
     

该Python脚本负责将之前计算步骤中生成的二维相位数据可视化。它从CSV文件读取相位数据,并使用matplotlib将其绘制为图像,这类似于Matlab中的imagesc函数。

所需软件包:numpy(高效数值运算)、pandas(将CSV文件读取为结构化格式并转换为numpy数组)、matplotlib(创建和保存图表)。

代码逐步讲解:

  1. 导入软件包:numpy(np)用于数值运算和高效数组操作;pandas(pd)读取和处理CSV文件中的表格数据;matplotlib.pyplot(plt)创建可视化图表(如绘制二维相位分布)。
  2. 定义 `plot_phase_data` 函数:用途是定义一个从CSV文件读取二维相位数据并创建图表的函数,图表保存为PNG图像。参数:phase_data_file(包含二维相位数据的CSV文件名)、output_image_file(保存图表的PNG图像文件名)。
  3. 加载二维相位数据:使用pandas从CSV文件读取相位数据。pd.read_csv 读取不带表头的CSV文件(由 header=None 指示)并转换为pandas DataFrame;.to_numpy() 将DataFrame转换为numpy数组,便于绘图和数值运算。
  4. 绘制相位数据:使用matplotlib绘制二维数组。plt.figure 创建一个8×8英寸的新图形;plt.imshow 使用jet颜色映射将二维数组显示为图像,以直观区分不同的相位值(cmap='jet'——jet颜色映射提供平滑渐变,常用于可视化,类似Matlab的默认颜色映射;origin='lower' 将原点设置在图的左下角,便于解读);plt.colorbar 在图旁添加颜色条以指示相位值(度);plt.title 将图标题设置为“Phase Distribution(相位分布)”;plt.xlabel 和 plt.ylabel 标注X轴和Y轴(单位为毫米),表明该图对应物理尺寸。
  5. 将图表保存为图像:plt.savefig 将绘制的图像保存到指定输出文件(本例中为phase_plot.png);plt.close 关闭当前图形以释放内存,这在运行生成多个图表的脚本时尤为重要。
  6. 调用主函数:检查脚本是否直接运行(而非作为模块导入),并执行 plot_phase_data 函数(plot_phase_data('phase_data.csv', 'phase_plot.png') 指定函数应从phase_data.csv读取并将输出图表保存为phase_plot.png)。

该脚本设计用于使用pandas从CSV文件读取二维相位数组,使用matplotlib将二维相位数据可视化为图像,并将结果图表保存为PNG图像。

HFSS仿真

既然我们已经解释了代码的所有部分,让我们开始HFSS仿真。

第一部分:设计馈电喇叭天线

HFSS仿真的第一部分是设计照射超表面的喇叭馈电天线。我们点击“新建”创建一个新项目,然后点击"HFSS"在项目中创建HFSS环境。

接着,我们使用 View 菜单中的 Component Libraries 选项创建预设计的圆形喇叭天线,并设置喇叭的参数。或者使用 ACT Extensions 同样可以创建。


接下来,我们在天线周围创建开放边界,将频率设置为30 GHz,然后添加分析设置。

依据具体版本,HFSS 求解类型取消勾选 Auto-Open Region

添加分析求解


现在我们验证HFSS设置并运行仿真。仿真结束后,我们得到三维和二维辐射方向图。可以看到,方向图一侧的3dB波束宽度约为45°。


第二部分:仿真超原子单元

我们需要仿真超表面的超原子单元,并分析单元的反射系数与其尺寸的关系。我们首先绘制超原子的三维模型,该模型可以在贴片尺寸和单元本身尺寸方面动态重新配置。

在本教程中,我们使用5 mm的单元尺寸。


现在我们需要在模型周围创建空气盒。


接下来设置Floquet端口,这个设置对于能够使用周期性边界条件至关重要。请确保HFSS求解类型必须设置为 Modal 才能运行仿真。


我们使用耦合的主边界和辅边界条件来模拟周期边界条件。HFSS中的Floquet端口应被这种边界条件包围。


选择相对的面


或者 同时设置一对面,同样设置另外一对面。或者选择整个对象使用 Auto Identify lattice pair


单元底面的边界条件为PEC,因为我们仿真的是反射阵列单元。


贴片尺寸


我们添加分析设置,然后为顶部贴片的尺寸添加参数扫描——我们希望获得单元的反射相位与天线顶部贴片尺寸的关系。


解决相交区域材料冲突的问题,允许材料覆盖


接下来我们验证HFSS设置并运行仿真。我们需要导出结果。


选择 角度


仿真结束后,我们将反射相位与贴片尺寸的关系结果导出到Excel文件中,作为Python自动化代码的输入因子。

文件数据格式调整 Phase 和 Size,重命名为 phase_vs_size.csv

第三部分:HFSS主设计

现在让我们专注于HFSS的主设计。我们创建一个项目,然后在项目中创建HFSS环境。

接下来,我们使用Visual Studio Code打开 json_data_creator.py。在该文件中,我们为超表面设置所需的参数,然后运行代码。

产生的相位数据 phase_data.csv


为了查看单元相位的可视化结果,我们可以运行 plotter.py 文件。


然后,我们需要打开 generate_hfss_script.py,在代码中我们必须确保使用与我们创建的项目相同的名称以及相同的HFSS环境名称。代码中需要设置由 json_data_creator.py 脚本创建的 patch_data.json 文件的路径。

进入HFSS,选择 Automation 自动化,再选择 Run Script 运行脚本,最后选择 generate_hfss_script.py 脚本。(注意,这里使用的是 HFSS 自带的 Python 2.7 IronPython)


(这里没有使用)HFSS 提供额外安装的新版的 pyaedt 支持最新的 Python 3,新版在不断开发中。


现在超表面开始在HFSS环境中创建,我们等待脚本完成超表面的创建。


接下来,我们使用HFSS中的预定义结构设置喇叭馈源。我们动态地指示馈源的位置。虽然可以运行优化,但出于本教程的目的,我们只需将其放置在超表面上方60 mm处。

创建一个相对坐标系


通过组件库,或者导入已经存在的喇叭天线组件


选择相对坐标系


创建开放区域


然后我们设置分析,并确保选择至少六到七次网格细化迭代,这是因为使用粗糙网格会导致不真实的结果。


我们设置开放边界以及三维和二维远场辐射方向图的结果。接下来我们验证HFSS设置并运行仿真。求解时间漫长。

结果展示

在本教程的最后一部分,我们想展示一些不同超表面设计的样例:

  • 第一个设计是凹面超表面,在法向角度反射波。
  • 下一个配置是平面超表面,将波束导向20°角。
  • 最后一个例子是OAM模式为2阶的平面超表面。

我们可以看到超表面上的旋转相位以及OAM辐射方向图的中空波束。



免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空