找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 6407|回復(fù): 1
收起左側(cè)

一種QC_LDPC譯碼器的實(shí)現(xiàn)方法 帶實(shí)驗(yàn)報(bào)告與源碼 信息壓縮與傳輸

[復(fù)制鏈接]
ID:140725 發(fā)表于 2016-10-11 18:39 | 顯示全部樓層 |閱讀模式
0.png
所有資料打包下載(含實(shí)驗(yàn)報(bào)告與所有源碼):
一種QC_LDPC譯碼器的實(shí)現(xiàn)方法.rar (311.39 KB, 下載次數(shù): 24)
下面是論文的部分內(nèi)容預(yù)覽:

信息壓縮與傳輸報(bào)告

題    目:一種QC_LDPC譯碼器的實(shí)現(xiàn)方法
摘要:為了克服LDPC碼BP譯碼算法硬件實(shí)現(xiàn)復(fù)雜度大的缺點(diǎn),針對(duì)QC_LDPC碼校驗(yàn)矩陣的結(jié)構(gòu)特性,研究了BP算法的特點(diǎn),并利用TMS320C6747系列DSP作為實(shí)現(xiàn)平臺(tái),成功實(shí)現(xiàn)了基于BP算法的QC_LDPC碼譯碼器.系統(tǒng)性能測(cè)試表明,經(jīng)優(yōu)化的BP算法譯碼器與理論分析相比,性能基本一致.
關(guān)鍵詞:QC_LDPC碼;BP算法;DSP;實(shí)現(xiàn)復(fù)雜度;譯碼器


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)碼是一種定義在稀疏奇偶校驗(yàn)矩陣上的性能優(yōu)越的線性分組碼,最初由Gallager[1]博士在1963年提出.該碼在用非常稀疏的校驗(yàn)矩陣與基于BP(belief propagation)譯碼算法[2-3]的條件下具有逼近香農(nóng)限的性能,具有良好的距離特性,且在當(dāng)碼長(zhǎng)時(shí),不存在“地板效應(yīng)”.LDPC碼的實(shí)用化是近年研究的熱點(diǎn).隨機(jī)構(gòu)造的檢驗(yàn)矩陣雖然具有良好的性能,但是由于其節(jié)點(diǎn)的隨機(jī)性,給硬件實(shí)現(xiàn)帶來(lái)了難度.而近來(lái)興起的規(guī)則化構(gòu)造校驗(yàn)矩陣的LDPC碼,特別是Fossorier提出的低編碼復(fù)雜度的QC準(zhǔn)循環(huán)(quasi cyclic)LDPC碼的出現(xiàn)在硬件實(shí)現(xiàn)上提供了新的思路[4].在譯碼算法方面,BP算法雖然性能優(yōu)越,但由于其存在較多的浮點(diǎn)乘法運(yùn)算,占據(jù)資源量大,一直是硬件實(shí)現(xiàn)的瓶頸.隨著高速高容量的數(shù)字信號(hào)處理器(DSP)的發(fā)展,文中采用TI公司的TMS320C6747系列DSP,基于QC_LDPC碼,針對(duì)BP譯碼算法,在資源存儲(chǔ)、數(shù)據(jù)精度處理方面提出了改進(jìn),實(shí)現(xiàn)了基于BP算法的QC_LDPC碼譯碼器,獲得了較好的性能。

1.2 QC__LDPC碼的校驗(yàn)矩陣

QC_LDPC碼是一種特殊結(jié)構(gòu)化LDPC碼,其校驗(yàn)矩陣由一系列p×p循環(huán)子矩陣組成,所謂循環(huán)子矩陣是指子矩陣中每一行都是上一行的循環(huán)右移,第1行是最后一行的循環(huán)右移;每一列都是上一列的循環(huán)下移,第l列是最后一列的循環(huán)下移.當(dāng)循環(huán)子矩陣的行重和列重為1時(shí),該循環(huán)子矩陣可由同樣大小的單位陣循環(huán)移位得到[5]。

