⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 h2newh.m

📁 此代码是LDPC码进行BP算法的重要参考代码
💻 M
字号:
function [newH,Gp1,rearranged_cols,InvT]=H2newH(H);
%[newH,Gp1,rearranged_cols,InvT]=H2newH(H);
%Change H to below triangle format for quick encoding.
%newH=H(:,rearranged_cols);
%H(:,rearranged_cols)=newH;

%tic

% Set Random number generators initial state
% reset random number generators based on current clock value
rand('state',sum(100*clock));
randn('state',sum(100*clock));

[rows cols]=size(H);

rearranged_cols=[1:cols];

first1(1:cols)=0;
for j=1:cols
   for i=1:rows
      if (H(i,j)==1)
         break;
      end
   end
   first1(j)=i;
end

newH=full(H);

for i=1:rows
   idx=find(first1(i:end)==i);
   if length(idx)==0
      break;
   end
   if idx(1)~=1   %如果不为当前列则需交换列
      %交换first1的两列
      temp=first1(i);
      first1(i)=first1(i+idx(1)-1);
      first1(i+idx(1)-1)=temp;
      %交换rearranged_cols的两列
      temp=rearranged_cols(i);
      rearranged_cols(i)=rearranged_cols(i+idx(1)-1);
      rearranged_cols(i+idx(1)-1)=temp;
      %交换newH的两列
      temp=newH(:,i);
      newH(:,i)=newH(:,i+idx(1)-1);
      newH(:,i+idx(1)-1)=temp;
   end
end

triangle_len=i-1;

temp=first1(1:triangle_len);
first1(1:triangle_len)=first1(cols-triangle_len+1:cols);
first1(cols-triangle_len+1:cols)=temp;

temp=rearranged_cols(1:triangle_len);
rearranged_cols(1:triangle_len)=rearranged_cols(cols-triangle_len+1:cols);
rearranged_cols(cols-triangle_len+1:cols)=temp;

temp=newH(:,1:triangle_len);
newH(:,1:triangle_len)=newH(:,cols-triangle_len+1:cols);
newH(:,cols-triangle_len+1:cols)=temp;

%保证φ = -F·inv(T)·B+D可逆
T=newH(1:triangle_len, cols-triangle_len+1:cols);
InvT=qinv_GF2(T);
F=newH(triangle_len+1:rows, cols-triangle_len+1:cols);
FxInvT=mul_GF2(F, InvT);

Acols=cols-rows;

i=1;
B=newH(1:triangle_len, Acols+1:cols-triangle_len);
D=newH(triangle_len+1:rows, Acols+1:cols-triangle_len);
FxInvTxB_D=add_GF2(mul_GF2(FxInvT, B), D);
[inv_FxInvTxB_D stopcol]=qinv_GF2(FxInvTxB_D);

while stopcol~=0 & i<=Acols
   %交换first1的Acols+stopcol和i列
   temp=first1(Acols+stopcol);
   first1(Acols+stopcol)=first1(i);
   first1(i)=temp;
   %交换rearranged_cols的Acols+stopcol和i列
   temp=rearranged_cols(Acols+stopcol);
   rearranged_cols(Acols+stopcol)=rearranged_cols(i);
   rearranged_cols(i)=temp;
   %交换newH的Acols+stopcol和i列
   temp=newH(:,Acols+stopcol);
   newH(:,Acols+stopcol)=newH(:,i);
   newH(:,i)=temp;

   B=newH(1:triangle_len, Acols+1:cols-triangle_len);
   D=newH(triangle_len+1:rows, Acols+1:cols-triangle_len);
   FxInvTxB_D=add_GF2(mul_GF2(FxInvT, B), D);
   [inv_FxInvTxB_D stopcol]=qinv_GF2(FxInvTxB_D);
   i=i+1;
end

if stopcol~=0 & i>Acols
   error('不能使φ = -F·inv(T)·B+D可逆');
end

A=newH(1:triangle_len, 1:Acols);
C=newH(triangle_len+1:rows, 1:Acols);
FxInvTxA_C=add_GF2(mul_GF2(FxInvT, A), C);

Gp1=mul_GF2(inv_FxInvTxB_D, FxInvTxA_C);

InvT=InvT==1;
InvT=double(InvT);

Gp1=Gp1==1;
Gp1=double(Gp1);

newH=newH==1;
newH=double(newH);
newH=sparse(newH);

%toc

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -