摘要

二进制对称信道是最基本的离散无记忆信道模型。本文研究将 BSC 独立使用 nnn 次构成的 nnn 次扩展信道,证明其信道容量为 Cn=n(1−H2(p))C_n = n\bigl(1-H_2(p)\bigr)Cn=n(1H2(p)),其中 ppp 为误码率,H2(p)H_2(p)H2(p) 为二进制熵函数。当 0<p<0.50<p<0.50<p<0.5 时,信道容量随扩展次数 nnn 线性增长,即“使用次数越多,可传输的总可靠信息量越大”。理论推导基于互信息的链式法则和信道无记忆性。数值仿真采用 Blahut-Arimoto 算法计算扩展信道的容量,并与理论值进行对比,结果完美吻合。本工作直观验证了多符号扩展对信道容量的累加效应,为理解信道编码定理和实际通信系统设计提供了基础支撑。


1. 研究背景与意义

信道容量是通信系统性能的极限标志,由香农于 1948 年提出。二进制对称信道(BSC)作为最简单的离散信道,广泛应用于描述二进制数据传输中对称的误码现象。实际通信系统通常不会逐比特传输,而是将多个比特组成一个分组或码字,这就对应信道的 nnn 次扩展——将同一信道重复使用 nnn 次形成的无记忆向量信道。

研究 nnn 次扩展信道的容量具有双重意义:
理论层面:验证“多次独立使用无记忆信道,其容量等于单次容量之和”这一由互信息链式法则导出的重要结论,为香农信道编码定理中“通过足够长的码长逼近容量”提供直观示例。
工程层面:定量揭示扩展次数 nnn 对最大可靠传输速率的影响,指导分组长度、纠错码设计与解码复杂度的折中,为现代通信系统(如 LDPC、Turbo 码)的码长选择提供基本依据。

本报告通过解析推导与 Python 数值仿真,系统阐述 BSC 多次扩展后的容量特性,并给出可视化验证。


2. 基础理论铺垫

2.1 二进制对称信道 (BSC)

二进制对称信道模型如图 1 所示。输入 X∈{0,1}X\in\{0,1\}X{0,1},输出 Y∈{0,1}Y\in\{0,1\}Y{0,1},转移概率为:

P(Y=1|X=0) = P(Y=0|X=1) = p, P(Y=0|X=0) = P(Y=1|X=1) = 1-p.

单次 BSC 的信道容量为

在这里插入图片描述

其中 H2(p)=−plog⁡2p−(1−p)log⁡2(1−p)H_2(p) = -p\log_2 p - (1-p)\log_2(1-p)H2(p)=plog2p(1p)log2(1p)。当 p=0.5p=0.5p=0.5 时,H2(0.5)=1H_2(0.5)=1H2(0.5)=1,容量为 0;当 p→0p\to0p0p→1p\to1p1 时,容量 →1\to 11 bit/次。

2.2 离散无记忆信道 (DMC) 的 nnn 次扩展

对 DMC 进行 nnn 次扩展,得到的新信道输入为 nnn 维向量 X=(X1,…,Xn)\mathbf{X}=(X_1,\dots,X_n)X=(X1,,Xn),输出为 Y=(Y1,…,Yn)\mathbf{Y}=(Y_1,\dots,Y_n)Y=(Y1,,Yn)。信道无记忆性意味着:

在这里插入图片描述

即各次传输相互独立。扩展后的信道转移矩阵是一个 2n×2n2^n\times 2^n2n×2n 矩阵,可由单符号转移矩阵 P1P_1P1 通过 Kronecker 积得到:

在这里插入图片描述

2.3 信道容量与 Blahut-Arimoto 算法

信道容量定义为最大化互信息:

在这里插入图片描述

对于小规模离散信道,可使用 Blahut-Arimoto 算法迭代计算容量,该算法通过交替更新输入分布和中间量,收敛到精确容量值,适合对理论结果进行数值验证。


3. 理论推导:Cn=nC1C_n = n C_1Cn=nC1

定理:对于错误概率 ppp 的 BSC,其 nnn 次扩展信道的容量为

在这里插入图片描述

证明

由信道容量定义 Cn=max⁡PXI(X;Y)C_n = \max_{P_{\mathbf{X}}} I(\mathbf{X};\mathbf{Y})Cn=maxPXI(X;Y)。利用互信息的链式法则:

在这里插入图片描述

由于信道无记忆,给定 XiX_iXiYiY_iYi 与之前所有的 Xi−1X^{i-1}Xi1Yi−1Y^{i-1}Yi1 条件独立,故:

在这里插入图片描述

其中不等式源于条件作用不能增加互信息。进一步,每个分量互信息不超过单次信道容量 C1C_1C1,因此

在这里插入图片描述

若我们选择 X\mathbf{X}X 的各分量独立且均服从等概分布 PX(0)=PX(1)=1/2P_X(0)=P_X(1)=1/2PX(0)=PX(1)=1/2,则各 YiY_iYi 也独立且等概,此时

在这里插入图片描述

该输入分布使互信息达到上界 nC1n C_1nC1,因此容量即为 nC1n C_1nC1。证毕。

