在这个程序基础上绘制4PAM理论误码率和理论误比特率曲线
时间: 2023-08-23 10:05:55 浏览: 158
基于4PAM调制性能误码率仿真matlab源码-源码
5星 · 资源好评率100%
好的,我们可以使用Python来绘制4PAM的理论误码率和误比特率曲线。以下是一个基本的代码框架,你可以在此基础上进行修改和完善。
```python
import numpy as np
from scipy.special import erfc
import matplotlib.pyplot as plt
# 4PAM调制
M = 4
k = np.log2(M)
Eb = 1 # 符号能量
EbN0dB_range = range(-4, 13, 2)
EbN0_range = np.power(10, np.array(EbN0dB_range) / 10)
n = 100000 # 发送符号的数量
symbol = np.random.randint(0, M, n)
# 符号映射
def pam_mapper(x):
if x == 0:
return -3
elif x == 1:
return -1
elif x == 2:
return 1
else:
return 3
# 发送符号
s = np.array(list(map(pam_mapper, symbol)))
# 加入高斯噪声
ber = []
for EbN0 in EbN0_range:
noise = np.random.normal(0, np.sqrt(Eb / (2 * k * EbN0)), n)
r = s + noise
# 解调
def pam_demapper(x):
if x < -2:
return 0
elif x < 0:
return 1
elif x < 2:
return 2
else:
return 3
rs = np.array(list(map(pam_demapper, r)))
error = np.sum(rs != symbol)
ber.append(error / n)
# 理论误码率
ber_theory = 2 * (1 - 1 / np.sqrt(M)) * erfc(np.sqrt(3 * EbN0_range / (M - 1)))
# 理论误比特率
ser_theory = ber_theory * k
# 绘图
plt.plot(EbN0dB_range, 10 * np.log10(ber), marker='o', label='Simulation')
plt.plot(EbN0dB_range, 10 * np.log10(ber_theory), label='Theory')
plt.xlabel('Eb/N0(dB)')
plt.ylabel('BER(dB)')
plt.legend()
plt.show()
plt.plot(EbN0dB_range, 10 * np.log10(ser_theory), label='Theory')
plt.xlabel('Eb/N0(dB)')
plt.ylabel('SER(dB)')
plt.legend()
plt.show()
```
运行这段代码,你会得到4PAM的误码率和误比特率曲线。你可以根据自己的需要进行修改和优化。
阅读全文