本文主要是介绍【MATLAB项目实战】LDPC-BP信道编码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
除了Turbo码之外, Gallger于 1960年提出的低密度校验(Low Density ParityCheck,LDPC)码也能逼近香农界。本节介绍二进制LDPC码的仿真实现
不同码元长度WER变化情况:
从图中可以看出,码长是影响LDPC码性能的一个重要因素,LDPC码译码性能随着码长的增长有显著的改善。码长为1024的编码比码长为512的编码在性能上约有0.5dB的提高
主程序:
clc;clear all;
SNRdB=0:0.25:3; %SNR in dB
k=512/4;
n=1024/4; % 码长
niter= 60;% 最大迭代此时
nb_err = zeros(1,length(SNRdB));
nb_code = zeros(1,length(SNRdB));
nb_err_max= 100 ;
nb_code_max= 1e4;
H= gen_h(n,6,3);% 产生H
[Hs,H]=gen_Hs(H); % 化为系统码
Q= Hs(:,1:k)'; % 生成矩阵的Qfor s= 1:length(SNRdB)sigma = 10^(-SNRdB(s)/20);% 其平方是噪声功率while nb_err(s)<nb_err_max && nb_code(s)<nb_code_maxnb_code(s) = nb_code(s)+1;b = rand(1,k)<0.5;c=[b,rem(b*Q,2)];% 系统码编码x=(-1).^c;% BPSK modulationnoise = sigma * randn(1,length(x));y = x+noise;lam_ch= 2*y/sigma^2;%软解调hat_c= msa(lam_ch,niter,H);err = any(hat_c~=c); %c是发送码字,hat_c是硬判决if errnb_err(s)= nb_err(s)+err;disp([nb_err;nb_code])endend
endWER= nb_err./nb_code;
EbN0dB= SNRdB+10*log10(n/k/2);%化成Eb/N0,参考式(1)
figure(1)
semilogy(EbN0dB, WER,'o-','LineWidth',2)
xlabel('Eb/N0')
ylabel('WER')
grid on;
hold onSNRdB=0:0.25:3; %SNR in dB
k=512/2;
n=1024/2; % 码长
niter= 60;% 最大迭代此时
nb_err = zeros(1,length(SNRdB));
nb_code = zeros(1,length(SNRdB));
nb_err_max= 100 ;
nb_code_max= 1e4;
H= gen_h(n,6,3);% 产生H
[Hs,H]=gen_Hs(H); % 化为系统码
Q= Hs(:,1:k)'; % 生成矩阵的Qfor s= 1:length(SNRdB)sigma = 10^(-SNRdB(s)/20);% 其平方是噪声功率while nb_err(s)<nb_err_max && nb_code(s)<nb_code_maxnb_code(s) = nb_code(s)+1;b = rand(1,k)<0.5;c=[b,rem(b*Q,2)];% 系统码编码x=(-1).^c;% BPSK modulationnoise = sigma * randn(1,length(x));y = x+noise;lam_ch= 2*y/sigma^2;%软解调hat_c= msa(lam_ch,niter,H);err = any(hat_c~=c); %c是发送码字,hat_c是硬判决if errnb_err(s)= nb_err(s)+err;disp([nb_err;nb_code])endend
endWER= nb_err./nb_code;
EbN0dB= SNRdB+10*log10(n/k/2);%化成Eb/N0,参考式(1)
figure(1)
semilogy(EbN0dB, WER,'s-','LineWidth',2)
xlabel('Eb/N0')
ylabel('WER')
grid on;
hold onSNRdB=0:0.25:3; %SNR in dB
k=512;
n=1024; % 码长
niter= 60;%最大迭代此时
nb_err = zeros(1,length(SNRdB));
nb_code = zeros(1,length(SNRdB));
nb_err_max= 100 ;
nb_code_max= 1e4;
H= gen_h(n,6,3);%产生H
[Hs,H]=gen_Hs(H); %化为系统码
Q= Hs(:,1:k)'; %生成矩阵的Qfor s= 1:length(SNRdB)sigma = 10^(-SNRdB(s)/20);%其平方是噪声功率while nb_err(s)<nb_err_max && nb_code(s)<nb_code_maxnb_code(s) = nb_code(s)+1;b = rand(1,k)<0.5;c=[b,rem(b*Q,2)];%系统码编码x=(-1).^c;%BPSK modulationnoise = sigma * randn(1,length(x));y = x+noise;lam_ch= 2*y/sigma^2;%软解调hat_c= msa(lam_ch,niter,H);err = any(hat_c~=c); %c是发送码字,hat_c是硬判决if errnb_err(s)= nb_err(s)+err;disp([nb_err;nb_code])endend
endWER= nb_err./nb_code;
EbN0dB= SNRdB+10*log10(n/k/2);%化成Eb/N0,参考式(1)
figure(1)
semilogy(EbN0dB, WER,'^-','LineWidth',2)
xlabel('Eb/N0')
ylabel('WER')
grid on;legend('n=256','n=512','n=1024')
代码链接(包括word文档):https://download.csdn.net/download/qq_45047246/86268695
这篇关于【MATLAB项目实战】LDPC-BP信道编码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!