推论
0<p<0.50<p<0.50<p<0.5C1>0C_1>0C1>0,则 Cn=nC1C_n = n C_1Cn=nC1nnn 严格线性增加。
p=0.5p=0.5p=0.5C1=0C_1=0C1=0Cn=0C_n=0Cn=0,扩展不增加容量。
p=0p=0p=0p=1p=1p=1C1=1C_1=1C1=1Cn=nC_n=nCn=n,依然线性增长。


4. 代码说明与运行截图说明

4.1 代码结构与功能

本仿真用 Python 实现,主要包含以下模块:

binary_entropy(p):计算二进制熵 H2(p)H_2(p)H2(p),处理边界情况。 bsc_capacity(p, n):返回 nnn 次扩展 BSC 的理论容量 n(1−H2(p))n(1-H_2(p))n(1H2(p))
extended_bsc_transition_matrix(n, p):通过 Kronecker 积生成 nnn 次扩展信道的转移概率矩阵,规模为 2n×2n2^n\times 2^n2n×2n
blahut_arimoto(P, tol, max_iter):实现 Blahut-Arimoto 迭代算法,输入转移矩阵,输出信道容量(单位:bit)。
主程序
设置不同 ppp 值(0.05, 0.15, 0.25, 0.35, 0.45)和 nnn 从 1 到 10。
绘制理论容量曲线:CnC_nCnnnn 变化(左子图)。
n=1,2,3n=1,2,3n=1,2,3,使用 Blahut-Arimoto 数值计算一系列 ppp 点的容量,与理论值对比(右子图)。
输出 p=0.2p=0.2p=0.2 时的数值对比表格。

由于扩展矩阵随 nnn 指数增长,数值仿真仅对 n≤3n\le 3n3 进行(矩阵尺寸最大 8×88\times 88×8),更高次的容量直接使用理论公式。
代码如下:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rcParams

rcParams['font.size'] = 12
rcParams['figure.figsize'] = (10, 6)

def binary_entropy(p):
    """计算二进制熵 H(p),处理 p=0 或 1 边界"""
    if p <= 0 or p >= 1:
        return 0.0
    return -p * np.log2(p) - (1-p) * np.log2(1-p)

def bsc_capacity(p, n=1):
    """n 次扩展 BSC 的理论容量"""
    return n * (1 - binary_entropy(p))

def extended_bsc_transition_matrix(n, p):
    """构造 n 次扩展 BSC 的信道转移矩阵 (2^n x 2^n)"""
    # 单次转移矩阵
    P1 = np.array([[1-p, p],
                   [p, 1-p]])
    # n 次 Kronecker 积
    Pn = P1.copy()
    for _ in range(1, n):
        Pn = np.kron(Pn, P1)
    return Pn

def blahut_arimoto(P, tol=1e-8, max_iter=500):
    """
    Blahut-Arimoto 算法计算离散无记忆信道容量。
    P: 信道转移矩阵 (输入数 x 输出数)
    返回容量值(以 bit 为单位)。
    """
    r, c = P.shape
    q = np.ones(r) / r          # 初始输入分布
    capacity_old = -np.inf
    for _ in range(max_iter):
        # 计算辅助变量
        temp = np.dot(q, P)
        # 避免除零
        temp[temp == 0] = 1e-12
        # 更新 q
        q_new = np.exp(np.sum(P * np.log(P / temp), axis=1))
        q_new /= np.sum(q_new)
        # 计算容量下界
        mutual_info = 0.0
        for i in range(r):
            for j in range(c):
                if q[i] > 0 and P[i,j] > 0:
                    mutual_info += q[i] * P[i,j] * np.log2(P[i,j] / temp[j])
        if np.abs(mutual_info - capacity_old) < tol:
            capacity_old = mutual_info
            break
        q = q_new
        capacity_old = mutual_info
    return capacity_old

# 参数设置
p_vals = [0.05, 0.15, 0.25, 0.35, 0.45]  # 不同错误概率
n_vals = np.arange(1, 11)                 # 拓展次数 n

# 1. 理论容量曲线
plt.subplot(1, 2, 1)
for p in p_vals:
    capacities = [bsc_capacity(p, n) for n in n_vals]
    plt.plot(n_vals, capacities, '-o', label=f'p={p}')
plt.xlabel('拓展次数 n')
plt.ylabel('信道容量 (bit)')
plt.title('BSC n 次扩展信道容量 (理论)')
plt.legend()
plt.grid(True, linestyle='--', alpha=0.6)

# 2. 数值仿真验证 (Blahut-Arimoto 计算 n=1,2,3 并与理论对比)
plt.subplot(1, 2, 2)
markers = ['o', 's', '^']
n_test = [1, 2, 3]
p_test = np.linspace(0.01, 0.49, 10)  # 避开 p=0.5 使容量>0

for i, n in enumerate(n_test):
    cap_num = []
    cap_theory = []
    for p in p_test:
        Pn = extended_bsc_transition_matrix(n, p)
        cap = blahut_arimoto(Pn)
        cap_num.append(cap)
        cap_theory.append(bsc_capacity(p, n))
    plt.plot(p_test, cap_num, marker=markers[i], linestyle='--',
             label=f'n={n} (数值)')
    plt.plot(p_test, cap_theory, linestyle='-', alpha=0.7,
             label=f'n={n} (理论)')

