1.算法描述
对于现有开销为20%左右的FEC,Pre FEC 的BER门限大概是2.4e-2。根据BER和 SNR之间的理论关系,我们可以得到不同阶数QAM调制格式时,达到纠前无误码的Required SNR。假设对于QPSK和 8QAM,16QAM分别为a, b, c,其中a<b<c。那现在对于某一个通信系统(考虑某一波特率,某一给定距离下)的SNR的值介于a和b之间,那怎么办呢?如果传QPSK,SNR浪费了,如果传8QAM性能又比较差,不能满足无误码的要求。所以之前的系统中,这种情况往往是传QPSK,多余的SNR留作了系统裕量。无疑,这样显然浪费了SNR资源,效率没有最大化。还有一个问题,对于MQAM,每个符号携带的信息量是整数,这样在设计给定线路速率的时候,比如200G,如果采用双偏的QPSK调制,波特率为64G左右,而如果采用双偏的8QAM调制,波特率为45G左右,波特率的调节十分有限。如果考虑12.5GHz为精细度的Flex grid的话,分别至少要75GHz和62.5GHz的信道间隔。这对于提高频谱效率是不利的。要保证更高的频谱利用效率,应当调节波特率使之尽可能地充满最小的信道间隔。比如把200G的信号填充在50GHz间隔内。也许你会认为16QAM的话,只用32Gbaud,可以在50GHz间隔中传输的。但是200G 16QAM的传输距离大概仅能传输600km,根本满足不了很多的长距骨干网应用。因此,QAM调制在浪费SNR资源的同时,也给系统设计和优化带来了不少的麻烦。
通过改变改变星座图不同位置符号出现的概率,让外圈星座点出现频率降低,有利于减小平均功率,相当于增加了最小欧氏距离,从而有更好的传输性能。这就是我们所说的概率星座整形(PCS)了。它究竟有什么好处呢?
- 具有整形增益,接近香农极限,如图5所示。
- 有望达到更高的传输容量,显著提升频谱效率,如图6所示。
- 传输速率可以灵活调整,以完美适配不同的传输信道,如图7所示。
- 无须多种支持多种QAM映射,仅使用方形QAM调制,需调整整形系数
- 无须调整FEC等技术方案
PCS的关键在于如何对均匀概率的输出映射成非均匀概率幅度分布,而且该概率分布还应该是最优的。理论上可以证明Maxwell-Boltzman分布对于方形QAM整形是最优的概率分布。而这一过程是由概率适配器(Distribution Matcher,DM)来实现的,过程如图8所示。根据实现方法,DM可以分为三类,CCDM,ESS,HIDM。
概率整形技术与现有的光通信系统相结合的呢?如图9所示,二进制数据经过DM后变成非均匀分布的符号,将这些整形后的符号以二进制标签来表示,以便于进行FEC编码,然后再像普通光通信一样,进行星座图的映射,电光调制,光纤传输,光电转换,DSP处理,解调,解码等过程后,再将二进制标签转化为符号,送入DM逆变换器中,恢复发送的数据。注意到,整形是在FEC之前完成的,并且如果采用概率幅度整形(PAS),一般PCS都是这样做的,整形和FEC是完全独立的,FEC也不会改变DM映射之后的概率分布,这给设计带来了很好的灵活性,也降低了实现的复杂度。正是基于此,Nokia在业内最先发布了支持PCS技术的相干DSP芯片PSE3,并且最近成功完成现场测试,验证了可行性。华为也将PCS成功应用于其自研ODSP芯片中,取得较好的效果。
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB核心程序
for ii= 1:1:order_QAM
tempx1=datx(ii,1);
if bitget(tempx1,i)==0
tempx2 = x2(ii,1);
tempx4 = x4(ii,1);
xb0(n1,i) = tempx2;
pxb0(n1,i) = tempx4;
n1 = n1+1;
else
tempx2 = x2(ii,1);
tempx4 = x4(ii,1);
xb1(n2,i) = tempx2;
pxb1(n2,i) = tempx4;
n2 = n2+1;
end
end
n1=1;
n2=1;
end
tic
SNR= -20:30;
for ijk= 1:length(SNR)
ijk
Nunifm_dqam = awgn(unifm_dqam,SNR(ijk),'measured');
NPS_QAMs = awgn(PS_QAMs,SNR(ijk),'measured');
%GMI
for k=1:Lens
y_k = NPS_QAMs(k,1);
y_k_bit = imsgss(k,1);
%分母条件概率
q_chs = ch_con_pro(PS_QAMs,NPS_QAMs,y_k,x,Lens);
denss = sum(q_chs.*px);
for i = 1:log2(order_QAM)
bit_temp = bitget(y_k_bit,i);
if bit_temp ==0
x_bit = xb0(:,i);
px_bit = pxb0(:,i);
else
x_bit = xb1(:,i);
px_bit = pxb1(:,i);
end
.............................................................
n = n +1;
end