www.gusucode.com > ldpc译码算法,码长960,码率0.5,完全模拟fpga硬件实现语言,量化处理源码程序 > DecodeLDPC.m

    function[msgdec,iter]=DecodeLDPC(lv)
lcr1=zeros(1,280);
lcr2=zeros(1,280);
lcr3=zeros(1,280);
lcr4=zeros(1,280);
lcr5=zeros(1,280);
lcr6=zeros(1,280);
lcr7=zeros(1,280);
lcr8=zeros(1,280);
lcr9=zeros(1,280);
lcr10=zeros(1,280);
lcr11=zeros(1,280);
lcr12=zeros(1,280);
sign1=zeros(1,280);   
sign2=zeros(1,280);   
sign3=zeros(1,280);   
sign4=zeros(1,280);   
sign5=zeros(1,280);   
sign6=zeros(1,280);   
sign7=zeros(1,280);   
sign8=zeros(1,280);   
sign9=zeros(1,280);   
sign10=zeros(1,280);  
sign11=zeros(1,280);  
sign12=zeros(1,280);  

for k=1:30
    dec=zeros(1,960);
    ssign=0;
offset41=25;                                                                                                                                                               
offset91=5;                                                                                                                                                                
offset121=17;  
for i1=1:40
    a1=40-offset41+i1;
    b1=40-offset91+i1;
    c1=40-offset121+i1;
    if(a1>40)
        addra41=i1-offset41;
    else addra41=a1;
    end
    if(b1>40)
        addra91=i1-offset91;
    else addra91=b1;
    end
    if(c1>40)
        addra121=i1-offset121;
    else addra121=c1;
    end
    [lqr1,lqr2,lqr3,sign]=thresh_hold1(lv(i1),lcr4(addra41),lcr9(addra91),lcr12(addra121));
    lcr4(addra41)=lqr1;
    lcr9(addra91)=lqr2;
    lcr12(addra121)=lqr3; 
    sign4(addra41)=sign;
    sign9(addra91)=sign;
    sign12(addra121)=sign;
    dec(i1)=sign;
end
offset11=39;
offset21=11;
offset81=4; 
for i1=1:40
    a1=40-offset11+i1;
    b1=40-offset21+i1;
    c1=40-offset81+i1;
    if(a1>40)
        addra11=i1-offset11;
    else addra11=a1;
    end
    if(b1>40)
        addra21=i1-offset21;
    else addra21=b1;
    end
    if(c1>40)
        addra81=i1-offset81;
    else addra81=c1;
    end
    [lqr1,lqr2,lqr3,sign]=thresh_hold1(lv(i1+40),lcr1(addra11),lcr2(addra21),lcr8(addra81));
    lcr1(addra11)=lqr1;
    lcr2(addra21)=lqr2;
    lcr8(addra81)=lqr3; 
    sign1(addra11)=sign;
    sign2(addra21)=sign;
    sign8(addra81)=sign;
    dec(i1+40)=sign;
end
offset12=30;
offset42=19;
offset51=16;
offset71=39;
offset82=30;
offset111=2;
for i1=1:40
    a=40-offset12+i1;
    b=40-offset42+i1;
    c=40-offset51+i1;
    d=40-offset71+i1;
    e=40-offset82+i1;
    f=40-offset111+i1;
    if(a>40)
        addra12=40+i1-offset12;
    else addra12=40+a;
    end
    if(b>40)
        addra42=40+i1-offset42;
    else addra42=40+b;
    end
    if(c>40)
        addra51=i1-offset51;
    else addra51=c;
    end
    if(d>40)
        addra71=i1-offset71;
    else addra71=d;
    end
    if(e>40)
        addra82=40+i1-offset82;
    else addra82=40+e;
    end
    if(f>40)
        addra111=i1-offset111;
    else addra111=f;
    end 
 
    [lqr1,lqr2,lqr3,lqr4,lqr5,lqr6,sign]=thresh_hold2(lv(i1+80),lcr1(addra12),lcr4(addra42),lcr5(addra51),lcr7(addra71),lcr8(addra82),lcr11(addra111));
    lcr1(addra12)=lqr1;
    lcr4(addra42)=lqr2;
    lcr5(addra51)=lqr3; 
    lcr7(addra71)=lqr4;
    lcr8(addra82)=lqr5;
    lcr11(addra111)=lqr6; 
    sign1(addra12)=sign;
    sign4(addra42)=sign;
    sign5(addra51)=sign;
    sign7(addra71)=sign;
    sign8(addra82)=sign;
    sign11(addra111)=sign;
    dec(i1+80)=sign;