第2章 QC_LDPC碼的BP譯碼算法
BP譯碼算法的核心思想在于利用從信道中接收到的信息在變量節(jié)點(diǎn)和校驗(yàn)節(jié)點(diǎn)之間進(jìn)行信息傳遞、迭代運(yùn)算,從而獲得最大的編碼增益,其每次譯碼迭代包括2步:校驗(yàn)節(jié)點(diǎn)的信息處理和變量節(jié)點(diǎn)的信息處理.在每次迭代中,所有校驗(yàn)節(jié)點(diǎn)從其相鄰的變量節(jié)點(diǎn)處接收信息,處理后再傳回到相鄰的變量節(jié)點(diǎn);然后所有的變量節(jié)點(diǎn)進(jìn)行同樣的過(guò)程;最后變量節(jié)點(diǎn)收集所有可以利用的信息進(jìn)行判決[6]。
具體算法如下:
定義接收到的序列為y=(y1,y2,…,yn),譯碼得到的序列為c,rji(b)(b=0,1)表示校驗(yàn)節(jié)點(diǎn)j傳給變量節(jié)點(diǎn)i的外部概率信息,qji(b)表示變量節(jié)點(diǎn)i傳遞給校驗(yàn)節(jié)點(diǎn)j的外部概率信息.C(i)表示與變量節(jié)點(diǎn)i相連的校驗(yàn)節(jié)點(diǎn)的集合;R(j)表示與校驗(yàn)節(jié)點(diǎn)j相連的變量節(jié)點(diǎn)的集合;C(i)\j表示除j外與變量節(jié)點(diǎn)i相連的校驗(yàn)節(jié)點(diǎn)的集合;R(j)\i表示除i外與校驗(yàn)節(jié)點(diǎn)j相連的變量節(jié)點(diǎn)的集合;Pi(1)=Pr(ci=1|yi)表示接收到信息序列后判斷發(fā)送比特(或變量節(jié)點(diǎn))為ci=1的后驗(yàn)概率;同理,Pi(0)=Pr(ci=0|yi)表示接收到信息序列后判斷送比特(或變量節(jié)點(diǎn))為ci=0的后驗(yàn)概率。
1)初始化.計(jì)算信道傳遞給變量節(jié)點(diǎn)的初始概率Pi(1),Pi(0)=1-Pi(1),i=1,2,…,n.然后對(duì)每個(gè)變量節(jié)點(diǎn)i和與其相鄰的校驗(yàn)節(jié)點(diǎn)j∈C(i),設(shè)定變量點(diǎn)傳向
校驗(yàn)節(jié)點(diǎn)的初始消息:
    1.005.jpg

2)迭代處理.

步驟1:校驗(yàn)節(jié)點(diǎn)信息處理.對(duì)所有的校驗(yàn)節(jié)點(diǎn)j和與其相鄰的變量節(jié)點(diǎn) 1.006.jpg ,第L次迭代時(shí),計(jì)算量節(jié)點(diǎn)傳向校驗(yàn)節(jié)點(diǎn)的信息

步驟2:變量節(jié)點(diǎn)信息處理.

對(duì)所有的變量節(jié)點(diǎn)和與其相鄰的校驗(yàn)節(jié)點(diǎn) 1.007.jpg ,計(jì)算校驗(yàn)節(jié)點(diǎn)傳向變量節(jié)點(diǎn)的信息

1.008.jpg

步驟3:譯碼判決.

對(duì)所有變量節(jié)點(diǎn)計(jì)算硬判決信息:

1.009.jpg

3)停止

若矩陣等于0或者達(dá)到最大迭代次數(shù)則結(jié)束運(yùn)算,否則從步驟1繼續(xù)迭代。


