1.010.jpg (13.98 KB, 下載次數: 138)
下載附件
2016-10-11 18:37 上傳
信息迭代處理時,當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片內存儲空間,
1.011.jpg (13 KB, 下載次數: 132)
下載附件
2016-10-11 18:37 上傳
圖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<'); %
下面是通過運行程序,得出了對于兩種不同的編解碼方法誤碼率的比較,如下圖所示:
1.012.jpg (36.91 KB, 下載次數: 129)
下載附件
2016-10-11 18:37 上傳
如圖上方紅線代表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.
- function vHat = decodeProbDomain(rx, H, N0, iteration)
- % Probability-domain sum product algorithm LDPC decoder
- %
- % rx : Received signal vector (column vector)
- % H : LDPC matrix
- % N0 : Noise variance
- % iteration : Number of iteration
- %
- % vHat : Decoded vector (0/1)
-
- [M N] = size(H);
- % Prior probabilities
- P1 = ones(size(rx))./(1 + exp(-2*rx./(N0/2)));
- P0 = 1 - P1;
- % Initialization
- K0 = zeros(M, N);
- K1 = zeros(M, N);
- rji0 = zeros(M, N);
- rji1 = zeros(M, N);
- qij0 = H.*repmat(P0', M, 1);
- qij1 = H.*repmat(P1', M, 1);
- % Iteration
- for n = 1:iteration
-
- % fprintf('Iteration : %d', n);
-
- % ----- Horizontal step -----
- for i = 1:M
-
- % Find non-zeros in the column
- c1 = find(H(i, :));
-
- for k = 1:length(c1)
-
- % Get column products of drjic1(l)
- drji = 1;
- for l = 1:length(c1)
- if l~= k
- drji = drji*(qij0(i, c1(l)) - qij1(i, c1(l)));
- end
- end % for l
-
- rji0(i, c1(k)) = (1 + drji)/2;
- rji1(i, c1(k)) = (1 - drji)/2;
-
- end % for k
-
- end % for i
-
- % ------ Vertical step ------
- for j = 1:N
-
- % Find non-zeros in the row
- r1 = find(H(:, j));
-
- for k = 1:length(r1)
-
- % Get row products of prodOfriji(l)
- prodOfrij0 = 1;
- prodOfrij1 = 1;
- for l = 1:length(r1)
- if l~= k
- prodOfrij0 = prodOfrij0*rji0(r1(l), j);
- prodOfrij1 = prodOfrij1*rji1(r1(l), j);
- end
- end % for l
-
- % Update constants
- K0(r1(k), j) = P0(j)*prodOfrij0;
- K1(r1(k), j) = P1(j)*prodOfrij1;
-
- % Update qij0 and qij1
- qij0(r1(k), j) = K0(r1(k), j)./(K0(r1(k), j) + K1(r1(k), j));
- qij1(r1(k), j) = K1(r1(k), j)./(K0(r1(k), j) + K1(r1(k), j));
-
- end % for k
-
- % Update constants
- Ki0 = P0(j)*prod(rji0(r1, j));
- Ki1 = P1(j)*prod(rji1(r1, j));
-
- % Get Qj
- Qi0 = Ki0/(Ki0 + Ki1);
- Qi1 = Ki1/(Ki0 + Ki1);
-
- % Decode Qj
- if Qi1 > Qi0
- vHat(j) = 1;
- else
- vHat(j) = 0;
- end
- % if rem(H*yo.',2) == 0,
- % break;
- % end
- end % for j
-
- end % for n
復制代碼