无线通信中的数字带通传输:2ASK、2FSK、2PSK调制解调与误码率仿真
2026/9/18 1:57:57 网站建设 项目流程

简介:一份聚焦第7章“数字带通传输系统”的数字通信原理课程讲义,面向通信工程、电子信息类专业学生及考研复习者,系统梳理从数字基带信号到带通已调信号的调制与解调核心知识点。章节以2ASK(二进制振幅键控)为起点,详细推导OOK通断键控的信号表达式与功率谱密度,并逐步展开2FSK(二进制频移键控)的典型波形、键控法产生方式及非相干/相干解调结构,帮助读者建立数字带通传输系统的完整知识框架。资源为单份PDF电子讲义,共1个文件、大小2.62MB,全文字符公式完整、图文排版清晰,可直接在电脑、平板或手机端阅读。除2ASK的频谱与带宽分析外,还比较了相干与非相干解调的实现路径,既可用于“通信原理”课堂同步学习,也适合期末备考和考研专业课复习。已有93人下载学习,对想快速掌握数字调制知识点的读者而言,是一份精简高效的学习资料。

1. 数字带通传输系统在无线链路里到底在解决什么

数字基带信号直接接天线的场景基本只存在于教科书实验里。低频分量的波长太长,天线尺寸做不到,频谱占用也极不规整,更别提如何跟同频段的其他业务共存。数字带通传输系统解决的就是一件事:把 0/1 比特流放到一个指定载波频率上去传输,接收端再从带通信号里把比特还原出来。第 7 章数字带通传输系统的核心,是 2ASK、2FSK、2PSK 这三种基础体制及其差分变体 2DPSK。它们是无线物理层最底层的骨架,LoRa、NB-IoT、蓝牙、卫星遥测的物理层设计追到底都会回到这一章。这篇博文按“频谱搬移 → 调制 → 解调 → 带宽 → 同步”的顺序,把整套链路落到可运行的仿真里。

2. 从基带到带通:2ASK、2FSK、2PSK 的调制原理与频移思路

2.1 为什么要先做频谱搬移再发射

数字基带信号是低频能量集中的矩形脉冲序列,直接用它在空气里传输,发射效率极低,而且所有设备都挤在零频附近,无法做频率规划。带通传输的本质是频谱搬移:用基带信号去控制一个高频载波的某个参数,这在数学上对应乘以cos(ω_c t),时域卷积等效于频域把基带频谱搬到 ±f_c 两侧。

搬移之后就有了真正可工程化的收益:天线尺寸由载波波长决定;收发双方可以用不同载波频率区分信道;接收端可以用滤波器把目标信号从强干扰里挑出来。这一章里 2ASK、2FSK、2PSK 的差异,只在于“被控制的载波参数”是幅度、频率还是相位。

2.2 三种体制的波形数学模型和判决依据

教材里把三种体制放在一起对比,关键不是公式本身,而是每一个公式背后对应了哪种物理实现和哪种接收机结构。

体制信息承载维度时域表达式(简化)典型发送方式
2ASK载波幅度s(t) = a(t)·cos(ω_c t)a(t) ∈ {0, 1}载波通断键控
2FSK载波频率s(t) = A·cos(2πf_1 t)A·cos(2πf_2 t)两个振荡源切换
2PSK载波相位s(t) = A·cos(ω_c t + φ_n π)φ_n ∈ {0, 1}载波相位反转 180°

2ASK 的接收端可以不用相干载波,包络检波就能判别“有脉冲还是没脉冲”,接收机最简单,但同样噪声功率下判决距离最短。2FSK 把信息放在频率维度上,两个频率之间天然正交(满足频差为码速率整数倍时),可以用两个支路分别做相关积分后比大小。2PSK 将相位翻转 180° 作为判决依据,两个信号点的欧氏距离最大,是三种体制里功率效率最高的。

2PSK 工程化时有个绕不开的问题:绝对相位无法凭空定义。接收机恢复出来的载波可能反相,导致所有判决结果翻转,这就是“相位模糊”。教材里引入 2DPSK,用相邻码元的相位差承载信息,本质上是把“绝对值比较”换成“相对值比较”。

2.3 星座点与噪声容限:为什么 PSK 是功率效率之王

把三种体制画到星座图上,2ASK 是实轴上的0A两个点,距离为 A;2PSK 是实轴上的+A-A,距离为 2A;2FSK 在频率正交基上等效于两个点,但点间距由频差决定。高斯白噪声下,误码率主要取决于信号点之间的最小欧氏距离。同样的平均发射功率,2PSK 的判决距离比 2ASK 大一倍,对应约 3 dB 的功率优势。