第3章QC_LDPC譯碼器的DSP實(shí)現(xiàn)
采用TI公司的TMS320C6747系列浮點(diǎn)DSP作為譯碼器的實(shí)現(xiàn)平臺(tái).此款DSP的最新型C674X內(nèi)核將以往浮點(diǎn)型DSP的高精度數(shù)據(jù)處理優(yōu)勢(shì)和只有定點(diǎn)處理器才具備的連接性外設(shè)、低功耗和低成本的優(yōu)點(diǎn)完美結(jié)合在一起,具有300 MHz主頻、320 KB的片內(nèi)RAM,以及1 024 KB的片內(nèi)ROM.BP算法在以往難以用硬件實(shí)現(xiàn)的原因在于其算法本身存在大量的浮點(diǎn)數(shù)乘除法運(yùn)算,處理比較復(fù)雜,且占據(jù)大量的內(nèi)存空間,給處理器實(shí)現(xiàn)帶來(lái)難度;同時(shí),由于處理的信息有接近于0的小數(shù)概率,在乘除法及對(duì)數(shù)運(yùn)算時(shí)容易超出處理器設(shè)定的最大數(shù)量級(jí)范圍,從而造成數(shù)據(jù)的溢出,導(dǎo)致整幀信息無(wú)法譯出.為了解決以上難題,對(duì)譯碼器資源存儲(chǔ)和數(shù)據(jù)精度處理進(jìn)行了優(yōu)化:
(1)在信息迭代處理過(guò)程中,當(dāng)碼長(zhǎng)較長(zhǎng)時(shí),如果將整個(gè)LDPC碼校驗(yàn)矩陣的“0”和“1”位置的信息均記錄在內(nèi)存中,則勢(shì)必占據(jù)過(guò)多的系統(tǒng)資源,而事實(shí)上,參與迭代的有用信息僅存于“1”位置,故只需記錄“1”位置的信息即可.結(jié)合QC_LDPC校驗(yàn)矩陣準(zhǔn)循環(huán)結(jié)構(gòu)的特點(diǎn),將Aij對(duì)應(yīng)到一個(gè)長(zhǎng)度為p的數(shù)組L_ij上,L_ij的每一個(gè)位置存儲(chǔ)Aij對(duì)應(yīng)列里“1”位置的信息,如L_ij(k)存儲(chǔ)的就是Aij中第k列的“1”位置的信息,其中k<p.圖1所示為校驗(yàn)矩陣對(duì)應(yīng)的ram存儲(chǔ)器陣列結(jié)構(gòu)圖:
1.010.jpg
信息迭代處理時(shí),當(dāng)Aij為單位矩陣時(shí),L_ij(k)對(duì)應(yīng)的信息就是Aij中第k行第k列的“1”的信息;當(dāng)Aij為單位矩陣的循環(huán)移位矩陣時(shí),L_ij(k)對(duì)應(yīng)的信息則是根據(jù)右移系數(shù)Iij推算出對(duì)應(yīng)行的Aij第k列的信息。
2)在譯碼每次迭代過(guò)程中,如果對(duì)2類(lèi)節(jié)點(diǎn)信息rij(b)和qij(b)、接收初始化信息Pi(1)和Pi(0)及譯碼中間環(huán)節(jié)變量分別存儲(chǔ),則需要存儲(chǔ)器的數(shù)量為校驗(yàn)矩陣中非零矩陣數(shù)量的2倍以上;如果將存儲(chǔ)器復(fù)用,即校驗(yàn)節(jié)點(diǎn)更新時(shí),存儲(chǔ)校驗(yàn)節(jié)點(diǎn)信息,當(dāng)進(jìn)入變量節(jié)點(diǎn)更新時(shí),將此存儲(chǔ)空間再用來(lái)存取變量節(jié)點(diǎn)信息,同時(shí),不再為初始化信息和中間變量信息開(kāi)辟存儲(chǔ)空間,而將其并入2類(lèi)節(jié)點(diǎn)信息的存儲(chǔ)器中,往復(fù)利用,可以節(jié)省一半的存儲(chǔ)空間.事實(shí)證明,當(dāng)LDPC碼長(zhǎng)為1 536的情況下,優(yōu)化前,所需空間約為282.6 KB,經(jīng)復(fù)用,可以節(jié)省到約122.88 KB,極大地提高了資源利用率。
3)在用DSP實(shí)現(xiàn)BP譯碼算法時(shí),在DSP系統(tǒng)外擴(kuò)大容量SDRAM、Flash芯片來(lái)實(shí)現(xiàn)大容量數(shù)據(jù)存儲(chǔ)。對(duì)于部分不參與迭代的變量數(shù)組,如從解調(diào)模塊接收的信息數(shù)組、譯碼判決信息數(shù)組等,可以存在片外SDRAM中,如圖2所示,需要時(shí)可以從片外存取,從而進(jìn)一步節(jié)省DSP片內(nèi)存儲(chǔ)空間,
1.011.jpg
            圖2  DSP外擴(kuò)存儲(chǔ)器結(jié)構(gòu)圖
