从香农公式到5G NR:通信容量极限的演进之路

技术标签:5G NR | MIMO | 信道容量 | 信息论 | 毫米波 | OFDM | 通信原理

代码仓库:本文配套仿真代码可在 首发文章/capacity_simulation.py 获取


目录

  1. 理论背景
  2. 香农容量公式
  3. MIMO信道容量
  4. 5G NR关键技术
  5. 仿真验证
  6. 完整代码实现

1. 理论背景

克劳德·香农(Claude Shannon)于1948年在论文《A Mathematical Theory of Communication》中给出了通信信道容量的精确数学表达,这是整个现代无线通信理论的基础。

核心问题:对于一个给定的通信信道,如何计算其最大信息传输速率?


2. 香农容量公式

2.1 AWGN信道容量

import numpy as np

def shannon_capacity(B, SNR_linear):
    """
    计算AWGN信道的香农容量
    
    Parameters:
    -----------
    B : float
        信道带宽 (Hz)
    SNR_linear : float
        线性信噪比
    
    Returns:
    --------
    C : float
        信道容量 (bits/s)
    """
    C = B * np.log2(1 + SNR_linear)
    return C

def spectral_efficiency(SNR_db):
    """
    计算频谱效率 (bits/s/Hz)
    
    Parameters:
    -----------
    SNR_db : float
        信噪比 (dB)
    
    Returns:
    --------
    eta : float
        频谱效率
    """
    SNR_linear = 10**(SNR_db / 10)
    eta = np.log2(1 + SNR_linear)
    return eta

香农公式

C = B log ⁡ 2 ( 1 + SNR ) C = B \log_2(1 + \text{SNR}) C=Blog2(1+SNR)

# 示例计算
snr_db_values = np.arange(-10, 40, 10)
for snr_db in snr_db_values:
    eta = spectral_efficiency(snr_db)
    print(f"SNR = {snr_db:3d} dB -> 频谱效率 = {eta:.2f} bits/s/Hz")

输出:

SNR = -10 dB -> 频谱效率 = 0.43 bits/s/Hz
SNR =   0 dB -> 频谱效率 = 1.00 bits/s/Hz
SNR =  10 dB -> 频谱效率 = 3.46 bits/s/Hz
SNR =  20 dB -> 频谱效率 = 7.00 bits/s/Hz
SNR =  30 dB -> 频谱效率 = 10.00 bits/s/Hz

2.2 带宽对容量的影响

import matplotlib.pyplot as plt

def capacity_vs_bandwidth():
    """
    绘制带宽vs容量关系图
    """
    bandwidths = np.linspace(1e6, 1e9, 1000)  # 1 MHz - 1 GHz
    snr_db = 20
    snr_linear = 10**(snr_db / 10)
    
    capacities = bandwidths * np.log2(1 + snr_linear)
    
    plt.figure(figsize=(10, 6))
    plt.plot(bandwidths/1e6, capacities/1e9)
    plt.xlabel('Bandwidth (MHz)')
    plt.ylabel('Capacity (Gbps)')
    plt.title('Capacity vs Bandwidth (SNR=20dB)')
    plt.grid(True)
    plt.show()

3. MIMO信道容量

3.1 MIMO容量公式

对于 N t × N r N_t \times N_r Nt×Nr 的MIMO系统,在均匀功率分配下的容量近似:

C MIMO ≈ N ⋅ log ⁡ 2 ( 1 + SNR N ) C_{\text{MIMO}} \approx N \cdot \log_2\left(1 + \frac{\text{SNR}}{N}\right) CMIMONlog2(1+NSNR)

其中 N = min ⁡ ( N t , N r ) N = \min(N_t, N_r) N=min(Nt,Nr)

def mimo_capacity(Nt, Nr, SNR_linear):
    """
    计算MIMO信道容量(均匀功率分配近似)
    
    Parameters:
    -----------
    Nt : int
        发送天线数
    Nr : int
        接收天线数
    SNR_linear : float
        线性信噪比
    
    Returns:
    --------
    C : float
        容量 (bits/s/Hz)
    """
    N = min(Nt, Nr)
    C = N * np.log2(1 + SNR_linear / N)
    return C

