使用BPSK的瑞利信道中的BER-SNR曲线

时间:2018-11-11 15:18:59

标签: python scipy

我正在尝试使用BPSK调制在瑞利信道中生成BER-SNR曲线。谁能帮我找到python代码有什么问题吗?理论BER与模拟BER不同。红色的虚线是理论上的,蓝色的虚线是模拟上的。

BER-SNR Curve of BPSK

import math as mt
import numpy as np
import matplotlib.pyplot as plt
import numpy.random as nr
from scipy.linalg import toeplitz

# ------------Simulation parameters------------------------
N = 500 #No.of symbols
H_n = 10 #No.of channel elements
h_ray = np.zeros((H_n, 1), dtype = complex)

# ---------------------------------------------------------
EbN0dB = np.array(range(0, 11))
itr = len(EbN0dB)
ber = [None] * itr
theoreticalBER = [None] * itr

# -----------------------------Transmitter----------------------------
s = 2 * (nr.rand(N, 1) >= 0.5) - 1  # BPSK

# ------------------------------Channel-------------------------------
h_ray = (1/mt.sqrt(2)) * (nr.randn(H_n, 1) + 1j * nr.randn(H_n, 1))  
                              # Rayleigh fading channel
z = np.zeros((N-1,1))
c = np.concatenate((h_ray, z), axis=0)
r = np.concatenate(([h_ray[0]], np.zeros((1, N-1))), axis=1)
h_ray_y=toeplitz(c, r) # Toeplitz matrix instead of convolution

y_ray = np.dot(h_ray_y, s)

for n in range(itr):
    EbN0dB_n = EbN0dB[n]
    EbN0 = 10.0 ** (-EbN0dB_n/ 20.0)
    noise =  1/mt.sqrt(2) * (nr.randn(N+H_n-1) + 1j * nr.randn(N+H_n-1))
    r_ray = y_ray + EbN0 * noise
    # --------------------------Receiver------------------------------
    r_t = np.dot(np.dot(np.linalg.pinv(np.dot(h_ray_y.T, h_ray_y)), h_ray_y.T), r_ray) # (H.T * H)^(-1)*H.T*received 
    r_d = 2 * (np.real(r_t) >= 0) - 1
    errors = (s != r_d).sum()
    ber[n] = 1.0 * errors / N

    EbN0_th = 10.0 ** (EbN0dB_n / 10.0)
    theoreticalBER[n] =  0.5 *(1 - mt.sqrt(EbN0_th/ (1 + EbN0_th)))
ber=np.asanyarray(ber)
#-------------------------------------------------------------------------
plt.plot(EbN0dB, np.log10(ber), '--bo')
plt.plot(EbN0dB, np.log10(theoreticalBER), 'ro')
plt.xlabel('EbN0(dB)')
plt.ylabel('BER')
plt.grid(True)
plt.title('BPSK - Rayleigh')
plt.show()

0 个答案:

没有答案