这个 3 dB 的差距不是纸面数字,它意味着在相同误码率前提下,2PSK 可以用更小的发射功率或更小的天线口径。卫星链路、深空通信这类功率受限场景基本都往 PSK 方向走;2ASK 则因为实现简单,在光纤强度调制、RFID 反向散射这类短距离链路里仍有位置。

3. 用 Python 将三种带通调制仿真到误码率

3.1 最小仿真脚手架:参数、NRZ 映射与波形生成

仿真带通调制不需要射频硬件,基带复包络和实信号两种建模方式都可以。这里用实信号做,因为对“载波、包络、相位”这些概念的观察更直观。

import numpy as np rb = 10_000 # 码速率:10 kbps fs = 400_000 # 采样率:400 kHz fc = 40_000 # 载波频率:40 kHz sps = fs // rb # 每个符号 40 个采样点 rng = np.random.default_rng(42) n_bits = 20000 bits = rng.integers(0, 2, n_bits) # NRZ 映射:0 -> -1,1 -> +1,用于 2PSK nrz = 2 * bits - 1 sym = np.repeat(nrz, sps) # 零阶保持,矩形脉冲成形 t = np.arange(len(sym)) / fs ask = (bits.astype(float) @ np.ones((1, sps))).flatten() * np.cos(2 * np.pi * fc * t) psk = sym * np.cos(2 * np.pi * fc * t)

rb决定整个仿真带宽的基准,sps = 40保证载波一个周期内至少有 4 个采样点,频谱混叠可以忽略。fcrb的 4 倍,既能看出带通信号的包络变化,又不需要把采样率抬到很高。这里没有加成形滤波,矩形脉冲的旁瓣很大,但不影响三种体制的对比结论。

2FSK 在实信号下需要两个频点的载波,按比特映射到f1 = fc - 5000f2 = fc + 5000,两个频点差 10 kHz,正好等于码速率,满足正交条件。

f1, f2 = fc - 5000, fc + 5000 fsk = np.where(bits == 1, np.cos(2 * np.pi * f1 * t), np.cos(2 * np.pi * f2 * t))

np.where直接做频率键控。注意这里用的是频率切换的硬键控,相位不连续,所以功率谱旁瓣偏高,但误码率性能仍然正确。

3.2 相干解调与包络检波:两个判决函数

接收端的核心操作是“把能量从载波频率搬回基带,再做积分判决”。2PSK 用相干解调,2ASK 可以用包络检波,2FSK 用两个支路的相干积分比大小。

def ber_psk(rx, bits): x = rx * np.cos(2 * np.pi * fc * t) # 乘以本地相干载波 z = x.reshape(-1, sps).mean(axis=1) # 每符号积分,等价低通滤波 hat = (z > 0).astype(int) return np.mean(hat != bits) def ber_ask(rx, bits): env = np.abs(rx).reshape(-1, sps).max(axis=1) # 包络检波 thr = env.mean() / 2 # 工程上可用AGC输出做自适应门限 hat = (env > thr).astype(int) return np.mean(hat != bits)

mean(axis=1)这个操作不只是求平均,它等价于对每个符号周期做矩形窗积分,把载波分量滤掉、把基带分量累加。本振与发送载波同频同相时,这种相关接收就是匹配滤波的离散实现。2ASK 的门限在真实接收机里依赖自动增益控制,仿真里用包络均值的一半代替,和理论最优门限相差不大。

2FSK 的判决是分别与f1f2相乘后积分,取积分值大的支路作为判决结果:

def ber_fsk(rx, bits): z1 = (rx * np.cos(2 * np.pi * f1 * t)).reshape(-1, sps).mean(axis=1) z2 = (rx * np.cos(2 * np.pi * f2 * t)).reshape(-1, sps).mean(axis=1) hat = (z1 > z2).astype(int) return np.mean(hat != bits)

3.3 跑一条 Eb/N0 误码率曲线,并核对理论值

误码率曲线的横坐标统一用 Eb/N0,这样三种速率相同的体制可以直接对比。这里有一个工程易错点:仿真时先要在波形域加高斯白噪声,再换算 Eb/N0,不能把 SNR 直接当 Eb/N0。

