ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

卫星链路计算中信号带宽的顶层设计:从符号速率到链路余量

卫星链路计算中信号带宽的顶层设计:从符号速率到链路余量 简介这是一套基于MATLAB的卫星链路计算工具包面向卫星通信工程师与相关研究者可用于星地链路中的信号带宽、空间损耗、天线增益及链路预算等关键参数计算。压缩包为RAR格式大小约4KB包含多个.m脚本文件涵盖上行/下行带宽uplinkbd、downlinkbd、距离与空间损耗distance、spaceloss、天线增益AntGain、香农容量ShannonCap及Q函数等模块可按需调用或改写。已有508人学习浏览适合需要快速估算链路性能、评估调制方式与信噪比影响、开展链路预算设计的用户通过调整脚本参数可对比不同条件下的结果辅助完成卫星链路方案优化。1. satlink 卫星链路计算到底在算什么信号带宽不是香农公式里的那个 B做卫星链路计算时我遇到最多的问题不是自由空间损耗算错而是信号带宽的定义没对齐。satlink 这类卫星链路脚本把链路预算和带宽计算放在一起常被拿来算星地链路的余量但很多人连它输出的带宽单位都没看清就急着把结果塞进香农公式。这个标题拆开看就三层satellite 指星地链路和卫星转发器的场景信号带宽是载波参数卫星链路计算是落点。实际工作中它解决的问题是给定一段数据速率、调制方式、天线口径和发射功率能不能在某个频点上让信号以足够信噪比落地。适合做卫星地面站、微波接力、载荷规划的人也适合刚被安排去做系统预算的通信工程师。我自己的习惯是先不碰 GUI 工具直接用脚本把链路预算和带宽换算打通。下面这套流程就是用 satlink 的思路把星地链路从参数到余量算全的过程。你得到的不是一堆公式而是一组能改参数、能复跑、能交付的检查脚本。2. 信号带宽在星地链路里的定义三种带宽与换算公式卫星链路里“信号带宽”是个容易被混着用的词。你在 satlink 里输入一个载波带宽它可能指的是符号速率、占用带宽、噪声带宽里的任意一种取决于你填在哪个字段。如果定义没对齐后面算出来的 C/N、Eb/N0 全部带偏差。所以我先把三种带宽掰开。2.1 先分清三种带宽噪声带宽、占用带宽、符号速率第一种是符号速率 Rs单位 Msps。调制器每秒发出多少个符号决定射频信号的基本占位。第二种是占用带宽实际通过频谱分析仪看到的主瓣宽度等于 Rs 乘以 (1 滚降系数)。第三种是噪声带宽接收机通带内放行的噪声总量理想匹配滤波时等于符号速率但很多链路预算工具把接收滤波器宽度填成了占用带宽这里最容易引入 1dB 到 2dB 误差。这三者的关系用一段 Python 就能算清楚def bandwidth_calc(data_rate_bps, mod_bits, code_rate, rolloff, filter_factor1.0): 换算卫星载波的三种带宽。 data_rate_bps: 信息比特速率单位 bps mod_bits: 每符号承载的比特数QPSK 为 28PSK 为 3 code_rate: FEC 编码码率比如 0.8、0.75 rolloff: 成形滤波滚降系数0.2 ~ 0.35 filter_factor: 接收滤波器相对符号速率的系数理想匹配为 1.0 symbol_rate data_rate_bps / (mod_bits * code_rate) occupied_bw symbol_rate * (1 rolloff) noise_bw symbol_rate * filter_factor return symbol_rate, occupied_bw, noise_bw rs, occ_bw, bn bandwidth_calc(100e6, 2, 0.8, 0.2, 1.0) print(f符号速率: {rs/1e6:.2f} Msps) print(f占用带宽: {occ_bw/1e6:.2f} MHz) print(f噪声带宽: {bn/1e6:.2f} MHz)这段代码的逻辑是先把信息速率除以“调制阶数×编码码率”得到符号速率再乘以 (1 滚降) 得到占用带宽。噪声带宽单独用一个系数控制默认取 1 也就是等于符号速率。参数上要注意 mod_bits 用的是 log2(调制星座点数)QPSK 是 216APSK 是 4code_rate 是有效信息比特在总传输比特中的占比DVB-S2 里常见 0.75、0.8、0.833。rolloff 对占用带宽的影响是线性的后续在做转发器频率规划时很敏感。2.2 satlink 里常用的带宽换算关系与参数表satlink 类脚本里一般会内置一张调制参数表目的是让用户不用记星座点数。下表是我常用的一组典型值覆盖你 90% 的 DVB-S2 场景调制方式每符号比特数典型 FEC 码率典型滚降典型载波功率谱形状QPSK20.80.2恒包络低回退8PSK30.750.2略有回退16APSK40.750.2需要约 1.5dB OBO32APSK50.8330.2需要约 2.5dB OBO这张表要配合公式用占用带宽 信息速率 ÷ (每符号比特数 × 编码码率) × (1 滚降)。常见错误是只除以调制阶数忘掉编码码率。比如 100Mbps 数据、QPSK、码率 0.8符号速率是 62.5Msps占用带宽是 75MHz如果忘掉码率符号速率只有 50Msps占用带宽 60MHz差了 15MHz。在转发器带宽 72MHz 的约束下一个算能用一个算超限结论完全相反。再往深一层链路预算里的载波功率 C 用不着带宽但噪声功率 N 需要带宽所以 C/N 是带宽相关的。satlink 里计算 C/N0 时不需要带宽只有算 C/N 或 Eb/N0 时才引入带宽或数据速率。这也是我在调试时先看 C/N0 的原因它把带宽的影响彻底隔离了。2.3 滚降系数选 0.2 还是 0.35带宽和实现复杂度的取舍滚降系数是信号带宽里唯一由滤波器决定、不由数据速率决定的参数。0.35 是早期 WDMA、DVB-S 时代的常见值频谱旁瓣滚降慢滤波器的实现简单群时延波动小。0.2 在 DVB-S2 和现代地面站里更常见占用带宽更紧凑但滤波器阶数更高信号在经过带外滤波后峰均比也会变大对功放回退要求更严。选型时我通常这样看如果转发器带宽是限制条件选 0.2必要时用 0.15 或 0.12但代价是接收端的均衡器要处理更陡的滚降边沿。如果链路功率受限、频谱不敏感比如某些低轨卫星的星地链路选 0.35 更稳妥功放可以在更低的 OBO 下工作系统总的 C/N0 损失反而更小。satlink 里只需要改 rolloff 这个参数就能看到同一数据速率下的占用带宽变化以及对应转发器可用载波数的增减。我在写频率规划时会先把滚降、保护带、载波间隔一起丢进脚本而不是只算单个载波。3. 用 satlink 跑通一条星地链路的链路预算最小输入与两个关键结果链路预算的本质是能量守恒。卫星发射或地面站发射的信号先经历自由空间损耗到达接收天线后被增益放大最后和接收机热噪声比高低。这一章我给出一个可以直接复制运行的 Python 脚本它完成一条下行链路的预算并输出 C/N0 和 Eb/N0 两个结果。3.1 链路预算的最小输入频率、距离、天线口径、数据速率不需要一开始就把所有损耗都塞进去。最小输入只有四个量工作频率、星地距离、收发天线增益、数据速率。天线口径决定增益频率和距离决定自由空间损耗数据速率决定最终的解调门限比较对象。把这四个量算清楚再去叠加雨衰、极化损耗、指向误差。import math # 物理常量 c_light 299792458.0 k_boltzmann_db -228.6 # 单位 dBW/(Hz*K) # ---------------------- 链路输入 ---------------------- f_ghz 12.5 # 下行频率 GHz dist_km 35786.0 # 同步轨道到地面站距离 km tx_pwr_dbm 40.0 # 卫星发射功率 dBm tx_gain_dbi 35.0 # 卫星发射天线增益 dBi rx_gain_dbi 30.0 # 地面站接收天线增益 dBi rx_noise_temp_k 300.0 # 接收机等效噪声温度 K data_rate_bps 100e6 # 数据速率 bps mod_bits 2 # QPSK code_rate 0.8 # FEC 码率 rolloff 0.2 # 滚降系数这里的 tx_pwr_dbm 是单载波平均功率不是功放的饱和功率。卫星转发器一般工作在既有回退假设饱和功率给 50dBmOBO 2dB 就该填 40dBm。rx_noise_temp_k 是把天线噪声、LNA 噪声、馈线损耗折算后的等效温度口径 4.5m 的站通常 250K 到 350K。data_rate_bps 必须是净信息速率如果你填的总速率后面 Eb/N0 会被系统性抬高。3.2 从 C/N 到 Eb/N0信号带宽在这里的第一次出现完整链路预算代码如下# ---------------------- 信号带宽计算 ---------------------- symbol_rate data_rate_bps / (mod_bits * code_rate) occupied_bw symbol_rate * (1 rolloff) noise_bw symbol_rate # 匹配滤波时噪声带宽等于符号速率 print(f符号速率: {symbol_rate/1e6:.2f} Msps) print(f占用带宽: {occupied_bw/1e6:.2f} MHz) # ---------------------- 链路损耗与增益 ---------------------- fspl_db 92.45 20 * math.log10(dist_km) 20 * math.log10(f_ghz) eirp_dbw tx_pwr_dbm - 30 tx_gain_dbi c_dbw eirp_dbw - fspl_db rx_gain_dbi print(f自由空间损耗: {fspl_db:.2f} dB) print(fEIRP: {eirp_dbw:.2f} dBW) print(f接收载波功率: {c_dbw:.2f} dBW) # ---------------------- 噪声与信噪比 ---------------------- n0_dbw_hz k_boltzmann_db 10 * math.log10(rx_noise_temp_k) c_no_dbw_hz c_dbw - n0_dbw_hz cn_db c_no_dbw_hz - 10 * math.log10(noise_bw) ebno_db c_no_dbw_hz - 10 * math.log10(data_rate_bps) print(fC/N0: {c_no_dbw_hz:.2f} dBHz) print(fC/N(符号速率匹配): {cn_db:.2f} dB) print(fEb/N0: {ebno_db:.2f} dB)这段代码的关键在信噪比这一段。C/N0 算出来后对符号速率取对数得到 C/N对数据速率取对数得到 Eb/N0。注意 Eb/N0 的分母是数据速率不是符号速率也不是占用带宽。很多人把 Eb/N0 算成 C/N0 减去 10log10(占用带宽)那得到的是 C/N不是 Eb/N0数值会差出一个滚降系数。脚本里的 noise_bw 默认等于符号速率对应匹配滤波器如果接收机滤波器设置为占用带宽那么 C/N 会比这里低 10log10(1α)大约 0.8dB 到 1.5dB。跑完脚本后C/N0 是整个链路预算里最稳定的输出因为不含带宽选择。Eb/N0 是和解调门限比较的直接指标。对于 QPSK LDPC 0.8 码率的系统理论门限大约 4~5dB加上 2~3dB 实现余量和老化余量设计目标通常留 8dB 以上如果算出来只有 6dB链路就会在雨衰里翻车。3.3 链路预算结果怎么看余量、门限、雨衰储备卫星链路计算的结果不能只看 Eb/N0 是正还是负。我会把它拆成三个判断第一Eb/N0 比解调门限高出多少这部分是调制余量第二雨衰储备也就是当前链路能承受多少 dB 的额外衰减而不低于门限第三占用带宽是否仍在转发器分配的频带内。雨衰储备的估法很粗暴看最差月份的降雨衰减大概率在 99.9% 或 99.99% 可用度下是多少。Ka 波段 12.5GHz 的中纬度地区单跳雨衰可能 2dB 到 5dBKu 波段 18GHz 以上的雨衰更大有些站要留 8dB。如果 Eb/N0 只有 9dB门限 5dB余量 4dB那 99.99% 雨衰储备只有 4dB显然不够。我在 satlink 里会直接把雨衰作为一个衰减量插到自由空间损耗之后重新跑而不是手工在结果上加减这样可以避免漏掉级联损耗对 C/N0 的非线性影响。4. 星地链路的上行和下行信号带宽的差异与非对称设计同一条星地链路上行和下行在信号带宽的计算上其实没有差别但系统约束差别很大。上行受限的是卫星转发器的带宽下行受限的往往是卫星平台的电源和功放输出能力。带宽计算只是第一步更关键的是怎么把载波放进有限的转发器带宽里。4.1 上行受限带宽 vs 下行受限功率上行链路的发射功率可以靠着地面站的大功放和天线做得很高所以通常不缺功率缺的是频谱。卫星转发器的带宽是白纸黑字的分配比如 36MHz、54MHz、72MHz你要填多少载波每个载波占用带宽多少加起来不能超限。下行链路是卫星发射卫星的太阳能和散热能力决定了功放的饱和功率普遍比地面站低一个量级。所以下行经常出现“功率不够、带宽空闲”的情况。这时信号带宽的计算方向就不同。上行你要先算符号速率、占用带宽然后根据转发器带宽反推能放几个载波下行你先设定目标 C/N0反推最大允许数据速率再正算占用带宽是否合适。同样的 100Mbps QPSK在不同方向上设计思路完全不同satlink 里最好把这几个参数放在同一个配置块里但分别做约束检查。4.2 多载波在固定转发器带宽里的分配多载波分配的核心是不能让载波占用带宽简单相加还要留保护带。保护带通常占转发器带宽的 2%~5%给网管、导频和滤波器过渡留空间。下面这段脚本能快速判断一个 72MHz 转发器能放多少个 60MHz 占用带宽的载波transponder_bw_mhz 72 guard_band_mhz 2.0 # 每个载波的保护带 carrier_occ_bw_mhz 60 available_bw transponder_bw_mhz - guard_band_mhz max_carriers 0 while (max_carriers 1) * carrier_occ_bw_mhz guard_band_mhz transponder_bw_mhz: max_carriers 1 print(f可放置载波数: {max_carriers}) print(f实际占用总带宽: {max_carriers * carrier_occ_bw_mhz guard_band_mhz:.2f} MHz)这段逻辑很简单却是我见过翻车最多的地方。有人直接用 72 整除 60得出 1 个没问题但如果载波是 40MHz72 整除 40 等于 1实际两个 40MHz 加保护带 4MHz 等于 84MHz放不下。这里的 while 循环每一步检查累计占用加保护带是否超过转发器带宽避免“整除成功但实际超限”的假象。参数上保护带可以写在同一个配置文件里每个转发器不一样不要用全局固定值。如果你面对的是可变符号速率载波例如 DVB-S2 的 VCM就不能用等宽载波直接除。要先把每个载波的符号速率、滚降都折成占用带宽再按总分复用法排序分配。这个逻辑和带宽本身关系不大但对结果影响很大我不止一次看到有人在 72MHz 转发器里按“可用速率”相加最后输出载波频谱重叠。4.3 透明转发与再生转发的带宽核算透明转发器只做频率变换不区分上下行信号内容。带宽核算就是把所有载波的占用宽带和保护带加总这个过程的唯一变量是滚降和符号速率。再生转发器在星上解调、纠错、重新编码上下行数据速率可以不同这时带宽核算要区分上下行两个方向上行用接收数据速率和调制格式算占用带宽下行同样单独算。星上处理会把上下行的 C/N0 解耦但你在地面规划时仍要检查每一跳的 Eb/N0 是否满足对应调制门限。有些星载再生处理支持改变调制阶数比如上行 16APSK下行 QPSK那么上下行占用带宽差异很大。必须在 satlink 里把上下行切成两段独立计算避免用一个总速率一刀切。这也是标题里“星地链路”容易让人忽略的点星地链路不是一条单向链路而是上行和下行互相耦合的联合预算。5. 卫星链路计算避坑信号带宽相关的 5 个典型翻车现场带宽相关的错误通常不是公式不会推而是参数概念错位。以下 5 条我都踩过每一条都按现象、原因、解决写完整。5.1 把信息速率当符号速率带宽差了一倍现象QPSK 信号明明 100Mbps 数据速率有人在 satlink 里直接把载波带宽填 100MHz实际占用带宽只有 60MHz。结果转发器明明能装下却误判为超限。原因信息速率必须先除以调制阶数再除以编码码率才得到符号速率。QPSK 一个符号 2 比特100Mbps 在码率 0.8 下符号速率 62.5Msps占用带宽 75MHz如果用 100MHz 去分配容量直接少算 25%。解决在代码里统一用symbol_rate data_rate_bps / (mod_bits * code_rate)不要把 data_rate 当作 Rs 直接进入带宽字段。最好在脚本输出里同时打印“信息速率”和“符号速率”一眼就能发现问题。5.2 忘了滚降系数滤波器白占带宽现象算出来的载波带宽和实际频谱占用几乎一致但在频谱仪上看邻道泄漏总超尤其多载波时更明显。原因滚降系数 0.2 意味着占用带宽比符号速率宽 20%。有人只算符号速率就把收发滤波器带宽设成等于符号速率结果主瓣被削掉邻道能量叠加误码率下不去。解决占用带宽必须至少等于符号速率乘以 (1 α)。α 越小带宽越省但滤波器的阶数和群时延越大。工程上我一般先设 0.2若实测邻道指标差再往大调而不是直接砍带宽。5.3 用同一个频率算上下行自由空间损耗现象上行用 14.5GHz下行用 11.7GHz有人偷懒全程用 12GHz 近似。距离相同14.5GHz 的 FSPL 比 12GHz 高约 1.6dB下行预算余量虚高近 2dB看起来有储备实际没有。原因自由空间损耗和频率是平方关系频率高 20%损耗就高 20*log10(1.2)≈1.6dB。频率差异在 C 波段可能小在 Ku/Ka 波段不能忽略。解决satlink 里把上行和下行写成两个独立预算块每个块各自填频率。距离可以共用频率必须分开雨衰也要按对应频段的 ITU-R 模型算不能一个雨衰值复用到两端。5.4 误把峰值功率当成平均功率算 EIRP现象多载波场景下预算余量看起来很高但一进转发器就出现互调干扰甚至载波频谱被压缩。原因单载波时峰值功率和平均功率差别不大多载波叠加后峰均比显著提高功放必须回退。如果直接用饱和功率算 EIRP忽略了 OBO链路子虚高地“多了”2~4dB。解决发射功率字段填“回退后的平均功率”。例如功放饱和功率 50dBmOBO 2dB填 48dBm。satlink 里如果只有 EIRP 输入直接把 OBO 从 EIRP 里减掉再进入链路预算不要把 OBO 放在接收端折减。5.5 链路预算里的带宽单位混用 dBHz 与 MHz现象C/N 算出来比预期大 60dB或者 Eb/N0 突然负几十首先怀疑公式错了。原因带宽在 dB 计算时一定要先转换到 Hz。符号速率 62.5Msps 在 log 运算里是 10*log10(62.5e6)≈78dBHz如果你错用了 62.5得 18dB直接差 60dB。解决在 Python 脚本里不要让用户输入 MHz 作为数值进入 10*log10要么在入口统一转 Hz要么在函数内强制转换。我常写一个小函数def db(x): return 10 * math.log10(x)在调用前明确x62.5e6这样别人接手时也不会把单位错带进来。6. 用 satlink 验证带宽影响一份可复现的链路复核脚本最后一章我给你一个验证带宽误区的小工具。它不重复算完整链路预算只输出“接收滤波器带宽偏差”对 C/N 的影响。很多人在完成预算后会拿这个脚本去复核现有的转发器频率规划确认没有把自己算进坑里。import math # 设置一组滚降系数模拟接收滤波器带宽与符号速率的比例 rolloffs [0, 0.1, 0.2, 0.35] base_cn_db 8.0 # 以符号速率为噪声带宽时的 C/N for alpha in rolloffs: filter_factor 1 / (1 alpha) cn_new base_cn_db - 10 * math.log10(1 alpha) print(f滚降 {alpha:.2f}: C/N {cn_new:.2f} dB (损失 {cn_new-base_cn_db:.2f} dB))这个脚本的逻辑是当接收滤波器宽度等于占用带宽而不是符号速率时噪声带宽从 Rs 变成了 Rs×(1α)C/N 下降 10log10(1α)。滚降 0.35 时损失达到 1.3dB对很多临界链路来说是致命的。我会在交付前的自查里把系统里所有载波的滚降、接收滤波器带宽、符号速率都跑一遍这个对比能抓出一大半带宽定义错位的预算表。按我的交付习惯链路预算文档里必须有两张表一张是链路预算结果另一张是带宽参数表。带宽参数表里明确列出数据速率、符号速率、占用带宽、噪声带宽、滚降系数、保护带。每次改一个转发器频率规划就跑一遍上面这个复核脚本把每一档的 C/N 损失打印出来然后手动检查是否所有载波仍能满足门限。这个动作本身不复杂但能避免很多“算起来很漂亮、一接真实信号就翻车”的尴尬。希望帮到你。本文还有配套的精品资源点击获取
返回列表