end

offset31=10;  
offset72=22;  
offset112=27; 
for i1=1:40
    a1=40-offset31+i1;
    b1=40-offset72+i1;
    c1=40-offset112+i1;
    if(a1>40)
        addra31=i1-offset31;
    else addra31=a1;
    end
    if(b1>40)
        addra72=40+i1-offset72;
    else addra72=40+b1;
    end
    if(c1>40)
        addra112=40+i1-offset112;
    else addra112=40+c1;
    end
    [lqr1,lqr2,lqr3,sign]=thresh_hold1(lv(i1+120),lcr3(addra31),lcr7(addra72),lcr11(addra112));
    lcr3(addra31)=lqr1;
    lcr7(addra72)=lqr2;
    lcr11(addra112)=lqr3; 
    sign3(addra31)=sign;
    sign7(addra72)=sign;
    sign11(addra112)=sign;
    dec(i1+120)=sign;
end
offset32=9;  
offset61=19; 
offset92=34;
for i1=1:40
    a1=40-offset32+i1;
    b1=40-offset61+i1;
    c1=40-offset92+i1;
    if(a1>40)
        addra1=40+i1-offset32;
    else addra1=40+a1;
    end
    if(b1>40)
        addra2=i1-offset61;
    else addra2=b1;
    end
    if(c1>40)
        addra3=40+i1-offset92;
    else addra3=40+c1;
    end
    [lqr1,lqr2,lqr3,sign]=thresh_hold1(lv(i1+160),lcr3(addra1),lcr6(addra2),lcr9(addra3));
    lcr3(addra1)=lqr1;
    lcr6(addra2)=lqr2;
    lcr9(addra3)=lqr3; 
    sign3(addra1)=sign;
    sign6(addra2)=sign;
    sign9(addra3)=sign;
    dec(i1+160)=sign;
end
offset22=9;    
offset33=33;   
offset62=16;   
offset93=10;   
offset101=39;  
offset122=27;  
for i1=1:40
    a=40-offset22+i1;
    b=40-offset33+i1;
    c=40-offset62+i1;
    d=40-offset93+i1;
    e=40-offset101+i1;
    f=40-offset122+i1;
    if(a>40)
        addra1=40+i1-offset22;
    else addra1=40+a;
    end
    if(b>40)
        addra2=80+i1-offset33;
    else addra2=80+b;
    end
    if(c>40)
        addra3=40+i1-offset62;
    else addra3=40+c;
    end
    if(d>40)
        addra4=80+i1-offset93;
    else addra4=80+d;
    end
    if(e>40)
        addra5=i1-offset101;
    else addra5=e;
    end
    if(f>40)
        addra6=40+i1-offset122;
    else addra6=40+f;
    end 
 
    [lqr1,lqr2,lqr3,lqr4,lqr5,lqr6,sign]=thresh_hold2(lv(i1+200),lcr2(addra1),lcr3(addra2),lcr6(addra3),lcr9(addra4),lcr10(addra5),lcr12(addra6));
    lcr2(addra1)=lqr1;
    lcr3(addra2)=lqr2;
    lcr6(addra3)=lqr3; 
    lcr9(addra4)=lqr4;
    lcr10(addra5)=lqr5;
    lcr12(addra6)=lqr6; 
    sign2(addra1)=sign;
    sign3(addra2)=sign;
    sign6(addra3)=sign;
    sign9(addra4)=sign;
    sign10(addra5)=sign;
    sign12(addra6)=sign;
    dec(i1+200)=sign;
end
offset23=32;
offset52=35;
offset83=0; 
for i1=1:40
    a1=40-offset23+i1;
    b1=40-offset52+i1;
    c1=40-offset83+i1;
    if(a1>40)
        addra1=80+i1-offset23;
    else addra1=80+a1;
    end
    if(b1>40)
        addra2=40+i1-offset52;
    else addra2=40+b1;
    end
    if(c1>40)
        addra3=80+i1-offset83;
    else addra3=80+c1;
    end
    [lqr1,lqr2,lqr3,sign]=thresh_hold1(lv(i1+240),lcr2(addra1),lcr5(addra2),lcr8(addra3));
    lcr2(addra1)=lqr1;
    lcr5(addra2)=lqr2;
    lcr8(addra3)=lqr3; 
    sign2(addra1)=sign;
    sign5(addra2)=sign;
    sign8(addra3)=sign;
    dec(i1+240)=sign;
