%%%%-----此段代码完成PNC下行链路LDPC译码,中继端数据假设是理想接收无差错---%%%%
clc
clear
code_length=24; %码长
code_rate=1/2; %码率
max_iter=20; %译码最大迭代次数
SNR=3;
%%----LDPC检验矩阵和生成矩阵的构造----%%%
H=genH(code_length,code_rate); %生成校验矩阵
G=genG(H); %获得生成矩阵
G_gf1=gf(G,2); %转换到有限域
G_gf2=gf(G,2); %转换到有限域
dim=size(H);
d=dim(2)-dim(1);
%%---随机产生A端和B端原始数据,并进行编码
%------A端-----%
msg1=randi([0 1],1,d);
s_gf1=gf(msg1,2); %转换到有限域
code_bit1=s_gf1*G_gf1; %%编码
x1=code_bit1;
code_bit1=double(code_bit1.x);
%---- B端-----%
msg2=randi([0 3],1,d);
s_gf2=gf(msg2,2); %转换到有限域
code_bit2=s_gf2*G_gf2; %%编码
x2=code_bit2;
code_bit2=double(code_bit2.x);
%-----假设在中继端无差错接收-----%
yr=x1+x2;
yr=double(yr.x);
%%下行链路分两路进行BPSK调制传输
yr=de2bi(yr);
yr1=yr(:,1);
yr2=yr(:,2);
y_bp1=-2*yr1+1;
y_bp2=-2*yr2+1;
%--加噪声--%
yaw1=awgn(y_bp1,SNR,'measured');
yaw2=awgn(y_bp2,SNR,'measured');
%--接收端软解码,获取码字的概率信息--%
sigma=sqrt(10^(-0.1*SNR));
%第一路
f10=1./(1+exp(-2*yaw1/sigma^2));
f11=1-f10;
%第二路
f20=1./(1+exp(-2*yaw2/sigma^2));
f21=1-f20;
%---合并两路,计算GF(4)上码字的概率
p0=f10.*f20;
p1=f11.*f20;
p2=f10.*f21;
p3=f11.*f21;
%%
%%
%B端求解A端的信息
len=length(yr);
Pa0=zeros(1,len);
for loop=1:len
if code_bit2(loop)==0
Pa0(loop)=p0(loop);
elseif code_bit2(loop)==1
Pa0(loop)=p1(loop);
elseif code_bit2(loop)==2
Pa0(loop)=p2(loop);
elseif code_bit2(loop)==3
Pa0(loop)=p3(loop);
end
end
Pa1=1-Pa0;
[yhat_a] = decode(H,max_iter,Pa1,Pa0);
ya=yhat_a';
err1=nnz(code_bit1-ya);
%%
%%
%A端解B端的信息
Pb0=zeros(1,len);
Pb1=zeros(1,len);
Pb2=zeros(1,len);
Pb3=zeros(1,len);
for loop=1:len
if code_bit1(loop)==0;
Pb0(loop)=p0(loop);
Pb1(loop)=p1(loop);
Pb2(loop)=p2(loop);
Pb3(loop)=p3(loop);
elseif code_bit1(loop)==1
Pb0(loop)=p1(loop);
Pb1(loop)=p0(loop);
Pb2(loop)=p3(loop);
Pb3(loop)=p2(loop);
end
end
Pb10=Pb0+Pb1;
Pb11=Pb2+Pb3;
Pb20=Pb0+Pb2;
Pb21=Pb1+Pb3;
yhat1= decode(H,max_iter,Pb11,Pb10);
yhat2= decode(H,max_iter,Pb21,Pb20);
yhat_b=[yhat2,yhat1]; %这里比特发生颠倒,需注意
yb=(bi2de(yhat_b))'; %%二进制比特流转换为4元
err2=nnz(code_bit2-yb);