plt.xlabel('错误概率 p')
plt.ylabel('信道容量 (bit)')
plt.title('数值计算 vs 理论 (Blahut-Arimoto)')
plt.legend(ncol=2, fontsize=9)
plt.grid(True, linestyle='--', alpha=0.6)

plt.tight_layout()
plt.savefig('bsc_extended_capacity.png', dpi=150)
plt.show()

# 打印一组对比结果
print("数值仿真与理论值对比 (p=0.2):")
for n in [1, 2, 3]:
    Pn = extended_bsc_transition_matrix(n, 0.2)
    cap_ba = blahut_arimoto(Pn)
    cap_th = bsc_capacity(0.2, n)
    print(f"n={n}: BA={cap_ba:.6f}, 理论={cap_th:.6f}, 误差={abs(cap_ba-cap_th):.2e}")

4.2 运行结果截图说明

运行代码后生成一幅包含两个子图的图像:
在这里插入图片描述

左图:理论容量随扩展次数 nnn 的变化

横轴为 nnn(1~10),纵轴为信道容量(bit)。
不同颜色的曲线对应不同误码率 ppp,所有曲线呈严格线性上升。ppp 越小,斜率越大,容量随 nnn 增长越快;p=0.45p=0.45p=0.45 时容量虽然较低但仍为正,随 nnn 增加明显。
图中可直观看出,对于固定 p<0.5p<0.5p<0.5CnC_nCnnnn 成正比,验证了容量线性增大。

右图:数值计算与理论值对比
横轴为误码率 ppp(0.01~0.49),纵轴为信道容量。
离散标记(圆形、方形、三角形)为 Blahut-Arimoto 算法对 n=1,2,3n=1,2,3n=1,2,3 的数值结果,连续半透明曲线为理论值。
数值点完全落在理论曲线上,肉眼无法分辨差异,证明推导公式完全正确。

终端输出示例:
数值仿真与理论值对比 (p=0.2):
n=1: BA=0.278072, 理论=0.278072, 误差=1.11e-16
n=2: BA=0.556143, 理论=0.556143, 误差=2.22e-16
n=3: BA=0.834215, 理论=0.834215, 误差=2.22e-16
误差均在机器精度量级,进一步证实 Cn=nC1C_n=nC_1Cn=nC1


5. 仿真结果分析与工程解读

5.1 数值仿真与理论一致性

仿真结果准确再现了理论公式 Cn=nC1C_n = n C_1Cn=nC1,不仅验证了互信息链式法则推导的正确性,也展示了 Blahut-Arimoto 算法在无记忆信道容量计算中的有效性。容量随 nnn 线性增长这一结论,根源于信道的无记忆性和输入分布的可独立选择。

5.2 工程意义

提高可靠传输速率的途径:对于固定的 BSC,若想增加每传输一次可承载的信息量,直接的办法是增大单次信道容量(如降低 ppp)。然而,在 ppp 不可控的情况下,通过扩展次数 nnn(即增加分组长度)也可以线性提升每个分组的最大信息量。这正是香农信道编码定理的核心思想:采用足够长的码字,可以在保持任意小错误概率的同时,使传输速率接近信道容量。
码长与复杂度的折中:工程中 nnn 的增长会带来编解码复杂度的指数上升(例如最大似然解码的复杂度与 2n2^n2n 相关)。因此,实际系统需在性能增益与实现成本之间取得平衡,利用现代编码方案(如 LDPC、Polar 码)在可接受的复杂度下逼近信道容量。
渐进分析:当 n→∞n\to\inftyn,每个分组的容量 Cn→∞C_n \to \inftyCn(除非 p=0.5p=0.5p=0.5),但归一化到每信道使用的容量始终为 C1C_1C1。这强调了“容量”是每符号的平均信息量,而不随分组长度改变,扩展只是放大了分组的总信息承载能力。

5.3 限制与展望

本仿真仅对 n≤3n\le 3n3 进行矩阵级别的数值验证,更大规模的验证受限于转移矩阵的指数膨胀。未来可借助蒙特卡洛方法或基于容量公式的理论分析,对更大的 nnn 开展等效验证。此外,该分析可扩展至非对称信道或具有记忆的信道,研究更一般条件下扩展次数的容量效应。


6. 总结

本文对二进制对称信道的多次扩展进行了系统分析,理论推导证明了 nnn 次扩展 BSC 的信道容量恰好是单次容量的 nnn 倍,即 Cn=nC1C_n = n C_1Cn=nC1。通过 Python 代码构造扩展信道矩阵并执行 Blahut-Arimoto 算法进行数值仿真,结果与理论高度一致,验证了扩展容量线性增长的结论。该结论深刻揭示了无记忆信道容量的加性本质,为通信编码设计中“通过增加码长提升可靠吞吐量”提供了数学基础和直观理解。本工作可作为理解信道容量与多符号传输关系的教学与工程参考。

更多推荐