end
offset24=3;   
offset34=13;  
offset63=34;  
offset94=17;  
offset102=24; 
offset123=17; 
for i1=1:40
    a=40-offset24+i1;
    b=40-offset34+i1;
    c=40-offset63+i1;
    d=40-offset94+i1;
    e=40-offset102+i1;
    f=40-offset123+i1;
    if(a>40)
        addra1=120+i1-offset24;
    else addra1=120+a;
    end
    if(b>40)
        addra2=120+i1-offset34;
    else addra2=120+b;
    end
    if(c>40)
        addra3=80+i1-offset63;
    else addra3=80+c;
    end
    if(d>40)
        addra4=120+i1-offset94;
    else addra4=120+d;
    end
    if(e>40)
        addra5=40+i1-offset102;
    else addra5=40+e;
    end
    if(f>40)
        addra6=80+i1-offset123;
    else addra6=80+f;
    end 
 
    [lqr1,lqr2,lqr3,lqr4,lqr5,lqr6,sign]=thresh_hold2(lv(i1+280),lcr2(addra1),lcr3(addra2),lcr6(addra3),lcr9(addra4),lcr10(addra5),lcr12(addra6));
    lcr2(addra1)=lqr1;
    lcr3(addra2)=lqr2;
    lcr6(addra3)=lqr3; 
    lcr9(addra4)=lqr4;
    lcr10(addra5)=lqr5;
    lcr12(addra6)=lqr6; 
    sign2(addra1)=sign;
    sign3(addra2)=sign;
    sign6(addra3)=sign;
    sign9(addra4)=sign;
    sign10(addra5)=sign;
    sign12(addra6)=sign;
    dec(i1+280)=sign;
end
offset13=22;  
offset43=27;  
offset113=16; 
for i1=1:40
    a1=40-offset13+i1;
    b1=40-offset43+i1;
    c1=40-offset113+i1;
    if(a1>40)
        addra1=80+i1-offset13;
    else addra1=80+a1;
    end
    if(b1>40)
        addra2=80+i1-offset43;
    else addra2=80+b1;
    end
    if(c1>40)
        addra3=80+i1-offset113;
    else addra3=80+c1;
    end
    [lqr1,lqr2,lqr3,sign]=thresh_hold1(lv(i1+320),lcr1(addra1),lcr4(addra2),lcr11(addra3));
    lcr1(addra1)=lqr1;
    lcr4(addra2)=lqr2;
    lcr11(addra3)=lqr3; 
    sign1(addra1)=sign;
    sign4(addra2)=sign;
    sign11(addra3)=sign;
    dec(i1+320)=sign;
end
offset14=34;   
offset44=10;   
offset53=17;   
offset73=5;    
offset84=19;   
offset114=20;  
for i1=1:40
    a=40-offset14+i1;
    b=40-offset44+i1;
    c=40-offset53+i1;
    d=40-offset73+i1;
    e=40-offset84+i1;
    f=40-offset114+i1;
    if(a>40)
        addra1=120+i1-offset14;
    else addra1=120+a;
    end
    if(b>40)
        addra2=120+i1-offset44;
    else addra2=120+b;
    end
    if(c>40)
        addra3=80+i1-offset53;
    else addra3=80+c;
    end
    if(d>40)
        addra4=80+i1-offset73;
    else addra4=80+d;
    end
    if(e>40)
        addra5=120+i1-offset84;
    else addra5=120+e;
    end
    if(f>40)
        addra6=120+i1-offset114;
    else addra6=120+f;
    end 
 
    [lqr1,lqr2,lqr3,lqr4,lqr5,lqr6,sign]=thresh_hold2(lv(i1+360),lcr1(addra1),lcr4(addra2),lcr5(addra3),lcr7(addra4),lcr8(addra5),lcr11(addra6));
    lcr1(addra1)=lqr1;
    lcr4(addra2)=lqr2;
    lcr5(addra3)=lqr3; 
    lcr7(addra4)=lqr4;
    lcr8(addra5)=lqr5;
    lcr11(addra6)=lqr6; 
    sign1(addra1)=sign;
    sign4(addra2)=sign;
    sign5(addra3)=sign;
    sign7(addra4)=sign;
    sign8(addra5)=sign;
    sign11(addra6)=sign;
    dec(i1+360)=sign;
