📄 ldpcdecode.m
字号:
% LDPC decoder: The belief propogation.
% Prasanna Sethuraman, March-2004
function [Ld, Lc] = ldpcDecode(y, interleaver, explicitCnDist, explicitVnDist, MAX_ITERATIONS, Lap)
numedges = length(interleaver);
% --------------------------------------------
% Decode message bits with beleif propogation.
% --------------------------------------------
% Assign LLR to variable nodes
[ibitLLR, vbitLLR] = vnd(y, zeros(1,numedges), explicitVnDist);
for iterator = 1:MAX_ITERATIONS
vnToCnMessages(interleaver) = vbitLLR;
[ibitLLR, vbitLLR] = cnd(vnToCnMessages,explicitCnDist);
cnToVnMessages = vbitLLR(interleaver);
[ibitLLR, vbitLLR] = vnd(y, cnToVnMessages, explicitVnDist);
% if length(find(ibitLLR>0))==0
% disp('Codeword found!');
% % break;
% end;
% % Check if generated message is a code word
% oi = find(ibitLLR>=0);
% zi = find(ibitLLR<0);
% xHat(oi)=1;
% xHat(zi)=0;
% s = mod(H*xHat',2);
% if s == zeros(N-L,1);
% break;
% end;
end;
% Assign outputs
Ld = ibitLLR;
Lc = [];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%% CND %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [ibitLLR, vbitLLR] = cnd(vnToCnMessages, explicitCnDist)
LMAX = 200;
index = 0;
M = length(explicitCnDist);
for i=1:M
dc=explicitCnDist(i);
f(1)=vnToCnMessages(index+1);
b(dc)=vnToCnMessages(index+dc);
for j=1:dc-1
f(j+1) = log( 1+exp( f(j)+vnToCnMessages(index+j+1) ) ) - log( exp(f(j)) + exp(vnToCnMessages(index+j+1)) );
b(dc-j) = log( 1+exp( b(dc-j+1)+vnToCnMessages(index+dc-j) ) ) - log( exp(b(dc-j+1)) + exp(vnToCnMessages(index+dc-j)) );
end;
vbitLLR(index+1)=b(2);
vbitLLR(index+dc)=f(dc-1);
for j=2:dc-1
vbitLLR(index+j)=log( 1+exp( f(j-1)+b(j+1) ) ) - log( exp(f(j-1)) + exp(b(j+1)) );
end;
index = index + dc;
end;
ibitLLR = [];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%% VND %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [ibitLLR, vbitLLR] = vnd(y, cnToVnMessages, explicitVnDist)
LMAX = 200;
index = 0;
N = length(y);
for i=1:N
ibitLLR(i)=y(i);
for j=1:explicitVnDist(i)
ibitLLR(i) = ibitLLR(i) + cnToVnMessages(index+j);
if ibitLLR(i) > LMAX
ibitLLR(i)=LMAX;
elseif ibitLLR(i) < -LMAX
ibitLLR(i)=-LMAX;
end;
end;
for j=1:explicitVnDist(i)
vbitLLR(index+j)=ibitLLR(i)-cnToVnMessages(index+j);
if ibitLLR(i) > LMAX
ibitLLR(i)=LMAX;
elseif ibitLLR(i) < -LMAX
ibitLLR(i)=-LMAX;
end;
end;
index = index + explicitVnDist(i);
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -