信息迭代處理時(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ǔ)空間,
圖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ì)于兩種不同的編解碼方法誤碼率的比較,如下圖所示:如圖上方紅線代表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.
- 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
復(fù)制代碼