QPSK调制误码率计算

文章目录

  • 误码率概念
  • 绘制误码率曲线
  • 代码实现

误码率概念

传输信息的有效性和可靠性是通信系统最重要的质量指标,对于数字通信系统,有效性用信息的传输速率来衡量,可靠性用错误率(误比特率和误码率)来衡量。
公式:误码率=错误码元数/传输的总码元数
将发送端的码元序列和接收端码元序列进行比较,得到错误码元数,具体过程是按位异或发送端的码元序列和接收端码元序列,使不同位表达为1,相同位表达为0,并计算异或后的和,即得到错误码元数,按上面的公式计算出误码率。

绘制误码率曲线

信号的传送过程中,由于噪声的干扰,可能出现解码错误,对于QPSK通信系统,在信号进行调制后,在信道中对信号采用加性高斯白噪声进行干扰,所以在这一过程中在调制信号中加入高斯白噪声,然后对这个调制信号进行解调,将原始信号与解调信号进行比较,计算出误码率。

代码实现

其中调制解调信号的产生在前面的博客中已经介绍过了,不在赘述。
1、首先自定义异或函数,用于后面计算误码率:

def bitxor(lst1, lst2):
    """两个二进制列表的逐位异或"""
    if len(lst1) != len(lst2):
        print('两个列表长度不一致!')
        return []
    else:
        return [lst1[x]^lst2[x] for x in range(len(lst1))]

2、误码率计算

error1 = bitxor(data, demodata)
error11 = np.sum(error1)
Awgn_num_BER = error11/nb

3、绘制误码率曲线

#误码率曲线
SNRindB1 = np.arange(0, 7, 1)
SNRindB2 = np.arange(0, 7, 0.1)

#高斯信道
smld_bit_awgn_err_prb = []
for i in range(len(SNRindB1)):
    pb1 = cm_sm33(SNRindB1[i])
    smld_bit_awgn_err_prb.append(pb1)
    
#理论曲线
theo_err_awgn_prb = []
for i in range(len(SNRindB2)):
    SNR = np.exp(SNRindB2[i]*np.log(10)/10)                        #信噪比
    theo_err_awgn_prb.append(0.5*special.erfc(np.math.sqrt(SNR)))  #高斯噪声理论误码率
    
plt.figure(figsize=(12, 8))
plt.semilogy(SNRindB2, theo_err_awgn_prb, 'b')
plt.semilogy(SNRindB1, smld_bit_awgn_err_prb, 'r*')
plt.title('误码率曲线', fontproperties=font,fontsize=20)
plt.axis([0, 6, 1.0e-3, 1e-1])
plt.gca().yaxis.set_major_formatter(mticker.FormatStrFormatter('%.0e'))
plt.xlabel('Eb/No',fontproperties=font, fontsize=20)
plt.ylabel('BER',fontproperties=font, fontsize=20)
plt.legend(['理论AWGN','仿真AWGN',], fontsize=14)
plt.show()

运行结果:
QPSK调制误码率计算_第1张图片

参考博客:https://blog.csdn.net/qq_40074819/article/details/105488447

你可能感兴趣的:(QPSK调制误码率计算)