%本实验产生编码,基于同文件夹下的H矩阵生成程序
%在进行矩阵的运算中,需要进行模2处理,才能得到正确的校验向量
function QCCode=QCEncode(InputB,qcH,Hb)
[qcH,Hb]=QCLDPCBaseH(576,0.5); %调用生成的校验矩阵函数
[mb,nb]=size(Hb); %令mb=mb,nb=nb
[rqc,cqc]=size(qcH); %令rqc=nb*z,cqc=mb*z
kb=nb-mb;
z=cqc/nb;
CheckB=zeros(mb*z,1); %校验位比特(即校验位向量P的转置矩阵)
%下面随机一个1*(z*kb)的矩阵,元素为0,1任意,即代表输入的信息位向量s
%(因为*z了,正常的话要进行编码的是randi([0,1],1,kb),这里将其扩展成了信息向量)!!!randint函数不管用
InputB=randi([0 1],1,kb*z);
%下面这个是Hb2中hb的h(1),h(r),h(mb),这三个方阵的和,在0.5速率的基校验矩阵里
%h(1)=7,h(r)=h(6)=0,h(mb)=h(12)=7,这里都要用z*z矩阵替换后的方阵相加
ZhInverse=qcH(1:z,z*kb+1:z*kb+z)+qcH(z*5+1:z*5+z,z*kb+1:z*kb+z)+qcH(z*(mb-1)+1:z*mb,z*kb+1:z*kb+z);
%因为hb2中hb的两个方阵相同,在它们都用z*z矩阵替换后(0的z*z替换矩阵认为全零矩阵)
%相加后模2运算为单位矩阵,再求逆矩阵,仍为单位矩阵
ZhInverse=mod(ZhInverse,2);
%根据IEEE 802.16e标准的快速迭代编码算法,求出各个校验位向量,编出的码字c=[s p]
%首先求p1
ZSum=zeros(z,1);
for j=1:kb
ZMid=zeros(z,1);
ZHb=zeros(z);
for i=1:mb
if Hb(i,j)>=0
Zhb=qcH(z*(i-1)+1:z*i,z*(j-1)+1:z*j); %这个就是Zb1(i,j)
ZMid=ZMid+ZHb*InputB(z*(j-1)+1:z*j)'; %仔细看公式,这里对s向量进行了转置,变为列向量
end
end
ZSum=ZMid+ZSum;
end
%对所得的结果进行模2运算
ZSum=mod(ZSum,2);
CheckB(1:z,1)=mod(ZhInverse*ZSum,2); %这个即为p1(看公式推导)
%求p2
ZSum2=zeros(z,1);
for k=1:kb
if Hb(1,k)>0
ZSum2=ZSum2+qcH(1:z,z*(k-1)+1:z*k)*InputB(1,z*(k-1)+1:z*k)'; %这个在公式推导说了带入第一式,即行数为1,以此类推
end
end
CheckB(z+1:2*z,1)=mod(ZSum2+qcH(1:z,z*kb+1:z*(kb+1))*CheckB(1:z,1),2); %这个即为p2
%求pi
for m=3:mb
ZSumR=zeros(z,1);
if m~=7
for k=1:kb
if Hb(m-1,k)>=0
ZSumR=ZSumR+qcH(z*(m-2)+1:z*(m-1),z*(k-1)+1:z*k)*InputB(1,z*(k-1)+1:z*k)';
end
end
CheckB(z*(m-1)+1:z*m,1)=CheckB(z*(m-2)+1:z*(m-1),1)+ZSumR; %公式pi=p(i-1)+...
%r+1位置的p
else
for k=1:kb
if Hb(m-1,k)>=0
ZSumR=ZSumR+qcH(z*(m-2)+1:z*(m-1),z*(k-1)+1:z*k)*InputB(1,z*(k-1)+1:z*k)'; %千万不要忘写 ' ,此为转置
end
end
CheckB(6*z+1:7*z,1)=CheckB(5*z+1:6*z,1)+ZSumR+qcH(5*z+1:6*z,z*kb+1:z*(kb+1))*CheckB(1:z,1);
end
end
CheckB=mod(CheckB,2);
%CheckB为列向量,需要进行转置
QCCode=horzcat(InputB,CheckB');