clear;clc;%输入编码参数,m:校验节点数目,n:变量节点数目(注意码率R不一定为1/2)%构造任意码率的LDPC校验矩阵m=input('Thenumberofchecknodes:');n=input('Thenumberofvariablenodes:');h=zeros(m,n);%将边的度转化为变量节点的度%给定变量节点度分布序列dv=0.38354*x+0.04237*x^2+0.57409*x^3A=[7,0,0,0,0,0,02,3,6,7,20,21,220.1989,0.2305,0.0068,0.2774,0.14267,0.1335,0.01020,0,0,0,0,0,0];total=0;forj=1:A(1,1)total=total+A(3,j)/A(2,j);endfori=1:A(1,1)A(4,i)=round(n*(A(3,i)/A(2,i)/total));enda=A(4,:);total1=0;%计算dsfori=1:A(1,1)total1=total1+a(i);ds(total1-a(i)+1:total1)=A(2,i);end%这里不考虑校验节点的度分布序列,构造新Tanner图时,均为0dc=zeros(1,m);%下面展开PEG算法,将每一个变量节点展成l层子图,构造Tanner图forj=1:n%对于每一个变量节点循环fork=1:ds(j)%对于度分布循环,控制边的数目ifk==1%若为第一条边,直接寻找最小度分布的校验节点k1=find(dc==min(dc));h(k1(1),j)=1;dc(k1(1))=dc(k1(1))+1;else%若不是第一条边,则展成l层子图,寻找在l层最小度分布的校验节点flag=1;l=1;%这里对每一个校验节点是否存在于第l层做标记,最大展开层数待定dcf=zeros(1000,m);row=find(h(:,j));%列搜索,搜索为1的行标dcf(l,row)=1;%展开第一层while(flag)l=l+1;h_row=h(row,:);iflength(row)==1col=find(h_row);elsecol=find(any(h_row(:,1:n)));%行搜索,寻找为1的列标endh_col=(h(:,col))';iflength(col)==1row1=find(h_col);elserow1=find(any(h_col(:,1:m)));endrow=row1;dcf(l,row)=1;ifl=2%停止展开第一种条件:集合元素停止增长ifdcf(l,:)==dcf(l-1,:)nc_all=find(dcf(l,:)==0);ndc=dc(nc_all);nc=find(ndc==min(ndc));h(nc_all(nc(1)),j)=1;dc(nc_all(nc(1)))=dc(nc_all(nc(1)))+1;break;%停止展开第二种情况:集合元素饱和elseif(sum(dcf(l-1,:))m)&&(sum(dcf(l,:))==m)nc1_all=find((dcf(l-1,:)&dcf(l,:))==0);ndc1=dc(nc1_all);nc1=find(ndc1==min(ndc1));h(nc1_all(nc1(1)),j)=1;dc(nc1_all(nc1(1)))=dc(nc1_all(nc1(1)))+1;break;endendendendendend