我正在研究基于 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 的定点实现,我必须考虑到这种情况来处理通道模型。我试图弄清楚如何处理这个问题,但还没有解决方案。