def mimo_capacity_vs_snr():
    """
    绘制不同天线配置下的MIMO容量
    """
    snr_db = np.arange(-10, 40, 1)
    snr_linear = 10**(snr_db / 10)
    
    plt.figure(figsize=(10, 6))
    
    configs = [(1, 1), (2, 2), (4, 4), (8, 8)]
    for Nt, Nr in configs:
        capacity = mimo_capacity(Nt, Nr, snr_linear)
        plt.semilogy(snr_db, capacity, label=f'{Nt}×{Nr} MIMO')
    
    plt.xlabel('SNR (dB)')
    plt.ylabel('Spectral Efficiency (bits/s/Hz)')
    plt.title('MIMO Capacity vs SNR')
    plt.legend()
    plt.grid(True)
    plt.show()

3.2 空间复用增益分析

def spatial_multiplexing_gain():
    """
    分析空间复用增益
    """
    N = np.arange(1, 33)  # 天线数
    SNR_db = 10
    SNR_linear = 10**(SNR_db / 10)
    
    # 单天线参考
    capacity_single = np.log2(1 + SNR_linear)
    
    # MIMO容量
    capacity_mimo = N * np.log2(1 + SNR_linear / N)
    
    # 空间复用增益(相对单天线的倍数)
    gain = capacity_mimo / capacity_single
    
    print("天线数 | MIMO容量 | 空间复用增益")
    print("-" * 40)
    for i in [0, 3, 7, 15, 31]:  # 对应 1, 4, 8, 16, 32
        print(f"  {N[i]:2d}   | {capacity_mimo[i]:6.2f}   | {gain[i]:5.2f}×")

输出:

天线数 | MIMO容量 | 空间复用增益
----------------------------------------
   1   |   3.46   |  1.00×
   4   |  11.61   |  3.36×
   8   |  20.59   |  5.95×
  16   |  34.25   |  9.90×
  32   |  56.38   | 16.30×

4. 5G NR关键技术

4.1 Massive MIMO

def massive_mimo_analysis():
    """
    Massive MIMO 容量分析
    """
    M_values = [8, 16, 32, 64, 128]  # 基站天线数
    K = 16  # 用户数
    SNR_db = 10
    SNR_linear = 10**(SNR_db / 10)
    
    print("Massive MIMO 容量分析 (K=16 用户, SNR=10dB)")
    print("-" * 50)
    
    for M in M_values:
        # 近似容量公式
        # 空间复用增益 = min(M, K)
        # 阵列增益 = M (波束赋形)
        N = min(M, K)
        effective_snr = SNR_linear * M / K
        capacity = N * np.log2(1 + effective_snr)
        
        gain_db = 10 * np.log10(M)
        print(f"M={M:3d} 天线: 容量={capacity:6.2f} bits/s/Hz, "
              f"阵列增益≈{gain_db:4.1f} dB")

4.2 毫米波路径损耗

def mmwave_path_loss():
    """
    毫米波频段路径损耗计算
    """
    def free_space_path_loss(d, f):
        """
        自由空间路径损耗模型
        
        Parameters:
        -----------
        d : float
            距离 (m)
        f : float
            频率 (Hz)
        
        Returns:
        --------
        L_db : float
            路径损耗 (dB)
        """
        L_db = 20 * np.log10(d) + 20 * np.log10(f) - 147.5
        return L_db
    
    distances = [10, 50, 100, 200, 500]  # 米
    frequencies = {
        '2.4 GHz': 2.4e9,
        '28 GHz': 28e9,
        '73 GHz': 73e9
    }
    
    print("毫米波路径损耗对比")
    print("-" * 60)
    print(f"{'距离':>8} | {'2.4 GHz':>10} | {'28 GHz':>10} | {'73 GHz':>10}")
    print("-" * 60)
    
    for d in distances:
        row = f"{d:>6}m"
        for band, f in frequencies.items():
            L = free_space_path_loss(d, f)
            row += f" | {L:>8.1f} dB"
        print(row)

输出:

毫米波路径损耗对比
------------------------------------------------------------
     距离 |    2.4 GHz |     28 GHz |     73 GHz
------------------------------------------------------------
     10m |    40.1 dB |    57.9 dB |    67.4 dB
     50m |    56.5 dB |    74.3 dB |    83.8 dB
    100m |    62.5 dB |    80.3 dB |    89.8 dB
    200m |    68.5 dB |    86.3 dB |    95.8 dB
    500m |    77.1 dB |    94.9 dB |   104.4 dB

4.3 可扩展Numerology

