通过对EMS算法的详细分析可以发现,消息向量之间的运算只保存部分最大值运算结果,而且运算过程中只需要根据数值之间大小比较的结果做出判决。决定译码结果的是消息向量中数值之间的相对大小,消息向量中单个值的大小并不影响译码结果。初始消息也一样,即[L[0],......,L[q-1]]与[L[0]-M,......,L[q-1]-M]作为初始消息向量是等效的。
EMS算法步骤:
1.初始化分为3步 a. 根据接收消息计算消息向量的LLR向量L[k],k={0.q-1}。 b. 对向量L进行排序,按降序排列为Ls。c. 对Ls向量整体减去Ls[0],排序后Ls[0]为向量中的最大值。Ls都减去Ls[0]后,初始值向量中除了Ls[0]=0外其余取值均为负值。 注意:在排序的过程中,向量中每一个分量对应的与元素,即索引值,要根据排序过程做出相应位置的改变。
2. 置换步骤 U[a]=U[j],其中a=h*j,其中h是校验方程中矩阵H对应位置的取值。h为非零元素。
校验节点更新采用前向-后向过程。EMS译码算法中变量节点和校验节点的更新都采用前向-后向运算过程,只是他们的单步运算实现过程不同。
3. 校验节点更新 校验节点的更新实际上是一个搜索最大值的过程。设向量A和B为单步运算的两个输入消息变量,其值按降序排列。AB为运算结果,相对应的与元素分别为Aq,Bq, ABq。单步运算的结果为:AB[i]=max(A[p]+B(j))。输出结果向量AB为降序排列,且ABq中的域元素各不相同。具体的排序算法如下:
function [U,Uq]=check_order(V,I,Vq,Iq)
% clear
% clc
% load V
% load Vq
% load I
% load Iq
q=8;
Nm=q/2;
Uq(1:Nm)=-1;
U=zeros(1,Nm);
% 多进制处理
P=2;M=log2(q);
field = gftuple((-1:P^M-2)',M,P);%产生00,10,01,11,左比特表示低位,右比特表示高位
[tuple power] = gftuple((-1:P^M-2)',M,P);% tuple即field,power是0-3的指数形式的指数
alpha = tuple*2.^(0:M-1)';%转化为十进制数,即0-3
beta(alpha + 1) = 0:P^M-1;
Vq_z=power(beta(Vq+1)+1);
Iq_z=power(beta(Iq+1)+1);
M=V+I(1);
i=0;
k=ones(Nm,1);
while(i~=Nm)
[x y]=max(M);
uu_z=gfadd(Vq_z(y),Iq_z(k(y)),field);
if uu_z== -Inf
uu= 0;
else
uu= alpha(uu_z + 2); % 十进制
end
if isempty(find(Uq==uu,1))
i=i+1;
U(i)=x;
Uq(i)=uu;
end
if i~=Nm
k(y)=k(y)+1;
M(y)=V(y)+I(k(y));
end
end
end
Boutillon与 2010年针对校验节点基本步骤提出了一种检泡算法 (bubble check, BC),改算法有效地减少了上述排序过程的复杂度。Simplified check node processing in nonbinary LDPC decoders; proceedings of the Turbo Codes and Iterative Information Processing (ISTC), 2010 6th International Symposium on, F, 2010 [C]. IEEE.
4. 逆置换步骤 跟步骤2相对应u(a)=u(i),其中a=i/h 这里的乘法、除法运算都是在伽罗华域上进行的。
5. 变量节点更新 采用前向-后向运算,这里只说明单步运算过程。输入消息为A和B,对应的与元素为Aq和Bq。输出消息为T,对应的域元素为Tq。 a. 遍历向量A和Aq,得到T[k]=A[k]+Y,其中 if Aq[k]=Bq[i],Y=B[i] 否则 Y=A[nm-1]. b.遍历向量B和Bq,如果向量Aq中不包含Bq(i),T[nm+i]=B[i]+A[nm-1],否则不做任何操作。c. 对向量T按照降序排列,并将其中较大的nm个值及其对应的域元素作为单步运算的结果。 具体程序如下:
function [T,Tq]=variable_order(V,I,Vq,Iq)
% clear
% clc
% load VV
% load VVq
% load II
% load IIq
q=8;
Nm=q/2;
Tq(1:2*Nm)=-1;
T=zeros(1,2*Nm);
TTsq(1:Nm)=-1;
TTs=zeros(1,Nm);
for k=1:length(I)
if ~isempty(find(Vq==Iq(k),1))
l=find(Vq==Iq(k),2);
Y=V(l);
else
Y=V(Nm);
end
T(k)=I(k)+Y;
Tq(k)=Iq(k);
end
for i=1:Nm
T(Nm+i)=V(i)+I(Nm);
Tq(Nm+i)=Vq(i);
end
%排序找出Nm个最大值
[TT,TTq]=order_EMS(T,Tq);
k=1;
i=0;
while(i~=Nm)
if isempty(find(TTsq==TTq(k),1))
i=i+1;
TTsq(i)=TTq(k);
TTs(i)=TT(k);
end
k=k+1;
end
TTs1=TTs-TTs(1); %这里需要归一化吗?需要
T=TTs1;
Tq=TTsq;
end
为了避免EMS算法消息向量中似然值不断增大而导致溢出,变量节点更新完后须对其各项减去最大项,或者最小项。这一操作不会影响接下来的判决。
6. 译码判决 将输出变量 x_hat 判决消息符号索引向量Uq的首项(因为消息符号LLR是按降序排列首项最大)。校验方程满足或到达最大迭代次数则结束译码,否则返回步骤2.译码后变量消息U的计算在变量消息更新过程顺顺便计算出来,不用再重新编写程序。