TP-telecommunications/TP2/chaine_bonus.m
2023-06-20 21:23:24 +02:00

65 lines
1.8 KiB
Matlab

clear;
close all;
Fe = 24000; % Hz
Te = 1/Fe; % s
N = 1000; % nombre de bits envoyés
Rb = 3000; % débit binaire
bits = randi([0, 1], 1, N); % bits envoyés
M = 2^1; % signal binaire
Ts = log2(M)/Rb; % période symbole
Ns = floor(Ts/Te);
T = (0:N*Ns/log2(M)-1) * Te; % échelle temporelle
span = 10; % largeur du racine de cosinus surélevé
h = ones(1, Ns); % mise en forme: réponse impulsionnelle rectangulaire
%h = rcosdesign(0.5, span, Ns); % mise en forme: racine de cosinus surélevé
h_c = [ 1 zeros(1, Ns-1) 0.5 ]; % propagation: sélectif
h_r = h; % réception: racine de cosinus surélevé
g = conv(conv(h, h_c), h_r); % réponse impulsionnelle globale
n0 = 1; % déterminé en traçant g
figure;
plot(g);
title("Tracé de g");
ylabel("Amplitude");
X_m = 2 * bits - 1; % mapping binaire à moyenne nulle
X_k = kron(X_m, [1 zeros(1, Ns-1)]); % Suréchantillonnage
X_k = [ X_k zeros(1, span*Ns) ]; % on rajoute des zéros pour le retard
X_f = filter(h, 1, X_k); % signal émis
X_c = filter(h_c, 1, X_f); % signal transmis
X_r = filter(h_r, 1, X_c); % signal reçu
X_r = X_r(span*Ns+1 : length(X_r)); % on supprime le retard
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");
xlabel("Temps (s)");
ylabel("Amplitude");
X_e = X_r( n0:Ns:N*Ns ); % échantillonage du signal reçu
recu = double( X_e > 0 ); % on récupère les bits, décision + "démapping"
erreur = mean((recu - bits).^2); % on calcule l'erreur
pause;
close all;
figure;
hold;
padding = 2^10;
F = [0:1/padding:1-1/padding]*Fe;
plot( F, normalize(abs(fft(conv(h, h_r), padding)), 'range') );
plot( F, normalize(abs(fft(h_c, padding)), 'range') );
xlabel('Fréquence (Hz)');
ylabel('Amplitude');
legend('|H H_r|', '|H_c|');
title("Critère de Nyquist en fréquentiel");