end              
offset54=30;   
offset74=7;    
offset103=29;  
for i1=1:40
    a1=40-offset54+i1;
    b1=40-offset74+i1;
    c1=40-offset103+i1;
    if(a1>40)
        addra1=120+i1-offset54;
    else addra1=120+a1;
    end
    if(b1>40)
        addra2=120+i1-offset74;
    else addra2=120+b1;
    end
    if(c1>40)
        addra3=80+i1-offset103;
    else addra3=80+c1;
    end
    [lqr1,lqr2,lqr3,sign]=thresh_hold1(lv(i1+400),lcr5(addra1),lcr7(addra2),lcr10(addra3));
    lcr5(addra1)=lqr1;
    lcr7(addra2)=lqr2;
    lcr10(addra3)=lqr3; 
    sign5(addra1)=sign;
    sign7(addra2)=sign;
    sign10(addra3)=sign;
    dec(i1+400)=sign;
end
offset25=5;   
offset35=0;   
offset64=32;  
offset95=21;  
offset104=30; 
offset124=10; 
for i1=1:40
    a=40-offset25+i1;
    b=40-offset35+i1;
    c=40-offset64+i1;
    d=40-offset95+i1;
    e=40-offset104+i1;
    f=40-offset124+i1;
    if(a>40)
        addra1=160+i1-offset25;
    else addra1=160+a;
    end
    if(b>40)
        addra2=160+i1-offset35;
    else addra2=160+b;
    end
    if(c>40)
        addra3=120+i1-offset64;
    else addra3=120+c;
    end
    if(d>40)
        addra4=160+i1-offset95;
    else addra4=160+d;
    end
    if(e>40)
        addra5=120+i1-offset104;
    else addra5=120+e;
    end
    if(f>40)
        addra6=120+i1-offset124;
    else addra6=120+f;
    end 
 
    [lqr1,lqr2,lqr3,lqr4,lqr5,lqr6,sign]=thresh_hold2(lv(i1+440),lcr2(addra1),lcr3(addra2),lcr6(addra3),lcr9(addra4),lcr10(addra5),lcr12(addra6));
    lcr2(addra1)=lqr1;
    lcr3(addra2)=lqr2;
    lcr6(addra3)=lqr3; 
    lcr9(addra4)=lqr4;
    lcr10(addra5)=lqr5;
    lcr12(addra6)=lqr6; 
    sign2(addra1)=sign;
    sign3(addra2)=sign;
    sign6(addra3)=sign;
    sign9(addra4)=sign;
    sign10(addra5)=sign;
    sign12(addra6)=sign;
    dec(i1+440)=sign;
end
offset15=2; 
offset65=0; 
offset125=2;
for i1=1:40
    a1=40-offset15+i1;
    b1=40-offset65+i1;
    c1=40-offset125+i1;
    if(a1>40)
        addra1=160+i1-offset15;
    else addra1=160+a1;
    end
    if(b1>40)
        addra2=160+i1-offset65;
    else addra2=160+b1;
    end
    if(c1>40)
        addra3=160+i1-offset125;
    else addra3=160+c1;
    end
    [lqr1,lqr2,lqr3,sign]=thresh_hold1(lv(i1+480),lcr1(addra1),lcr6(addra2),lcr12(addra3));
    lcr1(addra1)=lqr1;
    lcr6(addra2)=lqr2;
    lcr12(addra3)=lqr3; 
    sign1(addra1)=sign;
    sign6(addra2)=sign;
    sign12(addra3)=sign;
    dec(i1+480)=sign;
end
for i1=1:40
    addra1=520+i1;
    b=200+i1;
    c=200+i1;
    [lqr1,lqr2,sign]=thresh_hold3(lv(addra1),lcr1(b),lcr2(c));
    lcr1(b)=lqr1;
    lcr2(c)=lqr2;
    sign1(b)=sign;
    sign2(c)=sign;
    dec(addra1)=sign;
end
for i1=1:40
    addra1=560+i1;
    b=240+i1;
    c=200+i1;
    [lqr1,lqr2,sign]=thresh_hold3(lv(addra1),lcr2(b),lcr3(c));
    lcr2(b)=lqr1;
    lcr3(c)=lqr2;
    sign2(b)=sign;
    sign3(c)=sign;
     dec(addra1)=sign;
