%encode函数的一个子函数,用来生成LDPC校验矩阵的,
function [P]=genP(rows,cols,bits_per_col)
% rows=10;
% cols=18;
% bits_per_col=3;
fprintf('Creating P matrix...\n');
%--------------------------------------------------------------------------
%%%%%1.生成一个初始的H矩阵parity_check,该矩阵为全0,row_flag为行标识,表示了哪一行有1,有几个1%%%%%
row_flag(1:rows)=0;%产生1行128列的0
parity_check=zeros(rows,cols);%产生128行,256列的0
%--------------------------------------------------------------------------
%%%%%2.为矩阵parity_check添加1,row_flag也要标识%%%%%
%使每列随机产生3个1即列重为3
for i=1:cols %i=1:256
a=randperm(rows); %a为1行128列的随机数,从1到128的随机数。
for j=1:bits_per_col %j=1:3
parity_check(a(j),i)=1; %每一列都随机加入三个1
row_flag(a(j))=row_flag(a(j))+1; %记录哪一行加入1了
end
end
%--------------------------------------------------------------------------
%%%%%3.修改矩阵parity_check,使其行中至少有两个1%%%%%
%计算每行1的最多个数
max_ones_per_row=ceil(cols*bits_per_col/rows); %最大的行重应该是256*3/128=6
%若行中没有1则添加两个1,若行中只有一个1,则添加一个1
for i=1:rows %i=1:128
if row_flag(i)==0 %假设1':如果该行没有1,则随机添加两个1
for k=1:2 %循环两次,则表示加了两个1
j=unidrnd(cols); %生成一个服从均匀分布的随机数,该随机数在0到cols=256之间,设j=209
while parity_check(i,j)==1 %如果随机选择的数j使得parity_check(i,j)==1,则再次随机选择j
j=unidrnd(cols);
end %while
parity_check(i,j)=1; %在找到的新位置上置1
row_flag(i)=row_flag(i)+1; %行重加1
end %for
end %if
if row_flag(i)==1 %假设2':如果该行只有1个1,则随机再添加1个1
j=unidrnd(cols);
while parity_check(i,j)==1 %如果随机选择的数j使得parity_check(i,j)==1,则再次随机选择j
j=unidrnd(cols);
end %while
parity_check(i,j)=1;
row_flag(i)=row_flag(i)+1;
end %if
end %for
%--------------------------------------------------------------------------
%%%%%4.使矩阵parity_check为稀疏矩阵%%%%%
%尝试在列上分散1的位置,使得每行1的个数均衡(相近或相一致)
for i=1:rows %循环i从1行到128行
j=1;
a=randperm(cols); %a为1行256列的随机数,分别为从1到256的随机数
while row_flag(i)>max_ones_per_row; %如果该行行重大于允许的最大行重,则进行处理
if parity_check(i,a(j))==1 %随机选择某一该行上为1的列来处理,将该列该行上的1分散到其他的行
%随机查找该列上适合放置1(行重小于允许的最大行重,且该位置上为0)的行
newrow=unidrnd(rows); %随机生成一个数,该数为从0到rows=128的随机数
k=0;
while (row_flag(newrow)>=max_ones_per_row | parity_check(newrow,a(j))==1) & k<rows
newrow=unidrnd(rows); %若新行中的行重>=6,或者H中的该位置为1,则重新选行,目的是要选择行重小的行
k=k+1;
end %while循环:选择行重小的新行
if parity_check(newrow,a(j))==0 %表示行重小的新行已经找到了
%将待处理行上的1转放到找到的行上,将第i行第j列的1与新行的第j列的0互换位置
parity_check(newrow,a(j))=1;
row_flag(newrow)=row_flag(newrow)+1;
parity_check(i,a(j))=0;
row_flag(i)=row_flag(i)-1;
end %if
end %if test
j=j+1; %??j表示列数,要不要再有一个循环for j=1:cols
if j>cols
break;
end
end %while loop
end %for loop=循环
%--------------------------------------------------------------------------
%%%%%5.消4环%%%%%
%尝试删除4环
for loop=1:10 %循环10次
chkfinish=1;
for r=1:rows %循环r从第1行到第128行
ones_position=find(parity_check(r,:)==1); %每行中1的位置
ones_count=length(ones_position); %每行中1的个数,列重
for i=[1:r-1 r+1:rows] %循环i从第1行到第r-1行,再从第r+1行到第128行,仅仅没有第r行
common=0;
for j=1:ones_count %循环 j从1到每行中1的个数,列重
if parity_check(i,ones_position(j))==1 %第r行第j列有1,那么如果其他行第j列也有1的话
common=common+1;
if common==1
thecol=ones_position(j); %两行中有共同1的列的位置
end%if common
end%if parity_check
if common==2 %表示存在4环
chkfinish=0; %如果还存在4环,则不结束循环,还进入下一次循环
common=common-1;
if (round(rand)==0) % 随机决定是保留前面的列还是后面的列,round(rand)随机生成0或者1
coltoberearranged=thecol; %保留后面的列,交换前面的列
thecol=ones_position(j); %此处的ones_position(j)与common==1时的ones_position(j)不同,这个是在第二个列循环j=1:ones_count时的1的位置
else
coltoberearranged=ones_position(j); %保留前面的列,交换后面的列
end%if(round(rand)==0)
parity_check(i,coltoberearranged)=3; %make this entry 3 so that we don't use of this entry again while getting rid of other cylces
newrow=unidrnd(rows); %随机生成一行定为新的行
iteration=0; %尝试5次在待交换的列中随机查找0
while parity_check(newrow,coltoberearranged)~=0 & iteration<5
newrow=unidrnd(rows);
iteration=iteration+1;
end%while
if iteration>=5 %超过5次后则扩大范围随机查找非1的0或3,直到找到非1为止
while parity_check(newrow,coltoberearranged)==1
newrow=unidrnd(rows);
end%while
end%if
%把该列中找到的0或3置为1???
parity_check(newrow,coltoberearranged)=1;
end%if common==2
end%for j=1:ones_count
end%for i=[1:r-1 r+1:rows]
end%for r=1:rows
%如果本次循环已不存在4环,则结束循环,不进入下一次循环
if chkfinish
break
end
end%for loop=1:10
%--------------------------------------------------------------------------
%replace the 3's with 0's
parity_check=parity_check==1;
%Get the Parity Checks
P=parity_check;
fprintf('LDPC matrix is created.\n');
%--------------------------------------------------------------------------
%%%%%下面的求方差仅用作评估%%%%
%%计算列重
%col_flag(1:cols)=0;
%for j=1:cols
% ind=find(H(:,j)==1);
% col_flag(j)=length(ind);
%end
%%计算行重
%row_flag(1:rows)=0;
%for i=1:rows
% ind=find(H(i,:)==1);
% row_flag(i)=length(ind);
%end
%%每行1的个数的方差
%variance=var(row_flag);
评论1