算法涉及的所有浮點(diǎn)型數(shù)組,均按照單精度浮點(diǎn)float型(32位)保存,而不采用64位的雙精度浮點(diǎn)型;譯碼判決序列按照char型(8位)保存,而不采用整形數(shù)組(16位).通過(guò)上述優(yōu)化,在原有的基礎(chǔ)上進(jìn)一步節(jié)省了DSP片內(nèi)約60 KB的存儲(chǔ)空間。經(jīng)驗(yàn)證,以上闡述的存儲(chǔ)器復(fù)用、片外存儲(chǔ)變量、數(shù)據(jù)格式的選擇等資源優(yōu)化方式節(jié)省了約3/4的存儲(chǔ)空間。




第四章程序驗(yàn)證譯碼效果
程序介紹:
  使用碼率為0.5的準(zhǔn)循環(huán)LDPC碼,碼矩陣(1255,2510)
迭代30次,輸入10幀數(shù)據(jù)。
  先對(duì)數(shù)據(jù)通過(guò)生成矩陣G進(jìn)行編碼,進(jìn)行BPSK調(diào)制,送入高斯白噪聲信道,通過(guò)校驗(yàn)矩陣H進(jìn)行譯碼操作。
   利用對(duì)數(shù)域LLR-BP算法譯碼,并且計(jì)算出誤碼率。
   并對(duì)只采用BPSK調(diào)制解調(diào)的誤碼性能和使用LDPC編解碼的誤碼性能通過(guò)實(shí)驗(yàn)驗(yàn)證做錯(cuò)出比較
源程序如下:
%% 計(jì)算LDPC性能

clear all;
clc;
%------------初始化-------------%
EbN0 =0:0.5:8;%信噪比
iter2=30;%迭代次數(shù)
frame=10;%測(cè)量的幀數(shù)
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;  %校驗(yàn)矩陣  
load P.mat P;                  %生成矩陣
[row_h col_h]=size(H_01);
%---------------將循環(huán)矩陣轉(zhuǎn)換為實(shí)際的校驗(yàn)矩陣--------------------%
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];  
       %-------------------調(diào)制-------------------%
      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);%
       %---------------計(jì)算誤碼---------------%  
         [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<');   %


下面是通過(guò)運(yùn)行程序,得出了對(duì)于兩種不同的編解碼方法誤碼率的比較,如下圖所示:
1.012.jpg
如圖上方紅線代表BPSK誤碼率,藍(lán)線代表LDPC誤碼率
有圖可以得出結(jié)論:
  同的信噪比下,采用LDPC編解碼技術(shù),得到的誤碼率明顯好于采用BPSK調(diào)制技術(shù),并且誤碼率提高一個(gè)的量化級(jí),如在信噪比為2db的情況下,采用LDPC技術(shù)誤碼率比BPSK技術(shù)提高了10倍以上。
參考文獻(xiàn):
[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]竇高奇,高俊,劉冰.準(zhǔn)循環(huán)LDPC碼快速編譯碼算法及
DSP實(shí)現(xiàn)[J].解放軍理工大學(xué)學(xué)報(bào),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
復(fù)制代碼

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:896482 發(fā)表于 2021-5-18 11:43 | 顯示全部樓層
運(yùn)行有點(diǎn)問(wèn)題,需要修改哪些參數(shù)嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表