用函数展示QPSk与16QAm的差异
当然可以!我们来通过一个简单的 Python 函数,可视化对比 QPSK 与 16QAM 的星座图(Constellation Diagram),直观展示它们在调制方式上的差异。
✅ 差异简要说明:
特性 | QPSK | 16QAM |
---|---|---|
每符号携带比特数 | 2 bit/symbol | 4 bit/symbol |
星座点数量 | 4 个 | 16 个 |
抗干扰能力 | 强(点间距离大) | 较弱(点密集) |
数据速率 | 较低 | 较高 |
适合信道 | 噪声较大 | 信噪比高 |
📊 用 Python 展示 QPSK vs 16QAM 星座图
import numpy as np
import matplotlib.pyplot as plt
def plot_qpsk_16qam():
# ========================
# 1. QPSK 星座图 (4点)
# ========================
# QPSK: 4 points at angles 45°, 135°, 225°, 315°
qpsk_symbols = [
complex(1, 1), # +1+j
complex(-1, 1), # -1+j
complex(-1, -1), # -1-j
complex(1, -1) # +1-j
]
qpsk_x = [s.real for s in qpsk_symbols]
qpsk_y = [s.imag for s in qpsk_symbols]
# ========================
# 2. 16QAM 星座图 (16点)
# ========================
# 16QAM: 4x4 网格,假设归一化到单位能量
# 使用 -3, -1, +1, +3 作为实部和虚部的取值
levels = [-3, -1, +1, +3]
symbols_16qam = []
for i in levels:
for j in levels:
symbols_16qam.append(complex(i, j))
# 归一化能量:使平均能量为1(可选)
energy = sum(abs(s)**2 for s in symbols_16qam) / len(symbols_16qam)
scale = np.sqrt(10) # 因为 16QAM 平均能量是 10,所以除以 sqrt(10)
normalized_16qam = [s / scale for s in symbols_16qam]
qam16_x = [s.real for s in normalized_16qam]
qam16_y = [s.imag for s in normalized_16qam]
# ========================
# 3. 绘图
# ========================
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
# QPSK
ax1.scatter(qpsk_x, qpsk_y, color='blue', s=100, edgecolors='black')
ax1.set_title('QPSK (4-ary)', fontsize=14)
ax1.set_xlabel('I (In-phase)')
ax1.set_ylabel('Q (Quadrature)')
ax1.grid(True, alpha=0.3)
ax1.axis('equal')
# 16QAM
ax2.scatter(qam16_x, qam16_y, color='red', s=50, edgecolors='black')
ax2.set_title('16QAM (16-ary)', fontsize=14)
ax2.set_xlabel('I (In-phase)')
ax2.set_ylabel('Q (Quadrature)')
ax2.grid(True, alpha=0.3)
ax2.axis('equal')
plt.tight_layout()
plt.show()
# 调用函数显示图形
plot_qpsk_16qam()
🔍 运行效果说明:
-
左图:QPSK
4 个点分布在圆上,对称分布,间距大 → 更抗噪声。 -
右图:16QAM
16 个点呈网格状排列,靠近中心的点更密集 → 单符号能传更多数据,但更容易出错。
💡 小贴士:
如果你在高信噪比环境下(比如光纤通信),用 16QAM 可以提升吞吐量;
但在无线移动场景中(如雨天、信号弱),QPSK 更可靠。