简介:《2024无线电规则 第二卷》是国际电信联盟(ITU)在WRC-23大会后发布的正式规范文件,汇总了自1995年以来历届世界无线电通信大会对无线电频谱使用与管理规则的修订,面向无线电管理机构、频谱规划人员、频率指配工程师和通信设备检测机构,用以解决频率划分、台站协调、发射限值等执行依据问题。资源为单个docx格式文档,压缩包约9.8MB,内容聚焦第二卷所载附录,包括附录1发射类别和必要带宽、附录2发射机频率容限、附录3杂散域无用发射的最大允许功率电平,以及附录4、附录5中用于协调申报的各类特性表,并专门解释了从2025年1月1日起生效的条款编号规则和各附录在历届大会中的修订沿革;同时给出“附录30(WRC-23,修订版)”等命名示例,区分“条”与“款”的复合编号方式及上下行链路符号。读者可据此精准定位最新版频谱管理要求,理解WRC系列大会成果如何落地,为日常频率维护、合规检测和国际协调提供权威依据。目前已有136人学习下载,适合需要紧跟国际频谱规则更新的专业人员作为案头工具。
1. 2024 无线电规则第二卷到底改了什么:WRC-23 修订点与生效时间
如果你做无线设备认证、卫星网络协调、频谱监测或者短波广播规划,2024 版《无线电规则》第二卷就是绕不开的"硬规范"。它看起来是一本附录汇编,实际上是国际电信联盟从 WRC-95 到 WRC-23 历次大会决定的堆积和再修订。2024 版最大的变化在于:WRC-23 对附录 4、附录 5、附录 7、附录 30、附录 30A、附录 30B 等核心附录做了修改,多数条款 2025 年 1 月 1 日起生效。对于 IT 从业者来说,真正有价值的是那些数值表格和程序性附录:发射类别、必要带宽标识、频率容限、卫星协调区计算方法。这些不是摆设,设备型号核准和频率指配都会直接引用。本文从工程使用角度拆解第二卷的编号体系、发射标识解析、频率容限查询和自动化验证,让你拿到这本 PDF 后能真正用起来,而不是只在书架吃灰。
2. 条、款、附录的复合编号:读懂第二卷的引用体系与版本溯源
2.1 WRC 大会缩略语与版本追踪的关系
打开第二卷目录,你会发现几乎所有附录后面都带着一个括号,比如"附录 1(WRC-19,修订版)"、"附录 30(WRC-23,修订版)"。这个括号不是装饰,它告诉你这版内容最后一次被哪一届世界无线电通信大会动过刀。WRC-95、WRC-97、WRC-2000、WRC-03、WRC-07、WRC-12、WRC-15、WRC-19、WRC-23 是 1995 年以来历届大会的简称。如果你看到某款末尾有"(WRC-23)",意味着这一款在 2023 年迪拜大会上被修改或新增;如果没带缩略语,则说明它的来源可以追溯到 WRC-95 通过的简版规则,完整案文在 WRC-97 的第 2 号文件里。
这种做法的好处是:你不需要读完整本规则,就能通过编号判断某条规则是哪一年的产物。对于做系统开发的人,这也意味着你需要处理版本状态,而不是把整本书当作单一版本。我一般会用代码扫描目录,把每个附录的修订状态提取出来建立索引。例如:
import re text = """附录1(WRC-19,修订版)发射类别和必要带宽 附录2(WRC-03,修订版)发射机频率容限一览表 附录4(WRC-23,修订版)实施第三章程序时使用的各种特性的综合列表和表格 附录30A(WRC-23,修订版)卫星广播业务馈线链路""" pattern = r"附录([\w\-]+)((WRC-\d+),修订版)?(.*?)(?=附录|$)" for m in re.finditer(pattern, text, re.S): print(f"附录{m.group(1)} -> {m.group(2)}")这段逻辑很简单:用正则捕获附录编号和修订大会。关键点是修订版三个字可以省略,有的条目写"附录30(WRC-23,修订版)",有的写"附录10(WRC-07,修订版)",正则里?处理这个可选后缀。实际工程中我会用这个索引生成一个版本清单,方便后续比对历史差异。
2.2 条、款、附录的复合编号规则
2024 版沿用 2001 年版的编号方案。"条"的编号采用标准序列编号法,例如第 13 条、第 59 条。在正文中引用某一条时,不再挂大会缩略语,因为"条"的版本状态已经由整本书统一决定。而"款"的编号采用复合编号法,比如第 9.2B 款,意为第 9 条第 2B 款。款末尾的缩略语才标注修改来源。
对于附录,标准形式是"附录编号(大会,修订版)"。但注意,如果正文中引用某附录时没有带缩略语,也不写"由 WRC-23 修改的"字样,那就是指本版最终印出来的附录案文。举个例子:第 13.1 款提到"附录 30"时,它指的就是 2024 版中经过 WRC-23 修订的那个版本,而不是历史上某一版。
| 引用形式 | 含义 |
|---|---|
| 第 9.2B 款(WRC-23) | 第 9 条第 2B 款,经 WRC-23 修改或新增 |
| 第 8 号建议 | 本版第 3 卷中的建议,无版本缩略语 |
| 附录 30(WRC-23,修订版) | 附录 30,经 WRC-23 修改并整体修订 |
| 附录 4 | 引用本版中的附录 4,无论是否被修改 |
这里面最容易踩的坑是:很多人在写设备测试报告时,把"附录 30"写成"附录 30(WRC-19)",但 WRC-23 已经改过这版附录。引用时最好以 2024 版为准,除非你明确要对比历史版本。另外,附录 2 的修订版本是"(WRC-03,修订版)",而附录 1 是"(WRC-19,修订版)",不同附录的基准版本差异很大,不能一概而论。
3. 发射类别与必要带宽标识:用代码解析 6K00A1A 这类编号
3.1 必要带宽标识的字符规则
第二卷附录 1 定义了发射类别和必要带宽标识,这是各类无线电设备填写技术参数时最容易出错的地方。必要带宽标识由四个字符组成:三个数字加一个字母。字母的位置就是小数点所在位置,同时代表单位:H 表示 Hz,K 表示 kHz,M 表示 MHz,G 表示 GHz。第一个字符不能是 0、K、M 或 G,是为了避免歧义。
比如 6K00,K 在第二位,表示 6.00 kHz;1M25 中的 M 在第二位,表示 1.25 MHz;5G65 中的 G 在第二位,表示 5.65 GHz;而 25H3 表示 25.3 Hz?不对,仔细看原文例子:"25.3Hz=25H3",H 前面是"25",后面是"3",表示 25.3 Hz。也就是说字母左边是整数部分,右边是小数部分,单位由字母决定。原文还给了特殊例子:0.002 Hz 标为 H002,0.1 Hz 标为 H100。注意 H002 的第一个字符是 H,这在后面的发射标识中容易混淆,解释时要说清楚这是必要带宽部分的一部分。
如果小数部分为零,表示方式会省略末尾的 0,比如 180.4 kHz 标为 180K,10 MHz 标为 10M0。这点和常规四字符规则不同,但按原文例子来。实际开发解析程序时,我建议保留这种宽容度,不要强求刚好四个字符。
发射类别标识紧接着必要带宽,由三个或五个字符组成。前三个是基本特性:第一个符号表示主载波调制方式,第二个表示调制信号的性质,第三个表示信息类型。可选的第四、第五个符号分别描述信号详细说明和复用性质,不用时用短横线占位。
| 符号 | 含义 | 典型场景 |
|---|---|---|
| A | 双边带调幅 | 普通 AM 广播 |
| J | 单边带抑制载波 | 短波 SSB 通信 |
| F | 调频 | 对讲机、FM 广播 |
| G | 调相 | 部分数字通信 |
| P | 未调制脉冲 | 雷达 |
| K | 脉冲幅度调制 | 遥测 |
| 1 | 数字信息单频道、无副载波 | 数字电报、数传 |
| 3 | 模拟信息单频道 | 模拟话音 |
| E | 电话(含声音广播) | 话音 |
| D | 数据传输、遥测、遥令 | 数传 |
| C | 传真 | 短波传真 |
| W | 上述的组合 | 混合业务 |
3.2 用 Python 解析完整发射标识
下面这段代码接收一个发射标识字符串,例如6K00A1A,把它拆解为必要带宽、调制方式、信号性质和信息类型:
def parse_emission(emission): # 先拆必要带宽部分:找到第一个表示单位的字母 import re m = re.match(r'^([0-9]+[HKM Ghz]+)([A-Z][0-9A-Z]*)', emission, re.I) # 注意:实际字母是 H/K/M/G 作为单位,需要更精确的切分 # 这里保留思路,下面做可靠实现 return None def parse_emission_fixed(emission): # 必要带宽字母:H, K, M, G(大小写统一) unit_idx = None for i, ch in enumerate(emission): if ch.upper() in 'HKMG': unit_idx = i break if unit_idx is None: raise ValueError("Missing bandwidth unit") bw_part = emission[:unit_idx + 1] unit = emission[unit_idx].upper() int_part = emission[:unit_idx] frac_part = emission[unit_idx + 1:] # 如果小数部分为空,按 0 处理 bandwidth = int(int_part) + (int(frac_part) * 10 ** (-len(frac_part)) if frac_part else 0) multipliers = {'H': 1, 'K': 1000, 'M': 10**6, 'G': 10**9} bandwidth_hz = bandwidth * multipliers[unit] # 剩余部分为发射类别 rest = emission[unit_idx + 1:] # 去掉小数位后,余下的第一个字符才是调制方式 # 更稳妥的方式:带宽字母后面紧跟的是类别,但小数位可能不止一位 # 所以要从 rest 中分离出属于带宽小数部分的字符 # 这里假设必要带宽小数部分最多三位,实际以原文为准 # 在原文例子中,必要带宽字母后可能没有小数(180K)或有两位小数(M25) # 所以我们需要知道带宽部分总共 3 位数字(含整数和小数), # 但 180K 只有三位字符,所以只能特殊处理。 # 为了不绕晕,下面采用按已知格式的简化方案。 return bandwidth_hz, rest print(parse_emission_fixed("6K00A1A"))这个思路有个问题:180K这类简写会导致无法准确切分。实际工作中,我一般按规则先把必要带宽补齐:如果字母后面没有字符,视为00;如果字母前面不足两位,则按原文的表现形式处理。下面是更稳妥的解析版本:
def parse_emission_bandwidth(bw): # bw 是必要带宽部分,如 '6K00', '1M25', '180K', '12K5' unit = None for ch in bw: if ch in 'HKM Ghz: unit = ch break if not unit: raise ValueError(f"Unknown bandwidth format: {bw}") head, tail = bw.split(unit) if tail == '': tail = '0' # 没有小数部分 # head 至少一位,tail 为小数位 value = float(head + '.' + tail) if tail != '0' else float(head) multiplier = {'H': 1.0, 'K': 1e3, 'M': 1e6, 'G': 1e9} return value * multiplier[unit] def parse_emission(emission): for i, ch in enumerate(emission): if ch in 'HKM G': bw = emission[:i + 1] category = emission[i + 1:] break else: raise ValueError("No bandwidth unit found") bw_hz = parse_emission_bandwidth(bw) # 发射类别至少 3 个字符,可选 5 个 if len(category) >= 3: modulation = category[0] signal = category[1] info = category[2] extra = category[3:] if len(category) > 3 else '' else: raise ValueError("Emission category too short") return { 'bandwidth_hz': bw_hz, 'modulation': modulation, 'signal': signal, 'info': info, 'extra': extra, 'raw': emission } # 测试 for e in ['6K00A1A', '1M25J3E', '180KF1B', '12K5G3E']: print(e, "->", parse_emission(e))逻辑说明:首先找到代表单位的大写字母 H、K、M、G,把它前面的数字当作整数部分,后面的数字当作小数部分。180K这种没有小数部分的,直接按 180 kHz 处理。然后把带宽换算成 Hz,同时把剩余字符按发射类别拆解。注意这里会有一个隐患:如果发射标识中调制方式恰好是 K 或 M,比如6K00K1B,程序会误把第一个 K 当成单位。处理建议:必要带宽部分一定出现在发射标识开头,且H、K、M、G作为单位时,它是第一个出现的大写字母;而调制方式中的 K 或 M 只会出现在带宽单位之后,所以找到第一个这样的字母就是正确边界了。这个方案在官方格式下是稳定的,但遇到180K这种简写,后面紧跟的类别字符可能被合并到小数部分,因此还需要根据实际长度做启发式判断。我一般会先尝试完整四字符带宽,解析失败再用简写规则,宁可报错也不要静默出错。
发射类别中的后两个可选字符,比如第四字符表示信号详细说明,A表示双态代码且码元数目或持续时间不同;第五字符表示复用性质,T表示时分复用。在设备台账中,建议保留原始字符串,不要只存数值,否则回溯时会丢失信息。
4. 频率容限表实战:从附录 2 查询到参数自动化校验
4.1 频率容限的关键数值表
附录 2(WRC-03,修订版)给出了各类电台发射机的频率容限。容限用相对值表示,单位是 ppm(百万分之一),少数地方用 Hz 表示绝对值。选型时最容易混淆的是"频段(不包括下限,包括上限)"这句话,意思是表中每个频段的起点频率不包含在区间内,终点包含。例如 9 kHz 至 535 kHz 这个频段,9 kHz 本身不在内,535 kHz 在内。这个约定直接影响查询代码的边界判断。
以下是从附录 2 中摘出的高频使用段的关键数值(忽略注脚引用的特殊条件):
| 频段 | 电台类别 | 频率容限 |
|---|---|---|
| 9–535 kHz | 固定电台(9–50 kHz) | 100 ppm |
| 9–535 kHz | 固定电台(50–535 kHz) | 50 ppm |
| 9–535 kHz | 海岸电台 | 100 ppm |
| 9–535 kHz | 航空电台 | 100 ppm |
| 1 606.5–4 000 kHz | 船舶电台 | 40 Hz |
| 1 606.5–4 000 kHz | 航空器电台 | 100 ppm |
| 4–29.7 MHz | 固定电台单边带,功率≤500 W | 50 Hz |
| 4–29.7 MHz | 固定电台单边带,功率>500 W | 20 Hz |
| 4–29.7 MHz | 空间电台 | 20 ppm |
| 4–29.7 MHz | 地球站 | 20 ppm |
注意:上表中的"海岸电台"和"航空电台"在 9–535 kHz 段容限相同,但不同功率档会有不同,完整版本还有大量注脚。例如船舶应急发射机在 9–535 kHz 段是 500 ppm,救生艇电台也是 500 ppm。实际查询时必须以纸质版或官方 PDF 中的注脚为准,不能只看主表。
4.2 写一个容限查询脚本
下面这个 Python 函数把频段和台站类别映射到容限值,便于批量检查设备参数:
FREQ_LIMITS = [ # (low, high, category, limit, limit_unit) (9, 535, 'fixed_50', 100, 'ppm'), (50, 535, 'fixed_500', 50, 'ppm'), (9, 535, 'coast', 100, 'ppm'), (1606.5, 4000, 'ship', 40, 'Hz'), (1606.5, 4000, 'aircraft', 100, 'ppm'), (4000, 29700, 'fixed_ssb_low', 50, 'Hz'), (4000, 29700, 'fixed_ssb_high', 20, 'Hz'), (4000, 29700, 'space', 20, 'ppm'), (4000, 29700, 'earth_station', 20, 'ppm'), ] def lookup_limit(freq_khz, category): for low, high, cat, limit, unit in FREQ_LIMITS: # 注意:频段范围不包括下限、包括上限 if low < freq_khz <= high and cat == category: return limit, unit return None, None # 示例:查询 20 kHz 处 50W 以下固定电台 print(lookup_limit(20, 'fixed_50'))逻辑说明:这里把频率统一用 kHz 表示,边界用low < freq <= high实现"不包括下限、包括上限"。category是一个简化标记,实际工程中建议直接用枚举或数据库表,因为台站类别还存在功率档组合,比如 "1 606.5 kHz 至 4 000 kHz" 的船舶电台是 40 Hz,但救生艇电台是 100 ppm。更复杂的组合可以建一个类表示(频段, 台站类别, 功率, 调制方式),这样查询时才能覆盖注脚中的例外。
使用这个表时,最常犯的错误是直接用设备的标称频率去匹配,而忽略了功率等级。例如 4–29.7 MHz 的固定电台单边带,功率小于等于 500 W 时容限是 50 Hz,功率大于 500 W 时变成 20 Hz。如果只做简单匹配,就会得到错误结论。我一般会把功率值也作为参数传入,在查询函数内部做分支判断。
4.3 频率偏移与 ppm 换算
实际测试中,工程师拿到的是绝对频率偏差,比如测量到发射频率比标称值偏了 25 Hz。要判断是否合规,需要换算为 ppm 或直接和绝对容限比较。换算公式很简单:
def freq_error_ppm(shf_actual, rated_freq): return (shf_actual - rated_freq) / rated_freq * 1e6 # 例子:工作频率 10 MHz,实测偏 25 Hz ppm = freq_error_ppm(10000025, 10000000) print(f"{ppm:.3f} ppm")这里rated_freq和shf_actual都使用 Hz。如果容限给定的是 ppm,那么最大允许偏差就是rated_freq * limit_ppm / 1e6。如果容限给定的是 Hz,比如 40 Hz,就直接比较绝对差值。注意在低频段,用 ppm 表示的值换算出的 Hz 数会很小,比如 150 kHz 处 100 ppm 只允许 15 Hz 偏差,实际测试时对参考源的要求会很高,需要至少 1e-7 量级的频率准确度。
5. 进阶:把 PDF 版规则变成可检索的数据集,以及几个容易踩的坑
5.1 用 pdfplumber 提取附录表格
第二卷官方 PDF 的表格结构复杂,尤其是附录 2 的频率容限表,带有多级嵌套和注脚。直接用camelot或tabula可能因为跨页合并而出错,我更推荐先用pdfplumber把每页文字提出来,再按坐标定位表格线。
import pdfplumber with pdfplumber.open("RR_2024_Volume_2.pdf") as pdf: for page in pdf.pages: # 提取表格对象 tables = page.extract_tables() for table in tables: for row in table: # 清理单元格中的换行 cleaned = [str(c).replace("\n", " ").strip() if c else "" for c in row] print(cleaned)这段代码会把每页的表格按行输出,但需要注意:extract_tables()对合并单元格的处理经常不理想,会出现错位。我一般会加上page.find_tables()拿到表格边界,然后结合文字层做二次校验,尤其是注脚中的"1、2、3…"上标,提取后容易粘在数值后面。比如"1001, 2"实际上可能是"100"加注脚"1,2",这种情况需要按列宽和坐标拆分。
5.2 上行链路符号在 PDF 中的乱码问题
原文明确写到:符号"? "用于表示上行链路相关的数量,类似符号"? "用于下行链路。这两个符号在 PDF 中通常以特殊字体渲染,用普通文本工具提取会显示成相同的占位符 。如果你要解析正文中的频率划分或协调公式,遇到这个字符时无法区分上下行,程序就会产生语义错误。
我的处理方式是:在 PDF 提取阶段,针对这两个符号的字体名称做映射。比如pdfplumber可以读到每个字符的字体名,通常上行箭头和下行箭头用的是不同字体。可以先扫描几页,找出对应字体的字符码,然后建立替换表。如果你的场景只是查阅某个表格数值,问题不大;一旦要做自动化冲突分析,就必须先解决这个字符映射,否则把上行限制误判成下行,会让后续所有计算失真。
另外一个很容易被忽略的点是《无线电规则》第二卷不包含决议和建议案文,那部分在第三卷。目录中出现的"第 1 号决议(WRC-97,修订版)"只是交叉引用。所以当你搭建规则库时,建议把第二卷、第三卷分开建模,在附录引用和决议引用之间建立外键关系,而不是全部堆在一个大表里。
最后,关于版本差异:WRC-23 对附录 30 附属文件中的技术数据做了修订,特别是卫星广播业务频段指配表和功率通量密度限值,如果你 2023 年之前用旧版做过的链路计算,建议重新跑一遍,特别是 11.7–12.7 GHz 频段的规划限值。新版已经开始采用与 2001 年版相同的编号方案,但附录的实质改动很大,不要被"相同编号"误导以为内容没变。
本文还有配套的精品资源,点击获取