python中的BER模拟

问题描述

我想绘制模拟误码率图与我的 OFDM 信号的理论误码率图。 这就是模拟 BER 值的计算方法

    SNRdbs=np.arange(start=-18,stop='25',step=2)
BER_sim=np.zeros(len(SNRdbs))

使用 scipy 的 erfc 库,我计算了信号的 BER

    from scipy.special import erfc

BER_theory = 0.5*erfc(np.sqrt(10**(SNRdbs/10)))

理论BER如下

for i,SNRdb in enumerate(SNRdbs):

OFDM_TX = tx_signal
OFDM_RX = channel(OFDM_TX,SNRdb)
plt.figure(figsize=(8,2))
plt.plot(np.abs(OFDM_TX),label='TX signal')
plt.plot(np.abs(OFDM_RX),label='RX signal')
plt.legend(fontsize=10)
plt.xlabel('Time'); plt.ylabel('$|x(t)|$');
plt.grid(True);

gamma = 10**(SNRdb/10) #SNRs to linear scale
power = np.sum(np.abs(tx_signal)**2)/len(tx_signal)
N0 = power/gamma
nse = np.sqrt(N0/2)*noise
rx_signal = tx_signal + nse

#Receiver Side

#Serial to Parallel Conversion

len_to_split = [N+(int(0.25*N))]*B
input_elem = iter(rx_signal) 
rx_blocks = [list(islice(input_elem,elem)) for elem in len_to_split] 

index = range(0,int(N*0.25))
rx_withoutCP = np.delete(rx_blocks,index,axis=1)

rx_fft=[]
for k in range(B):
    rx_fft.append(np.fft.fft(rx_withoutCP[k]))


demap_sym=[]
for k in range(B):
    for l in range(N):
        

        if(rx_fft[k][l]>0):
            demap_sym.append(1)
        else:
            demap_sym.append(0)


cnt=0
for m in range(n):
    if(demap_sym[m] != m_signal[m]):
        cnt=cnt+1
BER_sim[i] = cnt/n

最后得到的图是这样的

enter image description here

大约 10db 后,模拟 BER 与理论 BER 相差太大。

在这里做错了什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)