1.算法仿真效果
matlab2022a仿真結(jié)果如下:

2.算法涉及理論知識概要
LDPC ( Low-density Parity-check,低密度奇偶校驗)碼是由 Gallager 在1963 年提出的一類具有稀疏校驗矩陣的線性分組碼 (linear block codes),然而在接下來的 30 年來由于計算能力的不足,它一直被人們忽視。1996年,D MacKay、M Neal 等人對它重新進(jìn)行了研究,發(fā)現(xiàn) LDPC 碼具有逼近香農(nóng)極限的優(yōu)異性能。并且具有譯碼復(fù)雜度低、可并行譯碼以及譯碼錯誤的可檢測性等特點,從而成為了信道編碼理論新的研究熱點。
Mckay ,Luby 提出的非正則 LDPC 碼將 LDPC 碼的概念推廣。非正則LDPC碼 的性能不僅優(yōu)于正則 LDPC 碼,甚至還優(yōu)于 Turbo 碼的性能,是目前己知的最接近香農(nóng)限的碼。
在LDPC碼的校驗矩陣中,如果行列重量固定為(P,Y),即每個校驗節(jié)點有Y個變量節(jié)點參與校驗,每個變量節(jié)點參與P個校驗節(jié)點,我們稱之為正則LDPC碼。Gallager最初提出的Gallager碼就具有這種性質(zhì)。從編碼二分圖的角度來看,這種LDPC碼的變量節(jié)點度數(shù)全部為P,而校驗節(jié)點的度數(shù)都為Y。我們還可以適當(dāng)放寬上述正則LDPC碼的條件,行列重量的均值可以不是一個整數(shù),但行列重量盡量服從均勻分布。另外為了保證LDPC碼的二分圖上不存在長度為4的圈。我們通常要求行與行以及列與列之間的交疊部分重量不超過1,所謂交疊部分即任意兩列或兩行的相同部分。我們可以將正則LDPC碼校驗矩陣H的特征概括如下:
1. H的每行行重固定為P,每列列重固定為Y。
2. 任意兩行(列)之間同為1的列(行)數(shù)(稱為重疊數(shù))不超過1,即H矩陣中不含四角為1 的小方陣,也即無4線循環(huán)。
3. 行重P和列重Y相對于H的行數(shù)M、列數(shù)N很小,H是個稀疏矩陣。
在正則LDPC碼的校驗矩陣中。行重和列重的均值保持不變,所以校驗矩陣中1的個數(shù)隨著碼長的增加而線性增長,整個校驗矩陣的元素個數(shù)則成平方增長。當(dāng)碼長達(dá)到一定長度時,校驗矩陣H是非常稀疏的低密度矩陣。對于正則的LDPC碼,MacKay給出了以下兩個結(jié)論:
1. 對于任意給定列重大于3的LDPC碼,存在某個小于信道傳輸容量且大于零的速率r ,當(dāng)碼長足夠長時,可以實現(xiàn)以小于r且不為零的速率無差錯的傳輸。也就是說任意給定一個不為零的傳輸速率r,存在一個小于相應(yīng)香農(nóng)限的噪聲門限,當(dāng)信道噪聲低于該門限且碼長足夠長的時候,可以實現(xiàn)以r速率無差錯的傳輸。
2. 當(dāng)LDPC碼的校驗矩陣H的列重Y不固定,而是根據(jù)信道特性和傳輸速率來確定時,則一定可以找到一個最佳碼,實現(xiàn)在任意小于信道傳輸容量的速率下無差錯的傳輸。
對LDPC碼的定義都是在二元域基礎(chǔ)上的,MaKcay對上述二元域的LDPC碼又進(jìn)行了推廣。如果定義中的域不限于二元域就可以得到多元域GF(q)上的LDPC碼。多元域上的LDPC碼具有較二進(jìn)制LDPC碼更好的性能,而且實踐表明在越大的域上構(gòu)造的LDPC碼,譯碼性能就越好,比如在GF(16)上構(gòu)造的正則碼性能己經(jīng)和Turbo碼相差無幾。多元域LDPC碼之所以擁有如此優(yōu)異的性能,是因為它有比二元域LDPC碼更重的列重,同時還有和二元域LDPC碼相似的二分圖結(jié)構(gòu)。
碼率是0.5,碼長是2304,nb=24,kb=12,
基礎(chǔ)矩陣為



3.MATLAB核心程序
H ??????= func_H(Hb,eye(96));
[Rh,Ch] = size(H);
x ???????= [ones(1,Ch)];
EbN0 ????= [0:0.5:2];
Max_iter = 1;
for ij = 1:length(EbN0)
for k = 1:100
[k,ij]
sigma = sqrt(1/(10^(EbN0(ij)/10)));
%實際驗證過程中,這個位置加入你的編碼模塊
code ?= (2*x-1);
r ????= code+randn(size(x))*sigma;
%對應(yīng)PPT公式
Lv ???= 2*r/(sigma^2);
%SPA算法
[ber,v1] = Sum_product_algorithm(Lv,H,Max_iter);
%輸入變量
x(Rh+1:Ch);
%輸出變量
v1(Rh+1:Ch);
%計算錯誤數(shù)據(jù)
err1(k,ij)=1-length(find(v1(Rh+1:Ch)==x(Rh+1:Ch)))/length(x(Rh+1:Ch));
end
end
if Max_iter==1
save R1.mat EbN0 err1
end
if Max_iter==5
save R2.mat EbN0 err1
end
if Max_iter==10
save R3.mat EbN0 err1
end
if Max_iter==25
save R4.mat EbN0 err1
end
if Max_iter==100
save R5.mat EbN0 err1
end
figure;
semilogy(EbN0,mean(err1,1),'b-o');
grid on
xlabel('EBNO');
ylabel('ber');