problem to concatene 2 code Malab
3 views (last 30 days)
Show older comments
hello everyone, i need to help concatened un code matlab code LDPC with STBC for master
clear all
close all
clc
tic
%%
N = 2016;%la longueur du mot de code
K = 1008;%longueur du message d'information
R = K/N;% le taux de codage
%%
addpath('Encoder')
addpath('Decoder')
%% Génération de la matrice H
[ H, Hp, Hs ] = HxMatrixGen();
alpha = 0.7; beta = 0.5;
Eb_N0_dB = -1:0.5:1;%rapport signal sur bruit
BER = zeros(4, length(Eb_N0_dB));%taux d'erreur binaire
FER = zeros(4, length(Eb_N0_dB));%taux d'erreur de trame
recordStr = [' SP', ' MS'];
diary 'mylog.txt'
clock;
%Le code effectue une boucle sur différentes valeurs d'Eb/N0, où il génère des messages d'information, les code en utilisant la matrice H, les transmet à travers un canal AWGN (Additive White Gaussian Noise), puis tente de les décoder en utilisant deux algorithmes de décodage LDPC : Sum-Product (SP) et Min-Sum (MS).
%Le code compte les erreurs binaires (bits mal décodés) et les erreurs de trame (trames mal décodées) pour chaque valeur d'Eb/N0.
%La boucle s'arrête lorsque le nombre maximum d'erreurs de trame est atteint.
for Eb_N0_i = 1:1:length(Eb_N0_dB)
disp(['Eb/N0=' num2str(Eb_N0_dB(Eb_N0_i)) 'dB is simulating...']);%Les taux d'erreur binaire (BER) sont enregistrés dans un fichier Excel.
if Eb_N0_dB(Eb_N0_i) <= 1
maxErrorBlocks = 50;
else
maxErrorBlocks = 3;
end
% nbr d'iteration
iterMax = 10;
maxBlocks = 10^6;
ErrorBits_SP = 0; ErrorBits_MS = 0;
ErrorBlocks_SP = 0; ErrorBlocks_MS = 0;
blocks_SP = 0;blocks_MS = 0;
% BPSK - AWGN
for i = 1:1:maxBlocks
recordStr = [];
s = randi([0, 1], 1, 1008);
x = Encoder2(Hs, Hp, s);
if sum(mod(H*(x'), 2)) > 0
sprintf('the '+ num2str(i) + ' th encoding is not right');
continue;
end
SNR_MAX=15;
N=100000; %longueur des symboles transmis
v=zeros(6,N);
z=1;
for k=7:SNR_MAX
k
ERROR=0;
% Loop=0;
%while ERROR<500
% Loop=Loop+1;
A=randint(6,N);%Génération d'une matrice aléatoire A de dimensions 6xN contenant des symboles binaires
for i=1:N
snr=10.^(k/10);
sig=0.5/snr;%variance du bruit
Ns=sqrt(sig).*(randn(1,2)+1i*randn(1,2)); %Génère un bruit gaussien complexe
%------------------------------%
a33=GMapping(A(1,i),A(2,i),A(3,i));
a44=GMapping(A(4,i),A(5,i),A(6,i));
%---------------------------------%
%channel AWGN
h=(randn(1,2)+1i*randn(1,2))./sqrt(2); %the variance of hij=0.5
r1= h(1)*a33+h(2)*a44+Ns(1,1);
r2= -h(1)*conj(a44)+h(2)*conj(a33)+Ns(1,2);
%--------------------------------%
%Les fonctions closestvector et IGmapping sont utilisées pour décoder les symboles reçus
%et stocker les résultats dans la matrice v
[a333,a444]=closestvector(h(1),h(2),r1,r2);
[p1,p2,p3]=IGmapping(real(a333),imag(a333));
[p4,p5,p6]=IGmapping(real(a444),imag(a444));
v(1,i)=p1;v(2,i)=p2;v(3,i)=p3;v(4,i)=p4;v(5,i)=p5;v(6,i)=p6;
end
v(:,:);
% BPSK
% d = 1 - 2.*x;
% AWGN
SNR_dB = Eb_N0_dB(Eb_N0_i) + 10*log10(R) - 10*log10(1/2);
SNR_linear = 10^(SNR_dB/10);
sigma = sqrt(1/SNR_linear);
y = r2 + sigma*randn(size(r2));
LLR_y = 2*y/(sigma^2);
if ErrorBlocks_SP <= maxErrorBlocks
v_SP = LDPCDecoder_SP( H, LLR_y, iterMax );
errorbits_SP = sum(s ~= v_SP);
ErrorBits_SP = ErrorBits_SP + errorbits_SP;
blocks_SP = blocks_SP + 1;
if errorbits_SP ~= 0
ErrorBlocks_SP = ErrorBlocks_SP + 1;
end
recordStr = [recordStr ' SP'];
end
if ErrorBlocks_MS <= maxErrorBlocks
v_MS = LDPCDecoder_MS( H, LLR_y, iterMax );
errorbits_MS = sum(s ~= v_MS);
ErrorBits_MS = ErrorBits_MS + errorbits_MS;
blocks_MS = blocks_MS + 1;
if errorbits_MS ~= 0
ErrorBlocks_MS = ErrorBlocks_MS + 1;
end
recordStr = [recordStr ' MS'];
end
disp([' the ' num2str(i) '-th frame of encoding & decoding has finished based on Eb/N0 = ' num2str(Eb_N0_dB(Eb_N0_i)) ', ' recordStr ' is still running.']);
if ErrorBlocks_SP > maxErrorBlocks && ErrorBlocks_MS
break;
end
end
BER(1, Eb_N0_i) = ErrorBits_SP/(K * blocks_SP);
BER(2, Eb_N0_i) = ErrorBits_MS/(K * blocks_MS);
end
for p=1:6
for i=1:N
if A(p,i)~=v(p,i);
%compte les erreurs de décodage en comparant
%les symboles transmis avec les symboles décodés et les stocke dans la variable ERROR.
ERROR=ERROR+1;
end
end
end
% end
%ERROR
%Les taux d'erreur binaire (BER) sont calculés pour chaque valeur de k et stockés dans le vecteur ber
ber(z)=ERROR/(6*N);
z=z+1;
save Simulation_STBC_2x1_29_06_2011 ber;
end
ber1=ber;
Snr=7:SNR_MAX;
figure(1)
semilogy(Snr,ber1,'b-o','LineWidth',2.75);
xlabel('SNR(dB)');ylabel('BER');legend('STBC'),
title('STBC 2x1 with 8PSK');
grid;
figure(2)
figure('numbertitle','off','name','BER of 4 Decode algorithms')
semilogy(Eb_N0_dB, BER(1, :), 'K-^', 'LineWidth', 1.0, 'MarkerSize', 6); hold on;
semilogy(Eb_N0_dB, BER(2, :), 'R-o', 'LineWidth', 1.0, 'MarkerSize', 6); hold on;
xlabel('SNR'); ylabel('BER');
legend('BER - SP', 'BER - MS');
grid on;
0 Comments
Answers (0)
See Also
Categories
Find more on Link-Level Simulation in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!