16QAM调制解调不调用函数代码,画16QAM星座图,眼图,误码率曲线代码不调用函数,并注释
时间: 2023-08-24 08:06:35 浏览: 59
以下是一个简单的16QAM调制解调的代码,包含了绘制星座图、眼图和误码率曲线的代码:
```python
import numpy as np
import matplotlib.pyplot as plt
# 生成16QAM星座点
qam16 = np.array([-3-3j, -3-1j, -3+3j, -3+1j,
-1-3j, -1-1j, -1+3j, -1+1j,
3-3j, 3-1j, 3+3j, 3+1j,
1-3j, 1-1j, 1+3j, 1+1j])
# 显示星座图
plt.scatter(qam16.real, qam16.imag)
plt.xlabel('Real')
plt.ylabel('Imag')
plt.title('16-QAM Constellation')
plt.grid()
plt.show()
# 生成随机16QAM调制信号
N = 1000
bits = np.random.randint(0, 16, N)
signal_qam16 = qam16[bits]
# 绘制眼图
plt.figure()
plt.title('16-QAM Eye Diagram')
plt.xlabel('I')
plt.ylabel('Q')
for i in range(8):
plt.plot(signal_qam16[i*N//8:(i+1)*N//8].real, signal_qam16[i*N//8:(i+1)*N//8].imag, '.')
# 添加水平和垂直参考线
plt.axhline(y=0, color='k')
plt.axvline(x=0, color='k')
plt.grid()
plt.show()
# 加入高斯噪声
SNR_dB = 10
SNR = 10**(SNR_dB/10)
noise_power = 1/SNR
noise = np.sqrt(noise_power/2)*(np.random.randn(N) + 1j*np.random.randn(N))
signal_qam16_noisy = signal_qam16 + noise
# 解调16QAM信号
signal_qam16_demod = np.zeros(N, dtype=int)
for i in range(N):
distances = abs(signal_qam16_noisy[i] - qam16)
signal_qam16_demod[i] = np.argmin(distances)
# 计算误码率
error_bits = np.sum(signal_qam16_demod != bits)
BER = error_bits / N
print('误码率:', BER)
# 绘制误码率曲线
SNRs_dB = np.linspace(0, 20, 21)
SNRs = 10**(SNRs_dB/10)
BERs = []
for SNR in SNRs:
noise_power = 1/SNR
noise = np.sqrt(noise_power/2)*(np.random.randn(N) + 1j*np.random.randn(N))
signal_qam16_noisy = signal_qam16 + noise
signal_qam16_demod = np.zeros(N, dtype=int)
for i in range(N):
distances = abs(signal_qam16_noisy[i] - qam16)
signal_qam16_demod[i] = np.argmin(distances)
error_bits = np.sum(signal_qam16_demod != bits)
BER = error_bits / N
BERs.append(BER)
plt.figure()
plt.semilogy(SNRs_dB, BERs, 'o-')
plt.xlabel('SNR(dB)')
plt.ylabel('BER')
plt.title('16-QAM BER Curve')
plt.grid()
plt.show()
```
注释见代码。