107 lines
3.1 KiB
Matlab
107 lines
3.1 KiB
Matlab
clear;
|
|
close all;
|
|
|
|
Fe = 24000; % Hz
|
|
Te = 1/Fe; % s
|
|
N = 5000; % nombre de bits envoyés
|
|
Rb = 6000; % débit binaire
|
|
|
|
bits = randi([0, 1], 1, N); % bits envoyés
|
|
|
|
M = 2^2; % signal 4-aire
|
|
Ts = log2(M)/Rb; % période symbole
|
|
Ns = floor(Ts/Te);
|
|
T = (0:N*Ns/log2(M)-1) * Te; % échelle temporelle
|
|
|
|
h = ones(1, Ns); % mise en forme: réponse impulsionnelle rectangulaire
|
|
h_c = [ 1 zeros(1, Ns-1) ]; % propagation: dirac
|
|
h_r = h; % réception: réponse impulsionnelle rectangulaire
|
|
|
|
n0 = 8; % déterminé en traçant g
|
|
|
|
%% tracé de g
|
|
g = conv(conv(h, h_c), h_r); % réponse impulsionnelle globale
|
|
|
|
figure;
|
|
plot(g);
|
|
title("Tracé de g");
|
|
ylabel("Amplitude");
|
|
|
|
%% chaine de transmission
|
|
X_re = reshape(bits, 2, N/2).'; % on regroupe pour avoir un symbole 4-aire
|
|
X_d = bi2de(X_re); % conversion en décimaux
|
|
X_m = X_d*2 - 3; % mapping 4-aire à moyenne nulle
|
|
X_k = kron(X_m', [1 zeros(1, Ns-1)]); % Suréchantillonnage
|
|
X_f = filter(h, 1, X_k); % signal émis
|
|
X_c = filter(h_c, 1, X_f); % signal transmis
|
|
|
|
%% tracé du diagramme de l'oeil du signal non bruité
|
|
X_r = filter(h_r, 1, X_c); % signal reçu, sans bruit
|
|
figure;
|
|
oeil = reshape(X_r, Ns, length(X_r)/Ns); % permet de tracer le diagramme de l'oeil, on retrouve n0 = 8
|
|
plot(oeil);
|
|
title("Diagramme de l'oeil, signal non bruité");
|
|
xlabel("Temps (s)");
|
|
ylabel("Amplitude");
|
|
|
|
%% tracé de TEB = f(E_b/N_0)
|
|
P_x = mean(abs(X_c).^2);
|
|
EbN0_db = linspace(0, 8, 200);
|
|
EbN0 = 10.^(EbN0_db./10);
|
|
TEBs = [];
|
|
TESs = [];
|
|
for e=EbN0
|
|
|
|
sigma2_x = P_x * Ns / (2 * log2(M) * e); % calcul de sigma^2
|
|
X_b = X_c + sqrt(sigma2_x) * randn(1, length(X_c)); % signal bruité
|
|
X_r = filter(h_r, 1, X_b); % signal reçu
|
|
|
|
X_e = X_r( n0:Ns:N*Ns/log2(M) ); % échantillonage du signal reçu
|
|
|
|
decision = 3*( X_e >= 16 ) + 1*( X_e >= 0 & X_e < 16 ) + -1*( X_e < 0 & X_e > -16 ) + -3*( X_e <= -16 ); % decision
|
|
TES = mean(((decision+3)/2 - (X_m'+3)/2).^2); % on calcule l'erreur symbole
|
|
|
|
recu = reshape(de2bi((decision + 3)/2).', 1, N); % demapping + conversion en binaire
|
|
TEB = mean((recu - bits).^2); % on calcule l'erreur binaire
|
|
|
|
TESs = [ TESs TES ];
|
|
TEBs = [ TEBs TEB ];
|
|
|
|
end
|
|
|
|
TEB_Gray = TESs / log2(M);
|
|
|
|
TES_theorique = 3/2*qfunc(sqrt(4/5*EbN0));
|
|
TEB_theorique = 3/4*qfunc(sqrt(4/5*EbN0));
|
|
TEB_theorique_ref = qfunc(sqrt(2*EbN0));
|
|
|
|
figure;
|
|
semilogy(EbN0_db, TESs, '+');
|
|
hold;
|
|
semilogy(EbN0_db, TEBs, '+');
|
|
%semilogy(EbN0_db, TEB_Gray, '+');
|
|
plot(EbN0_db, TES_theorique);
|
|
plot(EbN0_db, TEB_theorique);
|
|
plot(EbN0_db, TEB_theorique_ref);
|
|
title("TEB = f(E_b/N_0)");
|
|
xlabel("E_b/N_0 (dB)");
|
|
ylabel("erreur (dB)");
|
|
legend("TES numérique", "TEB numérique", "TES théorique", "TEB théorique", "TEB référence");
|
|
|
|
%% tracé de plusieurs diagrammes de l'oeil
|
|
EbN0_db = linspace(0, 12, 4);
|
|
for e=EbN0_db
|
|
|
|
sigma2_x = P_x * Ns / (2 * log2(M) * 10^(e/10)); % calcul de sigma^2
|
|
X_b = X_c + sqrt(sigma2_x) * randn(1, length(X_c)); % signal bruité
|
|
X_r = filter(h_r, 1, X_b); % signal reçu
|
|
|
|
figure;
|
|
oeil = reshape(X_r, Ns, length(X_r)/Ns); % permet de tracer le diagramme de l'oeil
|
|
plot(oeil);
|
|
title("Diagramme de l'oeil, E_b/N_0 = " + num2str(e) + " dB");
|
|
xlabel("Temps (s)");
|
|
ylabel("Amplitude");
|
|
|
|
end
|