找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5922|回复: 1
打印 上一主题 下一主题
收起左侧

一种QC_LDPC译码器的实现方法 带实验报告与源码 信息压缩与传输

[复制链接]
跳转到指定楼层
楼主
ID:140725 发表于 2016-10-11 18:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

所有资料打包下载(含实验报告与所有源码):
一种QC_LDPC译码器的实现方法.rar (311.39 KB, 下载次数: 24)
下面是论文的部分内容预览:

信息压缩与传输报告

题    目:一种QC_LDPC译码器的实现方法
摘要:为了克服LDPC码BP译码算法硬件实现复杂度大的缺点,针对QC_LDPC码校验矩阵的结构特性,研究了BP算法的特点,并利用TMS320C6747系列DSP作为实现平台,成功实现了基于BP算法的QC_LDPC码译码器.系统性能测试表明,经优化的BP算法译码器与理论分析相比,性能基本一致.
关键词:QC_LDPC码;BP算法;DSP;实现复杂度;译码器


One way to implement QC_LDPC decoder
AbstractIn order to overcome the shortcomings of the high complexity in hardware implementation of the BP decoding algorithm's hardware implementation,the characteristics of the BP algorithm were studied,in view of the structural properties of the QC_LDPC code check matrix. And the TMS320C6747 DSP were used for the implementation and the implementation of the QC_LDPC decoder based on the BP algorithm was completed in the end. The system tests results shows that the performance of the optimized BP algorithm decoder is almost the same to the theoretic analysis.
KeywordsQC_LDPC code;BP algorithm;DSP;implementation complexity;decoder



第1章 绪论1.1 课题研究背景

LDPC(low density parity check)码是一种定义在稀疏奇偶校验矩阵上的性能优越的线性分组码,最初由Gallager[1]博士在1963年提出.该码在用非常稀疏的校验矩阵与基于BP(belief propagation)译码算法[2-3]的条件下具有逼近香农限的性能,具有良好的距离特性,且在当码长时,不存在“地板效应”.LDPC码的实用化是近年研究的热点.随机构造的检验矩阵虽然具有良好的性能,但是由于其节点的随机性,给硬件实现带来了难度.而近来兴起的规则化构造校验矩阵的LDPC码,特别是Fossorier提出的低编码复杂度的QC准循环(quasi cyclic)LDPC码的出现在硬件实现上提供了新的思路[4].在译码算法方面,BP算法虽然性能优越,但由于其存在较多的浮点乘法运算,占据资源量大,一直是硬件实现的瓶颈.随着高速高容量的数字信号处理器(DSP)的发展,文中采用TI公司的TMS320C6747系列DSP,基于QC_LDPC码,针对BP译码算法,在资源存储、数据精度处理方面提出了改进,实现了基于BP算法的QC_LDPC码译码器,获得了较好的性能。

1.2 QC__LDPC码的校验矩阵

QC_LDPC码是一种特殊结构化LDPC码,其校验矩阵由一系列p×p循环子矩阵组成,所谓循环子矩阵是指子矩阵中每一行都是上一行的循环右移,第1行是最后一行的循环右移;每一列都是上一列的循环下移,第l列是最后一列的循环下移.当循环子矩阵的行重和列重为1时,该循环子矩阵可由同样大小的单位阵循环移位得到[5]。

第2章 QC_LDPC码的BP译码算法
BP译码算法的核心思想在于利用从信道中接收到的信息在变量节点和校验节点之间进行信息传递、迭代运算,从而获得最大的编码增益,其每次译码迭代包括2步:校验节点的信息处理和变量节点的信息处理.在每次迭代中,所有校验节点从其相邻的变量节点处接收信息,处理后再传回到相邻的变量节点;然后所有的变量节点进行同样的过程;最后变量节点收集所有可以利用的信息进行判决[6]。
具体算法如下:
定义接收到的序列为y=(y1,y2,…,yn),译码得到的序列为c,rji(b)(b=0,1)表示校验节点j传给变量节点i的外部概率信息,qji(b)表示变量节点i传递给校验节点j的外部概率信息.C(i)表示与变量节点i相连的校验节点的集合;R(j)表示与校验节点j相连的变量节点的集合;C(i)\j表示除j外与变量节点i相连的校验节点的集合;R(j)\i表示除i外与校验节点j相连的变量节点的集合;Pi(1)=Pr(ci=1|yi)表示接收到信息序列后判断发送比特(或变量节点)为ci=1的后验概率;同理,Pi(0)=Pr(ci=0|yi)表示接收到信息序列后判断送比特(或变量节点)为ci=0的后验概率。
1)初始化.计算信道传递给变量节点的初始概率Pi(1),Pi(0)=1-Pi(1),i=1,2,…,n.然后对每个变量节点i和与其相邻的校验节点j∈C(i),设定变量点传向
校验节点的初始消息:
   

