从香农公式到5G NR:通信容量极限的演进之路
从香农公式到5G NR:通信容量极限的演进之路
技术标签:5G NR | MIMO | 信道容量 | 信息论 | 毫米波 | OFDM | 通信原理
代码仓库:本文配套仿真代码可在
首发文章/capacity_simulation.py获取
目录
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) CMIMO≈N⋅log2(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 仿真结果
运行上述代码生成的图表显示:
- SISO系统:峰值容量约 2 Gbps(100 MHz, SNR=30 dB)
- 4×4 MIMO:峰值容量约 8 Gbps,空间复用增益 ~4×
- 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 | 大带宽补偿损耗 | 带宽线性扩容 |
相关技术文章推荐:
原创文章,转载需授权。代码可自由使用,但请保留作者署名。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)