多进制LDPC—EMS译码算法

通过对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的计算在变量消息更新过程顺顺便计算出来,不用再重新编写程序。



你可能感兴趣的:(多进制LDPC—EMS译码算法)