x = np.linspace(0, 10, 11) for mod in ("psk", "ask", "fsk"): ber = [] for snr_db in x: # 波形域信噪比定义为信号平均功率 / 噪声功率 sig = {"psk": psk, "ask": ask, "fsk": fsk}[mod] sig_pow = np.mean(sig ** 2) noise_pow = sig_pow / (10 ** (snr_db / 10)) noise = np.sqrt(noise_pow) * rng.standard_normal(len(sig)) rx = sig + noise # Eb/N0 = SNR * (fs / rb),fs/rb 即每比特样本数 eb_n0 = snr_db + 10 * np.log10(fs / rb) ber.append(globals()[f"ber_{mod}"](rx, bits)) print(mod, ["%.2e" % v for v in ber])

fs / rb在这里等于 40,所以波形域 0 dB 对应 Eb/N0 = 16 dB,这个换算关系最容易把初学者带偏。核对理论时用0.5 * erfc(sqrt(eb_n0))作 2PSK 参考,仿真结果应该与理论曲线在 1e-2 到 1e-4 区间贴合。若偏差超过 0.5 dB,先检查噪声是否加到了实信号上而不是复基带,再看符号积分窗口是否与发送脉冲严格对齐。

低于 1e-5 的误码率点需要几千万比特的仿真量,跑起来很慢。更快的做法是让仿真在错误比特数累计到 100 个时提前停止,或者直接用理论公式覆盖低误码率区段。

4. 带宽估算与工程选型:调制指数、低通滤波与射频场景

4.1 主瓣带宽的三个算式

教材里的功率谱密度图容易让人只记住“主瓣宽度”,但工程上真正要算的是信道滤波器的通带宽度和邻频泄漏指标。三种体制的主瓣带宽估算如下:

体制主瓣带宽(单极性不归零码)典型信道带宽需求
2ASK2Rb2.0~2.5 Rb
2PSK2Rb1.8~2.2 Rb
2FSK|f1 - f2| + 2Rb随频差增大

2ASK 和 2PSK 的带宽一致,都是码速率的 2 倍,区别在于信息承载在幅度还是相位上。2FSK 多出一个频差项,|f1 - f2|越大,两个频率越容易区分,接收端判决越稳,但带宽线性增长。工程上引入“调制指数”h = |f1 - f2| / Rb来描述这个权衡:h < 1时两个频谱交叠严重,但带宽压缩明显;h = 1是正交频差的最小取值,也是大多数窄带 FSK 系统的设计起点;h > 2则更多出现在对带宽不敏感但对灵敏度要求高的场景。

4.2 接收端数字下变频与低通滤波的截止选择

仿真里用积分判决很简单,真实接收机里一般先数字下变频,再用低通滤波器把基带信号取出来。低通截止频率的选择直接影响误码率:截止太宽,带外噪声进得多;截止太窄,码间串扰开始出现。

from scipy.signal import butter, lfilter def lp_filter(x, cutoff, fs, order=5): b, a = butter(order, cutoff / (fs / 2), btype="low") return lfilter(b, a, x) # 数字下变频:先搬到零中频 baseband_i = psk * np.cos(2 * np.pi * fc * t) baseband_q = -psk * np.sin(2 * np.pi * fc * t) # 截止频率取 0.6 * rb,兼顾噪声抑制与码间串扰 i_f = lp_filter(baseband_i, 0.6 * rb, fs) q_f = lp_filter(baseband_q, 0.6 * rb, fs) env = np.sqrt(i_f ** 2 + q_f ** 2)

截止频率取0.6 * rb是经验值:矩形脉冲的主瓣到rb,但 0.6 到 1.0 之间的高频分量主要决定脉冲上升沿的陡峭程度,对抽样判决影响不大。用 I/Q 两路做正交下变频还有个额外好处,2ASK 的包络可以从sqrt(I^2 + Q^2)直接获得,载波相位偏差不会影响幅度判决。

如果这个仿真走的是连续比特流而不是独立符号,还要注意滤波器群延迟造成的符号边界偏移。此时常规做法是发一段已知的训练序列,接收端用相关峰定位符号起点。

4.3 工程选型:射频链路里谁在用谁在吃亏

把带宽和功率效率放到实际场景里,能解释很多“为什么不用更高级调制”的设计决策。

