多进制LDPC—EMS译码算法

来源:互联网 发布:java导入项目中文乱码 编辑:程序博客网 时间:2024/05/01 18:01

通过对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 Iqq=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-3beta(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         endend
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 IIqq=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);endfor 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;endTTs1=TTs-TTs(1);    %这里需要归一化吗?需要T=TTs1;Tq=TTsq;end
为了避免EMS算法消息向量中似然值不断增大而导致溢出,变量节点更新完后须对其各项减去最大项,或者最小项。这一操作不会影响接下来的判决。

6. 译码判决  将输出变量 x_hat 判决消息符号索引向量Uq的首项(因为消息符号LLR是按降序排列首项最大)。校验方程满足或到达最大迭代次数则结束译码,否则返回步骤2.译码后变量消息U的计算在变量消息更新过程顺顺便计算出来,不用再重新编写程序。



0 0
原创粉丝点击