简介:面向卫星通信研究人员与工程师,这份文档基于随机几何框架,系统讲解低轨星座下行链路的仿真与分析,覆盖BPP星座建模、单星/多星场景下的路径损耗与干扰影响评估,并结合干扰期望计算方法验证模型有效性。内容以1个docx文档承载,压缩包约51KB,除理论推导外,还给出可运行的Python代码,包括参数设置、星座与地面站生成、功率计算、SINR分析与可视化等完整流程,适合具备一定编程基础、希望快速上手低轨卫星仿真平台的读者。文档还提出天地一体化网络、大规模星座干扰建模等后续研究方向。该资源已被105人学习浏览,可作为研究选题或工程优化的参考起点。
1. 从随机几何到低轨星座下行链路仿真:先算覆盖概率,再谈单条链路
做低轨卫星下行链路仿真的人,大概率被同一个问题卡住:轨道参数有了,用户位置也定了,为什么算出来的链路预算和论文里的覆盖曲线对不上?差别不在损耗公式,而在建模对象。传统链路预算把卫星当成固定位置的发射机,算一次自由空间损耗就结束;低轨星座里用户头顶同时有好几颗卫星,距离持续变化,同频干扰也在变,单点计算没有代表性。随机几何的做法是把卫星位置看成点过程,用覆盖概率 P(SINR>T) 回答系统级问题。下面按"星座建模→损耗计算→干扰分析→验证调参"的顺序展开,每步都有可运行的 Python 代码和参数表。
2. 低轨星座建模与可见性判定:Walker 参数、轨道传播和点过程映射
2.1 Walker-Delta 星座生成:T、P、F 怎么定,代码怎么写
低轨星座仿真的第一步是生成卫星位置。大多数论文和开源代码用的是 Walker-Delta 星座,三个参数把结构定死:T 是卫星总数,P 是轨道面数,F 是相位因子。T/P 颗卫星均匀分布在每个轨道面内,各轨道面的升交点赤经在 0 到 2π 均匀排列,相邻轨道面之间再错开 F·360°/T 的相位。这样设计的星下点轨迹在纬度和经度方向都有良好覆盖均匀性,仿真时不容易把星座结构问题误判成算法问题。
圆轨道近似对低轨下行的损耗和干扰统计足够用。轨道半径取 a=6371+h,给定倾角 i、升交点赤经 Ω 和相位角 θ,地心赤道坐标可以直接由两次旋转得到:
import numpy as np def walker_delta_snapshot(T, P, F, inc_deg, h_km): """返回 T x 3 的地心赤道坐标数组,单位 km,圆轨道近似,t=0 时刻快照""" a = 6371.0 + h_km sats = [] per_plane = T // P for p in range(P): raan = 2 * np.pi * p / P # 升交点赤经在 0~2pi 均匀排布 for s in range(per_plane): theta = 2 * np.pi * s / per_plane + 2 * np.pi * F * p / T # 轨道面内向量 [cos theta, sin theta, 0] 旋转到地心赤道系 c_o, s_o = np.cos(raan), np.sin(raan) c_i, s_i = np.cos(np.radians(inc_deg)), np.sin(np.radians(inc_deg)) x = a * (c_o * np.cos(theta) - s_o * np.sin(theta) * c_i) y = a * (s_o * np.cos(theta) + c_o * np.sin(theta) * c_i) z = a * (np.sin(theta) * s_i) sats.append([x, y, z]) return np.array(sats)F 只影响面间相位错开量,不影响覆盖的几何均匀性,但对时间切片上的瞬时覆盖影响明显,常见取 F=1。T 必须能被 P 整除,否则星座本身就不是 Walker 结构。轨道高度 h 直接决定轨道半径和可见弧段长度,550 km 和 1200 km 两档是低轨仿真里最常用的对照值。
2.2 从星座到点过程:PPP、二项点过程与硬核点过程怎么选
星座生成之后,随机几何要回答的是"卫星位置用什么点过程描述"。严格说 Walker 星座是确定结构,每一颗卫星的位置随时可由轨道根数推出,不存在随机性。随机几何的价值在于:当星座规模大、轨道面多,仿真只需要统计特性时,把卫星位置当成球面上的二项点过程(N 个点独立均匀分布在半径 a 的球面上)或泊松点过程,能得到解析的干扰统计量,这是蒙特卡洛给不出的。
PPP 和二项点过程的差别在 N 的随机性。PPP 的卫星数本身服从泊松分布,强度 λ=N/(4πa²) 是平均面密度;二项点过程固定 N,更适合描述"星座一共就这么多颗卫星"的实际约束。几百颗以上的大规模星座用 PPP 做干扰分析误差不大,因为干扰统计主要由距离分布尾部决定;小星座或要精确刻画极区覆盖时,二项点过程更稳。若星座还有最小星间距离约束,比如同一轨道面内卫星不能重叠,用硬核点过程对 PPP 采样结果做稀释:先撒点,再剔除距离过近的点。
提示:仿真里最常用的做法不是从 PPP 采样,而是直接采样二项点过程——固定 N,在球面上均匀撒点,跑完统计后再和 PPP 理论曲线对比。两边对得上,说明仿真逻辑没有结构性问题。
2.3 最小仰角与可见卫星集合:地心角公式和筛选代码
用户能"看到"哪些卫星,由最小仰角决定。仰角是视线与用户当地水平面的夹角,比距离更能反映遮挡和大气损耗。给定轨道高度 h 和最小仰角 ε_min,最大可见地心角 ψ_max 为:
ψ_max = arccos( (R/(R+h))·cos ε_min ) − ε_min
其中 R 为地球半径 6371 km。仰角越低可见弧段越长,但斜距也越大、损耗越高。典型数值:
| 轨道高度 | ε_min=10° | ε_min=25° | ε_min=40° |
|---|---|---|---|
| 550 km | 15.0° | 8.5° | 5.2° |
| 1200 km | 24.0° | 15.3° | 9.9° |
表中是最大地心角。可见卫星筛选代码:
def visible_sats(user_ecef, sat_ecef, elev_min_deg): """筛选仰角不低于门限的卫星,返回索引、仰角(度)、斜距(km)""" r_u = np.linalg.norm(user_ecef) vis_idx, elevs, ranges = [], [], [] for i, sat in enumerate(sat_ecef): r_s = np.linalg.norm(sat) cos_psi = np.dot(user_ecef, sat) / (r_u * r_s) psi = np.arccos(np.clip(cos_psi, -1.0, 1.0)) d = np.sqrt(r_u**2 + r_s**2 - 2 * r_u * r_s * cos_psi) sin_e = (r_s * cos_psi - r_u) / d # 斜距三角形正弦定理 elev = np.degrees(np.arcsin(np.clip(sin_e, -1.0, 1.0))) if elev >= elev_min_deg: vis_idx.append(i); elevs.append(elev); ranges.append(d) return np.array(vis_idx), np.array(elevs), np.array(ranges) sats = walker_delta_snapshot(T=120, P=6, F=1, inc_deg=53.0, h_km=550) lat, lon = np.radians(40.0), np.radians(116.0) # 北纬40度东经116度 user = 6371.0 * np.array([np.cos(lat)*np.cos(lon), np.cos(lat)*np.sin(lon), np.sin(lat)]) idx, elev, dist_km = visible_sats(user, sats, 25.0) print(f"可见卫星数: {len(idx)}")仰角公式 sin ε=(r_s·cosψ−r_u)/d 的推导关键在斜距三角形:用户、地心、卫星三点构成三角形,用户处当地水平面垂直于地心连线,把视线角换算到水平面即得仰角。用这个函数逐颗卫星判断,就得到任意时刻用户的可见卫星数量和斜距分布,这正是后续损耗计算和干扰分析共同的输入。注意 user_ecef 和 sat_ecef 必须同一长度单位,上面统一用 km。
3. 下行链路损耗计算:自由空间损耗、大气吸收与天线增益的链路预算
3.1 自由空间损耗:斜距是唯一变量
下行链路损耗的主体是自由空间损耗,只由斜距 d 和波长 λ 决定:L_fs=(4πd/λ)²。用 3.1 节算出的斜距直接代入,注意单位统一。550 km 轨道高度下,用户正上方约 550 km,25° 仰角时约 1124 km,10° 仰角时约 1817 km。同一颗服务卫星从升起到离开,斜距变化超过三倍,换算成功率是近 10 dB 的波动——低轨下行仿真不能取固定距离的原因就在这里。
def fspl_db(d_km, freq_hz): """自由空间损耗,d_km 为斜距(km),freq_hz 为载波频率(Hz)""" lam = 3e8 / freq_hz return 20 * np.log10(4 * np.pi * d_km * 1e3 / lam) print(fspl_db(1124, 12e9)) # 约 175.0 dB12 GHz 下 1124 km 斜距约为 175 dB,28 GHz 下同样距离约为 182 dB,频率每翻一倍损耗增加 6 dB。这解释了为什么 Ka 波段低轨系统仰角门限通常取得更高——低仰角大斜距在 Ka 段的代价比 Ku 段大得多。
3.2 大气吸收的简化模型:天顶损耗加仰角修正
大气损耗和频率、仰角、天气都有关,完整建模需要 ITU-R P.676 的逐层积分。仿真里常见做法是给一个"天顶损耗加仰角修正"的解析近似,把氧吸收和水汽损耗压成一个等效高度:天顶方向路径最短损耗最小,越接近水平方向大气路径越长。近似表达式:
L_atm(ε) = L_z / sin(ε + δ)
其中 L_z 是天顶损耗(dB),ε 是仰角,δ 是等效折射修正角。12 GHz 晴朗天气 L_z 取 0.3 dB 左右,δ 取 2° 到 5° 在文献里都有人用;28 GHz 的 L_z 可到 1 dB 以上。
雨衰在第一版仿真里建议先不建模,只作为固定余量加 2 到 3 dB。原因是雨衰空间相关性强,同时影响信号和干扰链路,如果简单地对每条链路乘独立随机因子,会人为放大干扰波动,导致覆盖概率的方差估算失真。等覆盖趋势对上了再加入时空相关的雨衰模型更合理。
3.3 链路预算表组装:发射功率、天线增益与接收功率
接收功率的链路预算式是:
P_r(dBm) = P_t(dBm) + G_t(dB) + G_r(dB) − L_fs(dB) − L_atm(dB)
卫星侧 G_t 用点波束增益,典型 30 到 40 dBi;用户侧 G_r 取决于终端,手持终端几 dBi,固定终端 30 dBi 以上。下行仿真里最容易犯的错是把干扰链路的 G_t 也按主瓣算——干扰卫星的波束不指向目标用户,实际进入用户接收机的是旁瓣,要在仿真里给干扰链路一个波束隔离度,比如主瓣增益减 20 dB。
| 链路预算项 | 数值 | 备注 |
|---|---|---|
| 轨道高度 | 550 km | 圆轨道 |
| 下行频率 | 12 GHz | Ku 波段 |
| 卫星发射功率 | 33 dBm | 约 2 W |
| 卫星天线增益 G_t | 32 dBi | 点波束 |
| 用户天线增益 G_r | 30 dBi | 固定终端 |
| 最小仰角 | 25° | 可见性门限 |
| 斜距 @25° | 1124 km | 由 ψ_max 算出 |
| 自由空间损耗 | 175.0 dB | 12 GHz |
| 大气损耗 | 1.2 dB | 25° 仰角晴天 |
| 接收功率 | −81.2 dBm | 未含雨衰 |
| 热噪声功率 | −98 dBm | 20 MHz,含 3 dB 噪声系数 |
def link_budget(p_t_dbm, g_t_db, g_r_db, d_km, freq_hz, l_atm_db=0.0): return p_t_dbm + g_t_db + g_r_db - fspl_db(d_km, freq_hz) - l_atm_db print(link_budget(33, 32, 30, 1124, 12e9, 1.2)) # 约 -81.2 dBm表中接收功率和噪声功率的差值就是无干扰时的 SNR 基底,约 16.8 dB。这个值决定了 SINR 阈值 T 的取值范围:如果仿真目标覆盖率对应的 T 高于 16.8 dB,那不是干扰问题,是单链路预算本身不够,先把功率和天线调好再谈干扰。
4. 干扰分析与覆盖概率:随机几何闭式解与蒙特卡洛仿真对照
4.1 干扰源集合怎么定:全频复用、波束隔离和服务星选择
SINR 的定义式是 P_s/(I+N),干扰 I 是所有同频发射机在用户处的接收功率之和。低轨星座里"哪些卫星算干扰"取决于频率复用方案:每个波束用独立频率时,同频干扰只来自同频波束;整个星座共用频率时,干扰源就是用户可见卫星里除服务星之外的所有卫星。最激进的全频复用设置是:"服务星选可见卫星中仰角最高的,其余全部按同频干扰处理,每条干扰链路乘一个旁瓣隔离因子"。这个设置对干扰偏保守,但作为上限估计很有价值。
在星座高度统一的假设下,仰角最高与斜距最短是等价的,因为可见范围内地心角越大斜距越长;多壳层星座或异质星座里,两者才会出现分歧。因此 4.2 节的理论推导用"最近卫星"做服务星,蒙特卡洛里用"最高仰角",两者可以对齐。如果仿真里两种服务星选择策略的覆盖概率差出 2 dB 以上,先查可见卫星集合里是否有被低仰角大斜距污染的距离边界情况。
4.2 随机几何给出的闭式解:α=4 时覆盖概率与星座密度无关
把球面局部展开成切平面,把干扰卫星近似看成强度为 λ 的平面 PPP,假设瑞利衰落、路径损耗指数固定 α、服务星为最近卫星、发射功率归一化。对瑞利衰落求期望后,覆盖概率可以写成对最近距离 r 的积分:
P_c = ∫ 2πλr·e^(−πλr²)·L_I(T·r^α) dr
其中 2πλr·e^(−πλr²) 是最近卫星距离的概率密度,L_I 是干扰的拉普拉斯变换。α=4 时干扰积分有闭式解,代入后 λ 恰好约掉,得到一个只依赖阈值 T 的表达式:
P_c = 1 / (1 + √T·arctan(√T))
代入数字看规律:T=0 dB 时约 0.560,T=10 dB 时约 0.200,T=20 dB 时约 0.064。覆盖概率随门限按 T^(−1/2) 量级衰减。干扰受限时覆盖概率与星座密度无关,直觉解释是:α=4 下星座加密,信号和干扰同步变强,最近距离分布的变化被干扰项抵消。
低轨真实传播接近 α=2,但由于斜距有 500 km 以上的下限,干扰积分不会像平面 α=2 那样发散,实际有效 α 落在 2 到 3 之间。闭式解的价值在于给蒙特卡洛程序一个可以精确对齐的靶子:
import numpy as np def coverage_ppp_alpha4(t_db): """干扰受限、瑞利衰落、alpha=4、最近卫星服务下的闭式覆盖概率""" t = 10 ** (t_db / 10) return 1.0 / (1.0 + np.sqrt(t) * np.arctan(np.sqrt(t))) print(coverage_ppp_alpha4(10)) # 约 0.200验证思路是:把蒙特卡洛里的自由空间损耗从 (4πd/λ)² 临时改成 (4πd/λ)⁴,同样只保留信号与干扰、关闭噪声,跑出的覆盖概率应该落在这个闭式解附近。对得上,说明仿真里的星座采样、可见性筛选和 SINR 累加逻辑没有写错;对不上,先查干扰截断和距离单位。
4.3 蒙特卡洛仿真:把二项点过程、可见性和 SINR 串起来
蒙特卡洛的做法是重复 N 次独立"撒星座"实验:每次从二项点过程采样卫星位置,算可见性,确定服务星,累加干扰,判断 SINR 是否超过门限,最后统计覆盖率。每次 drop 之间必须重新撒点,保证样本独立,否则置信区间公式会失效。
def mc_coverage(n_drop, n_sat, r_orb_km, elev_min, t_db, f_hz, p_t_w, g_t_db, g_r_db, iso_lin, lat_deg=40.0, lon_deg=116.0, seed=7): """二项点过程下的覆盖概率蒙特卡洛估计,返回覆盖比例""" rng = np.random.default_rng(seed) R_e = 6371.0 lat, lon = np.radians(lat_deg), np.radians(lon_deg) user = R_e * np.array([np.cos(lat)*np.cos(lon), np.cos(lat)*np.sin(lon), np.sin(lat)]) n_ok, n_tot = 0, 0 noise_w = 1.38e-23 * 290 * 20e6 * 2 # 20MHz,含3dB噪声系数 gain = 10 ** ((g_t_db + g_r_db) / 10) for _ in range(n_drop): z = rng.uniform(-1, 1, n_sat) # 球面均匀采样 az = rng.uniform(0, 2*np.pi, n_sat) sxy = np.sqrt(np.maximum(0.0, 1 - z**2)) sats = r_orb_km * np.stack([sxy*np.cos(az), sxy*np.sin(az), z], axis=1) idx, elev, d_km = visible_sats(user, sats, elev_min) n_tot += 1 if len(idx) == 0: continue # 无可见卫星,记为未覆盖 i_s = np.argmax(elev) # 服务星取仰角最高 p_s = p_t_w * gain / (4*np.pi*d_km[i_s]*1e3*f_hz/3e8)**2 d_i = np.delete(d_km, i_s) d_i = np.sort(d_i)[:20] # 最近20颗干扰源,远处贡献可忽略 p_i = iso_lin * p_t_w * gain / (4*np.pi*d_i*1e3*f_hz/3e8)**2 sinr = p_s / (np.sum(p_i) + noise_w) if sinr > 10 ** (t_db / 10): n_ok += 1 return n_ok / n_tot if n_tot else float('nan') print(mc_coverage(10000, 120, 6921.0, 25.0, 10.0, 12e9, 2.0, 32, 30, 0.01))参数说明:n_sat 是每次撒的卫星总数,r_orb_km 是轨道半径,iso_lin 是旁瓣隔离的线性值(−20 dB 对应 0.01),noise_w 里乘 2 是把 290K 热噪声加上 3 dB 噪声系数。干扰截断取最近 20 颗的理由是:低轨斜距按 d² 衰减,第 20 颗以后的干扰贡献累计小于 0.1 dB;截断数翻倍后覆盖率曲线不动,说明截断安全。没有可见卫星的 drop 计入分母但不计入分子,得到的是无条件覆盖概率;如果论文里给的是"给定至少一颗可见卫星"的条件覆盖概率,两边的分母口径必须一致。
| 仿真参数 | 取值 | 说明 |
|---|---|---|
| 卫星数 N | 120 | 二项点过程 |
| 轨道半径 | 6921 km | 550 km 轨道 |
| 最小仰角 | 25° | 可见性门限 |
| 频率/带宽 | 12 GHz / 20 MHz | Ku 下行 |
| 发射功率 | 2 W | 卫星侧 |
| 增益和 | 62 dB | 32+30 |
| 干扰隔离 | −20 dB | iso_lin=0.01 |
| 采样次数 | 10⁴ | 置信区间见下章 |
5. 仿真结果验证与参数调优:置信区间、采样次数和三个常见坑
5.1 置信区间与采样次数
覆盖率的估计是伯努利统计量,N 次独立 drop 后估计值 p̂ 的 95% 置信区间半宽约为 1.96·√(p̂(1−p̂)/N)。
def ci_half_width(p_hat, n, z=1.96): return z * np.sqrt(p_hat * (1 - p_hat) / n)p̂=0.9 时,N=10³ 半宽约 ±0.019,N=10⁴ 约 ±0.006,N=10⁵ 约 ±0.002。开跑前先用 p̂=0.5 估算最大半宽:要保证 ±0.01 的精度,至少 10⁴ 次。覆盖率曲线陡峭的区域(0.3 到 0.7 之间)建议上到 5×10⁴ 次,因为该区间 SIR 对参数变化最敏感,采样不足会把参数差异淹没在噪声里。
5.2 三个常见坑与检查手段
第一个坑是时间相关性。直接用 Walker 快照连续推进时间,得到的每个 drop 之间空间位置强相关,置信区间公式不成立。每个 drop 前重新随机化相位或整体旋转星座,保证样本近似独立。
第二个坑是干扰截断不收敛。只取最近 5 颗干扰星会系统性高估覆盖率,因为远处干扰数量多、总和不可忽略。把截断数从 5 调到 50,SINR 的 CDF 位移小于 0.1 dB 才算收敛;不收敛就加大截断,而不是用加权近似补。
第三个坑是噪声功率单位。链路预算表里用 dBm,代码里必须换算成 W,在程序入口统一。kTB 计算用 1.38e-23·T·B,20 MHz、290K 下约 −101 dBm,漏掉 3 dB 噪声系数会让低 SINR 区间的覆盖率整体偏高 3 dB,结论失真却不明显。
参数调优的顺序也值得固定下来:先调单链路预算让无干扰 SNR 达标,再开干扰对比理论闭式解校验程序,最后扫阈值 T 画覆盖率曲线。把噪声功率也填进链路预算表,每次改动只动一个参数,覆盖率曲线的每次移动都能解释得清,仿真才真正可信。
本文还有配套的精品资源,点击获取