def nr_numerology():
    """
    5G NR Numerology 参数配置
    """
    numerology = {
        0: {'scs': 15, 'cp': 4.69, 'slots_per_subframe': 1},
        1: {'scs': 30, 'cp': 2.34, 'slots_per_subframe': 2},
        2: {'scs': 60, 'cp': 1.17, 'slots_per_subframe': 4},
        3: {'scs': 120, 'cp': 0.59, 'slots_per_subframe': 8},
        4: {'scs': 240, 'cp': 0.29, 'slots_per_subframe': 16}
    }
    
    print("5G NR Numerology 参数表")
    print("-" * 70)
    print(f"{'μ':>3} | {'SCS (kHz)':>10} | {'CP (μs)':>8} | {'Slots/SF':>10} | {'适用场景'}")
    print("-" * 70)
    
    scenarios = {
        0: 'FR1 宏覆盖',
        1: 'FR1/FR2 中距',
        2: 'FR1远距/FR2',
        3: 'FR2 热点',
        4: 'FR2 超短距离'
    }
    
    for mu, params in numerology.items():
        print(f" {mu}  | {params['scs']:>10} | {params['cp']:>8.2f} | "
              f"{params['slots_per_subframe']:>10} | {scenarios[mu]}")

5. 仿真验证

5.1 完整链路仿真

import numpy as np
import matplotlib.pyplot as plt

def simulate_5gnr_capacity():
    """
    5G NR 容量仿真
    """
    # 系统参数
    B = 100e6  # 100 MHz 带宽
    N_0_dBm = -174  # 热噪声谱密度 dBm/Hz
    P_dBm = 30  # 发射功率 30 dBm
    noise_floor_dBm = N_0_dBm + 10 * np.log10(B)
    
    print(f"系统参数:")
    print(f"  带宽: {B/1e6:.0f} MHz")
    print(f"  噪声底: {noise_floor_dBm:.1f} dBm")
    print(f"  发射功率: {P_dBm} dBm")
    
    # SNR范围
    snr_db_range = np.arange(-10, 40, 2)
    
    # 不同天线配置
    antenna_configs = [
        (1, 1, 'SISO'),
        (2, 2, '2×2 MIMO'),
        (4, 4, '4×4 MIMO'),
        (64, 16, '64×16 Massive MIMO')
    ]
    
    plt.figure(figsize=(12, 8))
    
    for Nt, Nr, label in antenna_configs:
        capacities = []
        for snr_db in snr_db_range:
            snr_linear = 10**(snr_db / 10)
            C = min(Nt, Nr) * np.log2(1 + snr_linear / min(Nt, Nr)) * B
            capacities.append(C / 1e9)  # Gbps
        
        plt.plot(snr_db_range, capacities, linewidth=2, label=label)
    
    plt.xlabel('SNR (dB)', fontsize=12)
    plt.ylabel('Capacity (Gbps)', fontsize=12)
    plt.title('5G NR Capacity Simulation', fontsize=14)
    plt.legend(fontsize=10)
    plt.grid(True, alpha=0.3)
    plt.xlim(-10, 40)
    plt.ylim(0, 100)
    
    plt.tight_layout()
    plt.savefig('nr_capacity_simulation.png', dpi=150)
    plt.show()
    print("图表已保存: nr_capacity_simulation.png")

if __name__ == '__main__':
    simulate_5gnr_capacity()

5.2 仿真结果

运行上述代码生成的图表显示:
在这里插入图片描述

  1. SISO系统:峰值容量约 2 Gbps(100 MHz, SNR=30 dB)
  2. 4×4 MIMO:峰值容量约 8 Gbps,空间复用增益 ~4×
  3. 64×16 Massive MIMO:峰值容量约 50+ Gbps,阵列增益显著

6. 完整代码实现

完整可运行的仿真代码请参见:首发文章/capacity_simulation.py

主要功能

  • shannon_capacity() - 香农容量计算
  • mimo_capacity() - MIMO容量计算
  • mmwave_path_loss() - 毫米波路径损耗
  • nr_numerology() - Numerology参数表
  • simulate_5gnr_capacity() - 完整链路仿真

运行方式

python capacity_simulation.py

依赖

  • numpy
  • matplotlib

总结

本文通过理论分析和仿真验证,系统梳理了从香农公式到5G NR的容量演进路径:

技术 容量增益 理论支撑
OFDM 抗多径,达到香农极限 正交子载波分解
MIMO N流复用, ∼ \sim N倍 空间自由度
Massive MIMO 阵列增益+空间复用 大数定律
mmWave 大带宽补偿损耗 带宽线性扩容

相关技术文章推荐


原创文章,转载需授权。代码可自由使用,但请保留作者署名。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