超外差接收机时代,2ASK 的包络检波电路最简单,早期无线门铃、遥控器大量用它,但灵敏度差,遇到窄带干扰容易误触发。窄带物联网部分物理层上行使用 2FSK / GFSK,松弛的频偏容限允许接收机用低成本晶振。蓝牙低功耗的调制也是 GFSK,h取 0.5 左右,属于连续相位调制,是 2FSK 的带宽优化变体。卫星链路是 2PSK / QPSK 的主场,功率受限但带宽相对宽裕,用更高的功率效率换更小的天线口径。

从工程成本看,2FSK 的接收机不需要载波相位同步这个问题,做非相干解调即可,适合节点多、成本敏感、数据率低的网络。2PSK 虽然功率效率高,但必须解决载波同步,接收机复杂度上了一个台阶,适合链路预算紧张但节点数量可控的场景。

5. 载波同步与相位模糊:把 2PSK 装进真实链路

5.1 相位模糊的表现与判别方法

仿真里发送端和接收端用同一个载波,相位模糊不会出现。真实接收机里,锁相环提纯出来的相干载波可能锁定在,也可能锁定在180°,两者对环路来说都是稳定点。锁定在 180° 时,2PSK 解调输出的每个比特都取反,误码率接近 0.5,但错误图案看起来不是随机噪声,而是“所有比特全部翻转”。

排查这类问题时,先看误码图案而不是误码率。如果错误比特全部集中在同一个极性上且占比接近 100%,多半是相位模糊而不是信噪比不足。在协议层加一段已知的唯一字或前导码,接收端比较唯一字的接收值与期望值,一旦不一致就整体取反,这是最直接的排除手段。

5.2 用差分编码绕开 180 度不确定

差分编码的思路是用相邻符号的相对相位传信息,相位模糊只会把所有符号整体翻转,相对关系保持不变。需要传的比特为 1 时,当前符号的相位相对上一符号翻转 180°,为 0 时保持相位不变。

# 发送端差分编码:d[n] = d[n-1] XOR b[n](约定 b=1 表示翻转) d = np.zeros(n_bits, dtype=int) d[0] = bits[0] for i in range(1, n_bits): d[i] = d[i - 1] ^ bits[i] # d 送入 2PSK 调制;接收端解调出判决比特 rec 后做差分译码 # rec[n] 与 rec[n-1] 相同 -> 0,不同 -> 1 hat_bits = np.zeros(n_bits, dtype=int) hat_bits[1:] = rec[1:] ^ rec[:-1] hat_bits[0] = rec[0] # 第一个符号无参考相位,默认依赖帧头校验

hat_bits[1:] = rec[1:] ^ rec[:-1]用相邻码元异或完成差分译码,没有乘法、没有除法,一个周期就能算完。代价是误码率比绝对 2PSK 略差:单个符号判错会同时影响前后两个差分比特。把差分编码和不归零映射配合使用,接收端不需要知道本地载波锁定在哪个相位,绕开了相位模糊。

5.3 在仿真里制造一次相位模糊,验证 DPSK 链路

想要确认链路对相位模糊免疫,不必改硬件逻辑,直接在解调端把本地载波相位人为翻转:

# 人为引入 180° 相位偏移 rx_rot = rx * np.cos(2 * np.pi * fc * t + np.pi) z_rot = rx_rot.reshape(-1, sps).mean(axis=1) rec_rot = (z_rot > 0).astype(int) # 差分译码 hat_dps = np.zeros(n_bits, dtype=int) hat_dps[1:] = rec_rot[1:] ^ rec_rot[:-1] print("误比特率:", np.mean(hat_dps[1:] != bits[1:]))

np.pi的相位偏置直接作用在本地载波上,等价于接收机锁相环锁到了反相解。对比绝对 2PSK 在同样条件下的全翻转输出,差分链路误码率基本不变。

实际调试带通链路时,验证步骤建议按这个顺序做:先用无噪声仿真确认调制映射和解调判决方向一致,再在加噪仿真里对比误码率曲线与理论曲线,最后人为注入频偏和相偏测试同步算法的容限。差分编码不要在链路完全跑通之前加进去,否则解调方向出错时,很难分辨是映射问题还是译码问题。

带通传输系统的调试终点不是误码率本身,而是“在给定带宽、发射功率和接收机复杂度下,是否选对了调制方式”。2ASK 适合极简接收机,2FSK 适合低成本窄带链路,2PSK 及其差分形式适合功率受限的高灵敏度场景。具体设计时,把主瓣带宽公式、相干解调的载波同步需求、差分编码的抗相位模糊特性这三项同时列出来,选型就不会出现“仿真很好、上线翻车”的落差。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询