%%%%LDPC precode's rate 0.95, codeword's length 1000
clear;
clc;
load LDPCHL4RP_100.mat
Info_length=950;
codeL=1000; %%% length of codeword
Rate=0.95;
Num_check=round(codeL*(1-Rate));
%%%%%%%%%%%%%% degree distribution raptor
degree=[0.00797,1;
0.49357,2;
0.16622,3;
0.07265,4;
0.08255,5;
0.05606,8;
0.03723,9;
0.05559,19;
0.02502,65;
0.00314,66]; %%degree distribution
N=length(degree(:,1));
sum_deg=zeros(N-1,1);
for i=1:N-1
temp=0;
for j_i=1:i
temp=temp+degree(j_i);
end
sum_deg(i)=temp;
end
EsNodB = [-2.83]; %%%capacity of BIAWGN is 0.5bit/channel use E/No=-2.83dB
EsNo = 10.^(EsNodB/10);
Avg_energy=1;
variance = Avg_energy./(2*EsNo);%%差额
decode_iterations = 40; %%%迭代次数40
number_frames = 3000;
O_head=[2.1,2.3,2.5,2.7];
Num_head=length(O_head);
test_Infober = zeros(Num_head,1);
for (count_head=1:Num_head)
bit_errors = 0;
Fer= 0;
rand('state',23417); %%用state算法产生23417个随机数
for (frame=1:number_frames)
%%creat information sequence
InfoWord=zeros(Info_length,1); %%%send all zero information word
Info=zeros(codeL,1); %%%% codeword of LDPC precode
%%creat degree entity
W_length=round(Info_length*O_head(count_head));
W_vec=rand(W_length,1); %%%% creat 0-1 uniform distribution
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:W_length
W_entity(i)=degree(10,2); %%%% changed by degree distribution
end
for i=1:W_length
for j_i=1:length(sum_deg)
if W_vec(i)<=sum_deg(j_i)
W_entity(i)=degree(j_i,2);
break;
end
end
end %%% 通过循环比较,将W_entity各元素,置为按照度分布概率所对应的整数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
W=zeros(W_length,degree(10,2),'uint16');
for i=1:W_length
temp_W=randperm(codeL);
W(i,1:W_entity(i))=temp_W(1:W_entity(i)); %%creat neighbors of encoding symbol,
end %%随机选取d个输入位置(1-1000之间)存在W的第i行的第1-d列
j_index=ones(codeL,1);
Info_edges=zeros(codeL,1,'uint16');
for i=1:W_length
for j_i=1:W_entity(i) %%从度中按概率随机选择一个d,d=W_entity(i)
Info_edges(W(i,j_i),j_index(W(i,j_i)))=i; %%creat neighbors of source node
j_index(W(i,j_i))=j_index(W(i,j_i))+1;
end
end
%%Raptor encode
Raptor_encoded=zeros(W_length,1);
for i=1:W_length
for j_i=1:W_entity(i)
Raptor_encoded(i)=Raptor_encoded(i)+Info(W(i,j_i));
end
Raptor_encoded(i)=mod(Raptor_encoded(i),2);
end
%% modulate signal
sig=-(2*Raptor_encoded-1); %%BPSK modulation [0 1;1 -1]
%% add noise
noise = sqrt(variance)*randn(W_length,1);
r = sig + noise; %%% AWGN channel
%% Demodulate and Decode according to "soft decoding of LT-codes for wireless broadcast"
a=1; %%AWGN channel
Lc=4*a*EsNo; %% channel reability value
L_r=Lc*r;
for i=1:W_length
for j_i=1:W_entity(i)
L_h(j_i,i)=0;
end
end
%% BP decoding of LT code %%%%
for iterations_i=1:decode_iterations
for i=1:W_length
for j_i=1:W_entity(i)
if W_entity(i)==1
L_t(i,j_i)=2*atanh(tanh(L_r(i)/2));
else
temp=1;
for k_i=1:W_entity(i)
if k_i==j_i
continue;
end
temp=temp*tanh(L_h(k_i,i)/2);
end
L_t(i,j_i)=2*atanh(tanh(L_r(i)/2)*temp);
end
end
end
for i=1:codeL
for j_i=1:(j_index(i)-1)
if (j_index(i)-1)==0|(j_index(i)-1)==1
break;
else
temp=0;
for k_i=1:(j_index(i)-1)
if k_i==j_i
continue;
end
for z_i=1:W_entity(Info_edges(i,k_i))
if W(Info_edges(i,k_i),z_i)==i
temp=temp+L_t(Info_edges(i,k_i),z_i);
break;
end
end
end
for z_i=1:W_entity(Info_edges(i,j_i))
if W(Info_edges(i,j_i),z_i)==i
L_h(z_i,Info_edges(i,j_i))=temp;
end
end
end
end
end
end
L_u=zeros(codeL,1);
for i=1:W_length
for j_i=1:W_entity(i)
L_u(W(i,j_i))= L_u(W(i,j_i))+L_t(i,j_i);
end
end
%%%BP decoding of LDPC code %%%
for i=1:Num_check
for j_i=1:Hrow_entity(i)
M_vc(j_i,i)=L_u(H_indexrow(i,j_i));
end
end
for iterations_i=1:decode_iterations
for i=1:Num_check
for j_i=1:Hrow_entity(i)
temp=1;
for k_i=1:Hrow_entity(i)
if k_i==j_i
continue;
end
temp=temp*tanh(M_vc(k_i,i)/2);
end
M_cv(i,j_i)=2*atanh(temp);
end
end
for i=1:codeL
for j_i=1:4
temp=0;
for k_i=1:4
if k_i==j_i
continue;
end
for z_i=1:Hrow_entity(H_indexcol(i,k_i))
if H_indexrow(H_indexcol(i,k_i),z_i)==i
temp=temp+M_cv(H_indexcol(i,k_i),z_i);
break;
end
end
end
for z_i=1:Hrow_entity(H_indexcol(i,j_i))
if H_indexrow(H_indexcol(i,j_i),z_i)==i
M_vc(z_i,H_indexcol(i,j_i))=temp+L_u(i);
end
end
end
end
end
for i=1:Num_check
for j_i=1:Hrow_entity(i)
L_u(H_indexrow(i,j_i))= L_u(H_indexrow(i,j_i))+M_cv(i,j_i);
end
end
err=0;
for i=1:Info_length
if L_u(i)>=0
Info_dec(i)=0;
else
Info_dec(i)=1;
end
if Info(i)~=Info_dec(i)
err=err+1;
end
end
if err~=0
Fer=Fer+1;
end
bit_errors = bit_errors +err;
end %%%match "for (frame=1:number_frames)"
Infober = bit_errors/(number_frames*Info_length);
test_Infober(count_head)=Infober;
Fer
save Raptor_AWGN_40temp test_Infober O_head
end
% semilogy(O_head,test_Infober)
评论13