多进制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 endendBoutillon与 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的计算在变量消息更新过程顺顺便计算出来,不用再重新编写程序。
- 多进制LDPC—EMS译码算法
- 多进制LDPC码的译码算法比较
- LDPC码译码算法---NMS matlab程序
- 通信算法之二:信道编码译码 BCH码、RS码、卷积码、Turbo码、LDPC码
- LDPC
- 多进制LDPC码_16QAM调制
- viterbi译码算法简介
- viterbi译码算法
- CRC译码算法
- 哈夫曼树编/译码算法
- EMS
- EMS
- 维特比译码算法
- 算法源码之哈弗曼编、译码
- 译码
- 译码
- 译码
- 译码
- MYSQL常用函数
- C++ 自动存储、静态存储和动态存储
- 正确理解ThreadLocal
- MOOC——C语言10:字符串
- Spring MVC @PathVariable 最后一个点(dot)以后的字符串(或说扩展名)丢失
- 多进制LDPC—EMS译码算法
- HDOJ 2016 数据的交换输出
- eclipse的maven-bulid命令介绍
- vs2005 如何把项目调为‘优化’状态
- ubuntu11.10 进入桌面只有鼠标或只有桌面背景,或黑屏解决办法.
- URL 地址通过 encode 方式加密
- objective-c中的本地化操作(序列化,归档)
- 牛腩新闻发布系统总结(二)--相对路径与绝对路径
- HDU 2013 蟠桃记