[6]. GNU Radio 附加教程(六)-- 使用 ask bpsk qpsk qam16 模拟收发计算信噪比 视频 GitHub 码云 | 2026-03-13 11:07 | 阅读: 1 ### 前言 在《[GNU Radio 附加教程(三)][#1]》中,我们成功实现了多种调制方式的 **误码率(BER)** 测量。然而,要完整评估通信系统的性能,**信噪比 (SNR)** 是最核心的自变量。本文将介绍一种在 GNU Radio 中利用 **带外噪声估计法** 实时计算 SNR 的实用方法。 </br> ### 一、 测量原理:带外噪声估计法 在模拟信道中,我们通常假设底噪是**加性高斯白噪声(AWGN)**。这意味着噪声在频域内是均匀分布的(平坦的)。利用这一特性,我们可以通过对比“信号带宽内”和“信号带宽外”的功率来估算 SNR。 #### 1. 核心步骤 * **信号+噪声窗口 (信号 A):** 使用带通滤波器(-7kHz ~ -3kHz)提取。此时测得的功率 $P_A = P_{signal} + P_{noise\_A}$。 * **纯噪声窗口 (信号 B):** 使用相同带宽的带通滤波器(-44kHz ~ -40kHz)在信号主瓣之外提取。此时测得的功率 $P_B = P_{noise\_B}$。 #### 2. 计算公式 由于噪声是平坦的,且两个窗口带宽相同,则 $P_{noise\_A} \approx P_{noise\_B}$。 纯信号功率可表示为:$P_{signal} = P_A - P_B$。 根据定义,信噪比公式为: $$SNR = 10 \log_{10} \left( \frac{P_A - P_B}{P_B} \right)$$ </br> ### 二、 GNU Radio 流程图实现要点 #### 1. 滤波器配置 为了保证计算的准确性,必须严格控制两个带通滤波器(Band Pass Filter)的参数: * **带宽对称:** 信号窗口 A(宽度 4kHz)与噪声窗口 B(宽度 4kHz)必须完全相等。 * **增益一致:** 两个滤波器的 `Gain` 均设为 1。 * **窗口选择:** 确保窗口 B 所在的频段(-44k~-40k)没有信号旁瓣泄露,建议在 **Frequency Sink** 中观察确认。 </br> #### 2. 功率计算模块 在滤波器后,我们需要将复数基带信号转换为功率标量: * 使用 **Complex to Mag ^ 2** 模块:直接输出电压平方值,即瞬时功率。 * 使用 **Moving Average**(移动平均)模块:由于噪声具有随机性,瞬时功率波动剧烈。通过该模块取均值(如设置 1000 个采样点),可以获得稳定的功率估值。 </br> #### 3. 流程图实现 因此在《[GNU Radio 附加教程(三)][#1]》中的流程图基础上增加下面流程: ![][p1] </br> #### 4. 针对不同调制方式的注意事项 在测试 ASK, BPSK, QPSK, QAM16 时,请留意以下差异: | 调制方式 | 频谱特点 | 测量建议 | | --- | --- | --- | | **ASK / BPSK** | 能量集中在载波/主瓣 | 窗口 A 必须完整覆盖主瓣以获得准确功率。 | | **QPSK / QAM16** | 频谱效率高,主瓣较宽 | 需确保符号率(Symbol Rate)不会导致旁瓣进入窗口 B。 | | **成形滤波** | RRC 滤波器会压制旁瓣 | 使用 RRC 后,带外噪声测量将变得非常纯净。 | </br> 运行后的效果为: ![][p2] </br> ### 三、从 SNR 到 Eb/N0 #### 1. 计算公式 在通信系统的理论分析中,**SNR(信噪比)** 是针对特定测量带宽的感官指标,而 $E_b/N_0$(**每比特能量与噪声功率谱密度之比**) 则是衡量调制方式效率的“金标准”。 计算公式用分贝 (dB) 表示为: $$ (\frac{E_b}{N_0})\_{dB} = SNR_{dB} + 10 \log_{10}(B) - 10 \log_{10}(R_b)$$ - $SNR_{linear}$ (信噪比线性值):这是你通过 $10 \lg((A-B)/B)$ 得到的线性比值。它代表了在你的滤波器带宽 $B$ 内,信号功率与噪声功率的比值。 - $B$ (等效噪声带宽):在你实验中,这就是带通滤波器的宽度(4kHz)。 - 注意:噪声功率 $P_n$ 是随带宽 $B$ 变化的($P_n = N_0 \cdot B$),所以 SNR 会随滤波器变宽而减小。 - $R_b$ (净比特率 - Net Bit Rate):指每秒传输的有效二进制位数。 - 公式为:$R_b = R_s \cdot \log_2(M)$ - 其中 $R_s$ 是符号速率(Symbol Rate), - $M$ 是调制阶数(如 QPSK 的 $M=4$)。 </br> #### 2. 结果解读 **a)数学层面的含义** $E_b/N_0$ 是一个比值,转换成 dB 的公式是 $10 \log_{10}(E_b/N_0)$。 - 当 $E_b/N_0 > 1$ 时,dB 值为正。 - 当 $E_b/N_0 = 1$ 时,dB 值为 $0$。 - 当 $E_b/N_0 < 1$ 时,dB 值为负数。 当得到的结果为负数时(db 方式)意味着 Eb < N0。也就是说,你为了传输 1 bit 数据所投入的能量,还不如 1 Hz 带宽内的噪声功率大。 </br> **b)香农极限(Shannon Limit):理论底线** 通信理论中有一个著名的极限 —— **香农极限**。在带宽无限大的理想情况下,能够实现可靠传输(误码率趋近于 0)的最小 $E_b/N_0$ 是 $-1.59 \text{ dB}$。 - 如果你的 $E_b/N_0$ 是 $-1 \text{ dB}$,理论上通过极其复杂的编码(如 LDPC 或 Turbo 码),你仍然可以实现无差错传输。 - 如果你的 $E_b/N_0$ 小于 $-1.59 \text{ dB}$,那么无论采用什么技术,误码率都无法降低到 0。 </br> **c)负 $E_b/N_0$ 的实际应用场景** 虽然在普通的 BPSK/QPSK 仿真中,$E_b/N_0$ 为负通常意味着系统无法工作,但在以下领域,负 $E_b/N_0$ 是常态: - 扩频通信 (Spread Spectrum/CDMA):通过将信号散布在极宽的频带上,即便单比特能量远低于噪声($E_b/N_0 < 0$),接收端通过相关运算(处理增益)依然能把信号“捞”出来。 - 深空通信:由于距离极远,到达地球的信号极弱,通常在极负的 $E_b/N_0$ 下工作,依赖极低的数据速率和超强的纠错码。 - 隐蔽通信: 故意让信号沉溺在噪声底波之下(负 SNR),让敌方截获者以为这只是随机噪声。 </br> ### 四、总结与进阶建议 通过本文的方法,你已经在 GNU Radio 中建立了一套完整的性能评估体系: - **频域:** 通过带通滤波器观察信号与噪声的功率分布。 - **时域/统计:** 通过误码率计算模块统计实时 BER。 - **理论连接:** 通过 $E_b/N_0$ 换算,将实测点标注在经典的误码率曲线上。 ![][p3] </br> ### 五、补充优化 #### 5.1 优化 有同学反馈基于上面的流程图测得的 $E_b/N_0$ VS BER 曲线和上面的偏差很大,于是我深入研究了下,发现问题在于:**带通滤波器只取 4kHz 的带宽,导致只捕获了信号主瓣中心的一小部分能量。由于 BPSK/QPSK 等信号的频谱(25kHz)远宽于测量窗口,这种‘截断效应’使得计算出的信号功率 $P_{signal}$ 严重缩水,从而导致 $E_b$ 估值大幅偏低。在相同噪声背景下,这种局部的 $E_b/N_0$ 测量值会比理论真值偏小 8~10dB 左右,使得实测曲线在坐标系中发生剧烈的水平位移,无法与理论瀑布曲线对标。** 于是我将**滤波器 A 的范围调成了 -15kHz ~ 15kHz(带宽 30kHz)**,以确保覆盖 BPSK 信号的完整主瓣及主要能量分布;同时将**滤波器 B 的范围调成了 -45kHz ~ -30kHz(带宽 15kHz)**,利用该频段极其平坦的特性来精确提取底噪。 在计算时,由于信号窗口 A 的带宽是噪声窗口 B 的 **2 倍**,根据 AWGN 功率谱密度平坦的特性,窗口 A 中的总噪声功率理论上也是 B 的 2 倍。因此,我采用了 $P_{signal} = P_A - 2P_B$ 的算法来剔除信号窗口内的噪声干扰,从而获取高纯度的信号平均功率。最后,通过下面公式进行带宽补偿: : $$(\frac{E_b}{N_0})\_{dB} = 10 \log_{10} \left( \frac{P_A - 2P_B}{P_B} \times \frac{15000}{R_b} \right)$$ **备注:** 流程图为 `ask_bpsk_qpsk_qam16_v4.grc` **备注:** `PLOT_BER_EbN0.py` 可以绘制理论的 BER 和 EbN0 图 </br> #### 5.2 实验结果 以下为各调制方式在不同噪声电压 $\sigma$ 下的实测表现,并与理论预期进行对标。 --- **a)BPSK 调制 (1 bit/symbol)** *基准参考:Voltage=0 时,信号平均功率 -0.02dB,噪声功率 -81dB。* | Voltage ($\sigma$) | 实测 SNR (dB) | 实测 $E_b/N_0$ (dB) | 实测 BER | 理论预期 | 判定结论 | | :--- | :--- | :--- | :--- | :--- | :--- | | **0.63** | 12.2 | 10.0 | 0 | $BER \approx 3.8 \times 10^{-6}$ | **高度吻合** | | **0.8** | 10.18 | 7.9 | 0.015% | $BER \approx 0.010\%$ | **高度吻合** | | **0.9** | 9.13 | 6.93 | 0.08% | $BER \approx 0.076\%$ | **完全精确** | | **1.0** | 8.3 | 6.0 | 0.2% | $BER \approx 0.23\%$ | **高度一致** | </br> **b)QPSK 调制 (2 bits/symbol)** *基准参考:Voltage=0 时,信号平均功率 -0.025dB,噪声功率 -81dB。* | Voltage ($\sigma$) | 实测 SNR (dB) | 实测 $E_b/N_0$ (dB) | 实测 BER | 理论预期 | 判定结论 | | :--- | :--- | :--- | :--- | :--- | :--- | | **0.63** | 12.2 | 7.0 | 0.06% | $BER \approx 0.07\%$ | **完全一致** | | **0.8** | 10.0 | 4.8 | 0.65% | $BER \approx 0.60\%$ | **高度吻合** | | **0.9** | 9.14 | 3.93 | 1.3% | $BER \approx 1.35\%$ | **完全精确** | | **1.0** | 8.3 | 3.0 | 2.3% | $BER \approx 2.30\%$ | **完美对齐** | </br> **c)QAM16 调制 (4 bits/symbol)** *基准参考:Voltage=0 时,信号平均功率 0.716dB,噪声功率 -81dB。* | Voltage ($\sigma$) | 实测 SNR (dB) | 实测 $E_b/N_0$ (dB) | 实测 BER | 理论预期 | 判定结论 | | :--- | :--- | :--- | :--- | :--- | :--- | | **0.2** | 23.26 | 15.0 | 0% | $BER \approx 0$ | **符合预期** | | **0.4** | 17.3 | 9.05 | 0.66% | $BER \approx 0.8\%$ | **合理** | | **0.5** | 15.3 | 7.05 | 2.2% | $BER \approx 2.5\%$ | **合理** | | **0.63** | 13.3 | 5.02 | 5% | $BER \approx 5.6\%$ | **符合规律** | | **0.8** | 11.2 | 3.01 | 8.9% | $BER \approx 10.1\%$ | **合理** | </br> **d)ASK(0,1) 调制 (1 bit/symbol)** *基准参考:Voltage=0 时,信号平均功率 2.24dB,噪声功率 -81dB。* | Voltage ($\sigma$) | 实测 SNR (dB) | 实测 $E_b/N_0$ (dB) | 实测 BER | 性能对比 (vs BPSK) | 判定结论 | | :--- | :--- | :--- | :--- | :--- | :--- | | **0.63** | 14.5 | 12.28 | 0 | 同 $BER$ 需要更高能量 | **符合逻辑** | | **0.8** | 12.4 | 10.2 | 0.015% | 较 BPSK 能量需求高 2.3dB | **合理(见分析)** | | **0.9** | 11.36 | 9.10 | 0.09% | 较 BPSK 能量需求高 2.17dB | **合理(见分析)** | | **1.0** | 10.40 | 8.2 | 0.2% | 较 BPSK 能量需求高 2.2dB | **合理(见分析)** | --- **数据合理性深度分析** - 频谱效率与能量权衡:实验数据清晰地展示了“阶梯效应”:在相同电压(如 $\sigma=0.63$)下,随着调制阶数增加,$E_b/N_0$ 线性下降。BPSK (10dB) $\rightarrow$ QPSK (7dB) $\rightarrow$ QAM16 (5dB)。这完美验证了单比特能量随着符号携带比特数翻倍而减半($-3dB$)的物理准则。 - ASK 功率效率偏置:ASK 实验中,$Voltage=0$ 时的信号功率高达 $2.24dB$,导致测得的 $E_b/N_0$ 读数普遍偏高。然而,从 BER 表现来看,ASK 在 $8.2dB$ 时的误码率与 BPSK 在 $6.0dB$ 时相当,这 $2.2dB$ 的差距揭示了非对称幅度调制在抗噪声性能上的天然劣势。 - 实验结论:通过**不等长带宽测量法**修正后的系统,其 BPSK 和 QPSK 的实测点几乎完美契合理论瀑布曲线。本实验数据完整、逻辑自洽,成功验证了不同数字调制方式在 AWGN 信道下的可靠性理论。 </br> #### 5.3 理论计算模型 **1. 噪声功率谱密度 ($N_0$)** 设定采样率 $f_s = 100\text{kHz}$,噪声电压(标准差)为 $\sigma$。全带宽内的噪声总功率 $P_n = \sigma^2$。则单位带宽噪声功率为: $$N_0 = \frac{\sigma^2}{f_s}$$ </br> **2. 每比特能量 ($E_b$)** 假设 BPSK 信号振幅 $A=1$,符号速率 $R_s = 25\text{kHz}$。由于 BPSK 每符号含 1 bit,其能量为: $$E_b = \frac{A^2}{R_s}$$ </br> **3. $E_b/N_0$ 与电压 $\sigma$ 的映射关系** $$\frac{E_b}{N_0} = \frac{A^2 / R_s}{\sigma^2 / f_s} = \frac{A^2}{\sigma^2} \cdot \frac{f_s}{R_s}$$ 以分贝表示 (sps=4): $$(E_b/N_0)\_{dB} = -20 \log_{10}(\sigma) + 10 \log_{10}(4) \approx -20 \log_{10}(\sigma) + 6.02\text{ dB}$$ </br> **4. 理论误码率 (BER) 公式** - BPSK/QPSK: $P_b = Q(\sqrt{2 \cdot E_b/N_0})$ - QAM16: $P_b \approx \frac{3}{8} \text{erfc}(\sqrt{\frac{2}{5} \cdot E_b/N_0})$ [#1]:https://www.bilibili.com/video/BV1My9wYFEJP/?vd_source=e07622425aaa33ca0b1e9dafa0807cf4 [p1]:https://tuchuang.beautifulzzzz.com:3000/?path=202601/SNR_to_EbN0_grc.png [p2]:https://tuchuang.beautifulzzzz.com:3000/?path=202601/SNR_to_EbN0_grc_show.gif [p3]:https://tuchuang.beautifulzzzz.com:3000/?path=202601/Est_BER_vs_EbN0.png