2)迭代处理.

步骤1:校验节点信息处理.对所有的校验节点j和与其相邻的变量节点

,第L次迭代时,计算量节点传向校验节点的信息

步骤2:变量节点信息处理.

对所有的变量节点和与其相邻的校验节点

,计算校验节点传向变量节点的信息

步骤3:译码判决.

对所有变量节点计算硬判决信息:

3)停止

若矩阵等于0或者达到最大迭代次数则结束运算,否则从步骤1继续迭代。


第3章QC_LDPC译码器的DSP实现
采用TI公司的TMS320C6747系列浮点DSP作为译码器的实现平台.此款DSP的最新型C674X内核将以往浮点型DSP的高精度数据处理优势和只有定点处理器才具备的连接性外设、低功耗和低成本的优点完美结合在一起,具有300 MHz主频、320 KB的片内RAM,以及1 024 KB的片内ROM.BP算法在以往难以用硬件实现的原因在于其算法本身存在大量的浮点数乘除法运算,处理比较复杂,且占据大量的内存空间,给处理器实现带来难度;同时,由于处理的信息有接近于0的小数概率,在乘除法及对数运算时容易超出处理器设定的最大数量级范围,从而造成数据的溢出,导致整帧信息无法译出.为了解决以上难题,对译码器资源存储和数据精度处理进行了优化:
(1)在信息迭代处理过程中,当码长较长时,如果将整个LDPC码校验矩阵的“0”和“1”位置的信息均记录在内存中,则势必占据过多的系统资源,而事实上,参与迭代的有用信息仅存于“1”位置,故只需记录“1”位置的信息即可.结合QC_LDPC校验矩阵准循环结构的特点,将Aij对应到一个长度为p的数组L_ij上,L_ij的每一个位置存储Aij对应列里“1”位置的信息,如L_ij(k)存储的就是Aij中第k列的“1”位置的信息,其中k<p.图1所示为校验矩阵对应的ram存储器阵列结构图:

信息迭代处理时,当Aij为单位矩阵时,L_ij(k)对应的信息就是Aij中第k行第k列的“1”的信息;当Aij为单位矩阵的循环移位矩阵时,L_ij(k)对应的信息则是根据右移系数Iij推算出对应行的Aij第k列的信息。
2)在译码每次迭代过程中,如果对2类节点信息rij(b)和qij(b)、接收初始化信息Pi(1)和Pi(0)及译码中间环节变量分别存储,则需要存储器的数量为校验矩阵中非零矩阵数量的2倍以上;如果将存储器复用,即校验节点更新时,存储校验节点信息,当进入变量节点更新时,将此存储空间再用来存取变量节点信息,同时,不再为初始化信息和中间变量信息开辟存储空间,而将其并入2类节点信息的存储器中,往复利用,可以节省一半的存储空间.事实证明,当LDPC码长为1 536的情况下,优化前,所需空间约为282.6 KB,经复用,可以节省到约122.88 KB,极大地提高了资源利用率。
3)在用DSP实现BP译码算法时,在DSP系统外扩大容量SDRAM、Flash芯片来实现大容量数据存储。对于部分不参与迭代的变量数组,如从解调模块接收的信息数组、译码判决信息数组等,可以存在片外SDRAM中,如图2所示,需要时可以从片外存取,从而进一步节省DSP片内存储空间,
            图2  DSP外扩存储器结构图
算法涉及的所有浮点型数组,均按照单精度浮点float型(32位)保存,而不采用64位的双精度浮点型;译码判决序列按照char型(8位)保存,而不采用整形数组(16位).通过上述优化,在原有的基础上进一步节省了DSP片内约60 KB的存储空间。经验证,以上阐述的存储器复用、片外存储变量、数据格式的选择等资源优化方式节省了约3/4的存储空间。