end
for i1=1:40
    addra1=600+i1;
    b=240+i1;
    c=160+i1;
    [lqr1,lqr2,sign]=thresh_hold3(lv(addra1),lcr3(b),lcr4(c));
    lcr3(b)=lqr1;
    lcr4(c)=lqr2;
    sign3(b)=sign;
    sign4(c)=sign;
     dec(addra1)=sign;
end
for i1=1:40
    addra1=640+i1;
    b=200+i1;
    c=160+i1;
    [lqr1,lqr2,sign]=thresh_hold3(lv(addra1),lcr4(b),lcr5(c));
    lcr4(b)=lqr1;
    lcr5(c)=lqr2;
    sign4(b)=sign;
    sign5(c)=sign;
     dec(addra1)=sign;
end
for i1=1:40
    addra1=680+i1;
    b=200+i1;
    c=200+i1;
    [lqr1,lqr2,sign]=thresh_hold3(lv(addra1),lcr5(b),lcr6(c));
    lcr5(b)=lqr1;
    lcr6(c)=lqr2;
    sign5(b)=sign;
    sign6(c)=sign;
     dec(addra1)=sign;
end
for i1=1:40
    addra1=720+i1;
    b=240+i1;
    c=160+i1;
    [lqr1,lqr2,sign]=thresh_hold3(lv(addra1),lcr6(b),lcr7(c));
    lcr6(b)=lqr1;
    lcr7(c)=lqr2;
    sign6(b)=sign;
    sign7(c)=sign;
     dec(addra1)=sign;
end
for i1=1:40
    addra1=760+i1;
    b=200+i1;
    c=160+i1;
    [lqr1,lqr2,sign]=thresh_hold3(lv(addra1),lcr7(b),lcr8(c));
    lcr7(b)=lqr1;
    lcr8(c)=lqr2;
    sign7(b)=sign;
    sign8(c)=sign;
     dec(addra1)=sign;
end
for i1=1:40
    addra1=800+i1;
    b=200+i1;
    c=200+i1;
    [lqr1,lqr2,sign]=thresh_hold3(lv(addra1),lcr8(b),lcr9(c));
    lcr8(b)=lqr1;
    lcr9(c)=lqr2;
    sign8(b)=sign;
    sign9(c)=sign;
     dec(addra1)=sign;
end
for i1=1:40
    addra1=840+i1;
    b=240+i1;
    c=160+i1;
    [lqr1,lqr2,sign]=thresh_hold3(lv(addra1),lcr9(b),lcr10(c));
    lcr9(b)=lqr1;
    lcr10(c)=lqr2;
    sign9(b)=sign;
    sign10(c)=sign;
     dec(addra1)=sign;
end
for i1=1:40
    addra1=880+i1;
    b=200+i1;
    c=160+i1;
    [lqr1,lqr2,sign]=thresh_hold3(lv(addra1),lcr10(b),lcr11(c));
    lcr10(b)=lqr1;
    lcr11(c)=lqr2;
    sign10(b)=sign;
    sign11(c)=sign;
     dec(addra1)=sign;
end
for i1=1:40
    addra1=920+i1;
    b=200+i1;
    c=200+i1;
    [lqr1,lqr2,sign]=thresh_hold3(lv(addra1),lcr11(b),lcr12(c));
    lcr11(b)=lqr1;
    lcr12(c)=lqr2;
    sign11(b)=sign;
    sign12(c)=sign;
     dec(addra1)=sign;
end
[lcr1,ssign1]=check_update(sign1,lcr1,6);
[lcr2,ssign2]=check_update(sign2,lcr2,7);
[lcr3,ssign3]=check_update(sign3,lcr3,7);
[lcr4,ssign4]=check_update(sign4,lcr4,6);
[lcr5,ssign5]=check_update(sign5,lcr5,6);
[lcr6,ssign6]=check_update(sign6,lcr6,7);
[lcr7,ssign7]=check_update(sign7,lcr7,6);
[lcr8,ssign8]=check_update(sign8,lcr8,6);
[lcr9,ssign9]=check_update(sign9,lcr9,7);
[lcr10,ssign10]=check_update(sign10,lcr10,6);
[lcr11,ssign11]=check_update(sign11,lcr11,6);
[lcr12,ssign12]=check_update(sign12,lcr12,6);
ssign=ssign1+ssign2+ssign3+ssign4+ssign5+ssign6+ssign7+ssign8+ssign9+ssign10+ssign11+ssign12;
iter=k;
msgdec=dec;
% if(ssign==0)
%     break;
% end

end