My LDPC BER curve is bad

15 views (last 30 days)
Rishi Balasubramanian
Rishi Balasubramanian on 22 Jan 2021
Commented: Rahul Raj on 16 Aug 2023
Hello,
For my Masters Thesis, I am trying to simulate Quasi Cyclic Low-density Parity-Check Codes (QC - LDPC) codes on Matlab. Here are the details regarding it.
Parity Matrix - Quasi Cyclic LDPC (93 x 155)
Encoder - Approximate Lower Triangular Encoding (rearrange matrix to ALT form)
Decoders - Sum-Product and Min Sum Decoders.
Message Size - 62 bits
Modulation - BPSK
Channel - AWGN
I believe that I have properly coded. And I have been unable to track where the mistake is happening. But for some unidentifiable reason, by error rates are not what they're expected to be. I have attached the BER curve for reference. Any sort of help would be really appreciated. I have been plucking out all my hair for the past 20+ days failing to create a proper simulation. Thanks in advance.
clear
clc
[bb, Ha] = qcldpc(3, 5, 2, 5, 31); %Creates PCM.
H = alt(Ha); %Rearrange PCM to ALT form for Encoding
[N1, N2] = size(H);
k = N2-N1;
pcs =1;
while (pcs ~= 0)
y = round(rand(1, N2-N1));
encode = enc(H,y);
msg = [y encode];
cs = mod(msg * H', 2); %to detect a proper codeword
pcs = sum(cs);
end
[~, bits] = size(msg);
dB = 1:5; % range of SNR values in dB
R = k/N2; % code rate
iter = 10; %Iterations
N0 = (10.^(-dB/10)); %Variance values
for i = 1 : length(dB)
ber1(i) = 0; ber2(i) = 0;
for j = 1:bits
mod = bpsk(msg); %bpsk modulation
bp = mod';
tx = bp + sqrt(N0(i)/2) * randn(size(bp)); %Transmitted with AWGN
dp(i,:) = dbpsk(tx); %Demodulated
Li = -dp(i,:);
vhat1(i,:) = SPA(tx, Ha, N0(i), iter); %Decoding Using Sum Product Algorithm
vhat2(i,:) = MSA(Li, Ha, iter); %Decoding Using Min Sum Algorithm
[n1, r1] = biterr(vhat1(i,:), msg);
[n2, r2] = biterr(vhat2(i,:), msg);
ber1(i) = ber1(i) + r1;
ber2(i) = ber2(i) + r2;
end
BER1(i) = ber1(i) / (bits * length(dB)); %BER Calculation
BER2(i) = ber2(i) / (bits * length(dB));
end
figure('Name','BER vs SNR','NumberTitle','off');
semilogy(dB, BER1, 'o-');
hold;
semilogy(dB, BER2, 'o--');
legend('SPA','MSA')
grid on;
hold off;
  1 Comment
Rahul Raj
Rahul Raj on 16 Aug 2023
Can you tell what method you are using for creating a quasi-cyclc LDPC code matrix or parity check matrix?

Sign in to comment.

Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!