第四章程序验证译码效果
程序介绍:
  使用码率为0.5的准循环LDPC码,码矩阵(1255,2510)
迭代30次,输入10帧数据。
  先对数据通过生成矩阵G进行编码,进行BPSK调制,送入高斯白噪声信道,通过校验矩阵H进行译码操作。
   利用对数域LLR-BP算法译码,并且计算出误码率。
   并对只采用BPSK调制解调的误码性能和使用LDPC编解码的误码性能通过实验验证做错出比较
源程序如下:
%% 计算LDPC性能

clear all;
clc;
%------------初始化-------------%
EbN0 =0:0.5:8;%信噪比
iter2=30;%迭代次数
frame=10;%测量的帧数
rate=0.5;%误码
ber3=zeros(length(EbN0));
ber=zeros(length(EbN0));
q=251;
summ=0;
sumn=0;
count=0;
E0=eye(q);%μ¥λ¾ØÕó
EZ=zeros(q);%0¾ØÕó
load H_01_dual_diag.mat H_01;  %校验矩阵  
load P.mat P;                  %生成矩阵
[row_h col_h]=size(H_01);
%---------------将循环矩阵转换为实际的校验矩阵--------------------%
for i=1:row_h
    for j=1:col_h
        if H_01(i,j)==-1
           H_0_matrix((i-1)*q+1:i*q,(j-1)*q+1:j*q)=circshift(EZ,H_01(i,j));
               else
          H_0_matrix((i-1)*q+1:i*q,(j-1)*q+1:j*q)=circshift(E0,H_01(i,j));
        end
    end
