problem to concatene 2 code Malab
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;
Answers (0)
Categories
Find more on PHY Components 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!