将 AWGN 噪声应用于 QPSK-OFDM 符号

信息处理 Python 数字通信 qpsk OFDM
2022-01-30 10:20:11

我正在研究基于 OFDM-QPSK 的系统,但在将系统的 BER 与理论曲线相匹配时遇到了一些麻烦。我的 OFDM 实现填充了所有子载波,并具有 t_symbol s 持续时间和 t_cp 循环前缀持续时间。在继续我的系统开发之前,我正在尝试验证我的系统实现。我正在使用以下 python 代码来应用噪声:

def awgn(self,data,noise_power):        
    Es = sum(abs(data)**2.)
    Eb = Es/(self.OFDM_SIZE*2.)
    EbN0_dB = noise_power + 10*log10(self.t_symbol/(self.t_symbol - self.t_cp))
    EbN0 = (10.)**(EbN0_dB/10.)
    N0 = Eb/EbN0
    noise = sqrt(N0/2.)*(random.standard_normal((data.size,)) + random.standard_normal((data.size,))*1j)
    return (data + noise)

我只是意识到这里所做的归一化是不正确的,因为这个信号是 OFDM 调制后的。但问题依然存在。


所用理论曲线的方程为:

BER_t   = 0.5*erfc(n_sqrt((10.**(EbN0_vt/10.))/2.))

我之前在 Matlab 上使用过类似的代码,效果很好,但现在不行了。

我想它现在不起作用,因为我的系统没有 (1+1j),(1-1j)... 的星座...我必须使用小于 1 的值,因为我的系统是在定点实现的。现在我使用 0.75 作为幅度,但它是任意选择的。我试图纠正能量符号以获得等于 1 的平均能量,但使用它会使我的信号超出范围。我正在考虑在应用于理论 BER 方程之前纠正 EbN0,但我只是想知道如何。

谁能给我正确的方法?

我的中心问题

试图改善我的问题:我需要知道的是,当它的子载波用 QPSK 调制时如何在 OFDM 信号上应用 awgn,以及如何将其与理论 BER 图相匹配。我的 QPSK 符号的幅度为 0.75。上面的代码是为了展示我现在是怎么做的。

更新

我运行代码将 FFT 子系统更改为 scipy.fftpack 并将 QPSK 符号的幅度更改为 1 而不是 0.75。和曲线匹配。我还将理论曲线更正为:

BER_t   = 0.5*erfc(n_sqrt((10.**(EbN0_vec/10.))))

所以我仍然认为纠正上述方程中的 EbN0 是一个问题。

更新2

经过对上述功能的多次测试,我发现它们是正确的。问题的根源是我正在处理 IFFT/FFT 的定点实现,我必须考虑到这种情况来处理通道模型。我试图弄清楚如何处理这个问题,但还没有解决方案。

1个回答

您对符号和噪声能量的测量不正确。请注意,以下是伪代码,不是有效的 Python 代码。EbN0_dB 应该是此代码的输入,而不是输出。

Esymbol = sum(real(data*conj(data))) / numSymbolsInData
Eb = Es/numPayloadBitsPerSymbol
Eb_dB = 10*log10(Eb)
N0_dB = Eb_dB - EbN0_dB
N0 = (10.)**(N0_dB/10.)