end
H=H_0_matrix;
for i = 1:length(EbN0)
   for j = 1:frame           
       fprintf('Frame : %d', j);
       %-------------------编码-------------------%
       x=(sign(randn(1,size(P,1)))+1)/2;
       y=mod(x*P,2);
       u=[y x];  
       %-------------------调制-------------------%
      bpskMod = 2*u - 1;
       %---------------加入高斯信道---------------%
       N0 = 1/(exp(EbN0(i)*log(10)/10));
         tx =bpskMod+sqrt(N0/(2*rate))*randn(size(bpskMod));
         for iii=1:2510
             if tx(iii)<=0
                 tx1(iii)=0;
             else
                 tx1(iii)=1;
             end
         end
      comp=xor(u, tx1);
      summ=sum(comp);
      sumn=summ/2510;
      ber(i)=ber(i)+sumn;
        %---------------译码---------------%     
           vhat1 = decodeProbDomain(tx', H,  N0,iter2);%
       %---------------计算误码---------------%  
         [num3, rat3] = biterr(vhat1, u);
           ber3(i) = (ber3(i) + rat3);
   end

        ber(i)=ber(i)/frame;
          ber3(i)=ber3(i)/frame;
          fprintf(' i=%f',i);
          fprintf('ber3= %12.10f,ber= %12.10f',ber3(i),ber(i));
           if count==1
                ber3(i)=0;
           elseif ber3(i)<1/(q*10*frame)
              ber3(i)=1/(2*q*10*frame);
              count=1;
           end

end
%---------------误码曲线---------------%  
         semilogy(EbN0, ber3, '-b+',EbN0, ber, '-r<');   %


下面是通过运行程序,得出了对于两种不同的编解码方法误码率的比较,如下图所示:
如图上方红线代表BPSK误码率,蓝线代表LDPC误码率
有图可以得出结论:
  同的信噪比下,采用LDPC编解码技术,得到的误码率明显好于采用BPSK调制技术,并且误码率提高一个的量化级,如在信噪比为2db的情况下,采用LDPC技术误码率比BPSK技术提高了10倍以上。
参考文献:
[1]GALLAGER R G.Low-density parity-check codes[M].Boston:MIT Press,1963:70-81.
[2]GALLAGER R G.Low density parity check codes[J].IRE
Trans on Information Theory,1962,8(1):2l-28.
[3]MACKAY D J C,NEAL R M.Near Shannon limit performance of low-density parity-check codes[J].IE Electronics Let-ters,1996,32(18):1645-1646.
[4]FOSSORIER M P.Quasi-cyclic low-density parity-check codes from circulant permutation matrices [J].IEEE Trans on
Inform Theory,2004,50:1788-1793.
[5]LI Zongwang,CHEN Lei,ZENG Lingqi,et al.Efficient encoding of quasi-cyclic low-density parity-check codes[J].IEEETrans on Communications,2006,54(1):36-45.
[6]窦高奇,高俊,刘冰.准循环LDPC码快速编译码算法及
DSP实现[J].解放军理工大学学报,2008,9(4):324-327.

  1. function vHat = decodeProbDomain(rx, H, N0, iteration)
  2. % Probability-domain sum product algorithm LDPC decoder
  3. %
  4. %  rx        : Received signal vector (column vector)
  5. %  H         : LDPC matrix
  6. %  N0        : Noise variance
  7. %  iteration : Number of iteration
  8. %
  9. %  vHat      : Decoded vector (0/1)


  10. [M N] = size(H);

  11. % Prior probabilities
  12. P1 = ones(size(rx))./(1 + exp(-2*rx./(N0/2)));
  13. P0 = 1 - P1;

  14. % Initialization
  15. K0 = zeros(M, N);
  16. K1 = zeros(M, N);
  17. rji0 = zeros(M, N);
  18. rji1 = zeros(M, N);
  19. qij0 = H.*repmat(P0', M, 1);
  20. qij1 = H.*repmat(P1', M, 1);

  21. % Iteration
  22. for n = 1:iteration
  23.    
  24. %      fprintf('Iteration : %d', n);
  25.    
  26.    % ----- Horizontal step -----
  27.    for i = 1:M
  28.       
  29.       % Find non-zeros in the column
  30.       c1 = find(H(i, :));
  31.       
  32.       for k = 1:length(c1)
  33.          
  34.          % Get column products of drjic1(l)
  35.          drji = 1;
  36.          for l = 1:length(c1)
  37.             if l~= k
  38.                drji = drji*(qij0(i, c1(l)) - qij1(i, c1(l)));
  39.             end
  40.          end % for l
  41.          
  42.          rji0(i, c1(k)) = (1 + drji)/2;
  43.          rji1(i, c1(k)) = (1 - drji)/2;
  44.          
  45.       end % for k
  46.       
  47.    end % for i
  48.    
  49.    % ------ Vertical step ------
  50.    for j = 1:N
  51.       
  52.       % Find non-zeros in the row
  53.       r1 = find(H(:, j));
  54.       
  55.       for k = 1:length(r1)
  56.         
  57.          % Get row products of prodOfriji(l)
  58.          prodOfrij0 = 1;
  59.          prodOfrij1 = 1;   
  60.          for l = 1:length(r1)
  61.             if l~= k
  62.                prodOfrij0 = prodOfrij0*rji0(r1(l), j);
  63.                prodOfrij1 = prodOfrij1*rji1(r1(l), j);
  64.             end
  65.          end % for l
  66.          
  67.          % Update constants
  68.          K0(r1(k), j) = P0(j)*prodOfrij0;
  69.          K1(r1(k), j) = P1(j)*prodOfrij1;
  70.          
  71.          % Update qij0 and qij1
  72.          qij0(r1(k), j) = K0(r1(k), j)./(K0(r1(k), j) + K1(r1(k), j));
  73.          qij1(r1(k), j) = K1(r1(k), j)./(K0(r1(k), j) + K1(r1(k), j));
  74.                
  75.       end % for k
  76.       
  77.       % Update constants
  78.       Ki0 = P0(j)*prod(rji0(r1, j));
  79.       Ki1 = P1(j)*prod(rji1(r1, j));
  80.       
  81.       % Get Qj
  82.       Qi0 = Ki0/(Ki0 + Ki1);
  83.       Qi1 = Ki1/(Ki0 + Ki1);
  84.       
  85.       % Decode Qj        
  86.       if Qi1 > Qi0
  87.          vHat(j) = 1;
  88.       else
  89.          vHat(j) = 0;
  90.       end
  91. %          if rem(H*yo.',2) == 0,
  92. %         break;   
  93. %          end
  94.    end % for j
  95.    
  96. end % for n
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:896482 发表于 2021-5-18 11:43 | 只看该作者
运行有点问题,需要修改哪些参数吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表