www.pudn.com > ldpc802.16.rar > logdecoder.m, change:2005-09-28,size:3673b


function decoded=logdecoder(received,sigma2,maxiter) 
%Log-Domain SPA Decoder 
 
global H; 
% H=full(H); 
 
[M,N]=size(H); 
L=zeros(1,N); 
L=2.*received./sigma2; 
Lq=H; 
Lr=H; 
for i=1:N 
    Lq(:,i)=Lq(:,i).*L(i); 
end 
for iter=1:maxiter 
    for j=1:M 
        bit=find(H(j,:)~=0);         
        for i=1:length(bit) 
            tem=bit(find(bit~=bit(i))); 
            alfa=prod(sign(Lq(j,tem)));   
            beta=fai(sum(fai(abs(Lq(j,tem)))));             %  beta=-log(tanh(sum(-log(tanh(abs(Lq(j,tem))./2)))/2)); 
            Lr(j,bit(i))=alfa*beta;             
        end         
    end 
    LQ=L; 
    for i=1:N 
        check=find(H(:,i)~=0); 
        LQ(i)=LQ(i)+sum(Lr(check,i)); 
    end 
    decoded=zeros(1,N); 
    for i=1:N 
        if LQ(i)<0 
            decoded(i)=1; 
        end 
    end 
    if mod(H*decoded',2)==zeros(M,1) 
        break; 
    end 
    for i=1:N 
        check=find(H(:,i)==1); 
        for j=1:length(check) 
            tem=check(find(check~=check(j))); 
            Lq(check(j),i)=L(i)+sum(Lr(check,i)); 
        end 
    end 
end 
 
 
% global H; 
% % load H1000; 
% [M,N]=size(H); 
%  
% if sigma2<0.00001 
%     receivetem=received; 
%     for i=1:N 
%         if receivetem(i)>0 
%             receivetem(i)=1; 
%         else receivetem(i)=0; 
%         end 
%     end 
%     check=H*receivetem'; 
%     biaozhi=0; 
%     for i=1:M 
%         if mod(check(i,1),2)==1 
%             biaozhi=1; 
%             i=M; 
%         end 
%     end 
%     if biaozhi==0 
%         decoded=receivetem; 
%         return; 
%     end 
% end 
%  
% maxiter=10; 
%  
% %M=6; 
% %N=12; 
% %J=3; 
% %K=6; 
% J=sum(H); 
% K=sum(H'); 
%  
% Lc=zeros(1,N); 
% for i=1:N 
%     if sigma2<0.005 
%         Lc(1,i)=2*received(1,i)/0.005; 
%     else Lc(1,i)=2*received(1,i)/sigma2; 
%     end 
% end 
%  
% Lq=zeros(M,N); 
% Lr=zeros(M,N); 
% alfa=zeros(M,N); 
% beita=zeros(M,N); 
% Lq=sparse(Lq); 
% Lr=sparse(Lr); 
% alfa=sparse(alfa); 
% beita=sparse(beita); 
%  
% for i=1:N 
%     for j=1:J(i) 
%         Lq(ncol(j,i),i)=Lc(1,i); 
%         alfa(ncol(j,i),i)=sign(Lq(ncol(j,i),i)); 
%         beita(ncol(j,i),i)=abs(Lq(ncol(j,i),i)); 
%     end 
% end 
%  
% for iter=1:maxiter 
%     for i=1:M 
%         for j=1:K(i) 
%             delta2=0; 
%             delta1=1; 
%             for l=1:K(i) 
%                 if nrow(l,i)~=nrow(j,i) 
%                     delta1=delta1*alfa(i,nrow(l,i)); 
%                     delta2=delta2+fai(beita(i,nrow(l,i))); 
%                 end 
%             end 
%             Lr(i,nrow(j,i))=delta1*fai(delta2); 
%         end 
%     end 
%      LQ=zeros(1,N); 
%      
%     for i=1:N 
%         LQ(1,i)=Lc(1,i); 
%         for j=1:J(i) 
%             LQ(1,i)=LQ(1,i)+Lr(ncol(j,i),i); 
%         end 
%     end 
%      
%     decoded=zeros(1,N); 
%     for i=1:N 
%         if LQ(1,i)<0 
%             decoded(1,i)=1; 
%         end 
%     end 
%      
%     check=H*decoded'; 
%     biaozhi=0; 
%      
%     for i=1:M 
%         if mod(check(i,1),2)==1 
%             biaozhi=1; 
%             break; 
%         end 
%     end 
%      
%     if biaozhi==0 
%         break; 
%     end 
%     
%     for i=1:N 
%         for j=1:J(i) 
%             Lq(ncol(j,i),i)=Lc(1,i); 
%             for l=1:J(i) 
%                 if ncol(l,i)~=ncol(j,i) 
%                     Lq(ncol(j,i),i)=Lq(ncol(j,i),i)+Lr(ncol(l,i),i); 
%                 end 
%             end 
%         end 
%     end 
%      
%     for i=1:N 
%         for j=1:J(i) 
%             alfa(ncol(j,i),i)=sign(Lq(ncol(j,i),i)); 
%             beita(ncol(j,i),i)=abs(Lq(ncol(j,i),i)); 
%         end 
%     end 
%      
% end