This commit is contained in:
Laureηt 2023-06-20 21:23:24 +02:00
commit 1ec868417a
Signed by: Laurent
SSH key fingerprint: SHA256:kZEpW8cMJ54PDeCvOhzreNr4FSh6R13CMGH/POoO8DI
42 changed files with 2739 additions and 0 deletions

BIN
TP1-2-questions.pdf Normal file

Binary file not shown.

BIN
TP1-2.pdf Normal file

Binary file not shown.

48
TP1/TP1_1.m Normal file
View file

@ -0,0 +1,48 @@
clear;
close all;
Fe = 24000;
Te = 1/Fe;
Rb = 6000;
M = 2^1;
Ts = log2(M)/Rb;
Ns = floor(Ts/Te);
N = 20;
bits = randi([0, 1], 1, N);
T = (0:N*Ns/log2(M)-1) * Te;
X_m = 2 * bits - 1; % mapping
X_k = kron(X_m, [1 zeros(1, Ns-1)]); % Suréchantillonnage
h = ones(1, Ns); % réponse impulsionnelle rectangulaire
X_f = filter(h, 1, X_k); % produit de convolution (filtrage)
figure;
plot(T, X_f);
title("Signal transmis via le modulateur 1");
xlabel("Secondes (s)");
ylabel("Amplitude");
ylim([ -1.1 1.1 ]);
F = linspace(0, Fe/2, N);
DSP_theorique = sinc(Ts*F).^2;
DSP_numerique = pwelch(X_f);
F_num = linspace(0, Fe/2, length(DSP_numerique));
figure;
plot(F_num, DSP_numerique/max(smoothdata(DSP_numerique)));
hold;
plot(F, DSP_theorique);
title("DSP du signal transmis via le modulateur 1 et son équivalent théorique");
xlabel("Fréquence (Hz)");
ylabel("Amplitude");
ylim([ 0 2 ]);
legend("DSP numérique", "DSP théorique");

50
TP1/TP1_2.m Normal file
View file

@ -0,0 +1,50 @@
clear;
close all;
Fe = 24000;
Te = 1/Fe;
Rb = 6000;
M = 2^2;
Ts = log2(M)/Rb;
Ns = floor(Ts/Te);
N = 20;
bits = randi([0, 1], 1, N);
T = (0:N*Ns/log2(M)-1) * Te;
X_r = reshape(bits, 2, N/2).'; % on regroupe pour avoir un symbole 4-aire
X_d = bi2de(X_r); % conversion en décimaux
X_m = X_d*2 - 3; % mapping
h = ones(1, Ns); % réponse impulsionnelle rectangulaire
X_k = kron(X_m.', [1 zeros(1, Ns-1)]); % Suréchantillonnage
X_f = filter(h, 1, X_k); % produit de convolution (filtrage)
figure;
plot(T, X_f);
title("Signal transmis via le modulateur 2");
xlabel("Secondes (s)");
ylabel("Amplitude");
ylim([ -3.1 3.1 ]);
F = linspace(0, Fe/2, N);
DSP_theorique = sinc(Ts*F).^2;
DSP_numerique = pwelch(X_f);
F_num = linspace(0, Fe/2, length(DSP_numerique));
figure;
plot(F_num, DSP_numerique/max(smoothdata(DSP_numerique)));
hold;
plot(F, DSP_theorique);
title("DSP du signal transmis via le modulateur 2 et son équivalent théorique");
xlabel("Fréquence (Hz)");
ylabel("Amplitude");
ylim([ 0 2 ]);
legend("DSP numérique", "DSP théorique");

48
TP1/TP1_3.m Normal file
View file

@ -0,0 +1,48 @@
clear;
close all;
Fe = 24000;
Te = 1/Fe;
Rb = 6000;
M = 2^1;
Ts = log2(M)/Rb;
Ns = floor(Ts/Te);
N = 20;
bits = randi([0, 1], 1, N);
T = (0:N*Ns/log2(M)-1) * Te;
X_m = bits * 2 -1; % mapping
X_k = kron(X_m, [1 zeros(1, Ns-1)]); % Suréchantillonnage
h = [ones(1, Ns/2) -ones(1, Ns/2)]; % réponse impulsionnelle de type front
X_f = filter(h, 1, X_k); % produit de convolution (filtrage)
figure;
plot(T, X_f);
title("Signal transmis via le modulateur 3");
xlabel("Secondes (s)");
ylabel("Amplitude");
ylim([ -1.1 1.1 ]);
F = linspace(0, Fe/2, N);
DSP_theorique = 2 * (sin(pi*Ts*F/2).^2 ./ (pi*Ts*F/2) ).^2;
DSP_numerique = pwelch(X_f);
F_num = linspace(0, Fe/2, length(DSP_numerique));
figure;
plot(F_num, DSP_numerique/max(smoothdata(DSP_numerique))*1.2);
hold;
plot(F, DSP_theorique);
title("DSP du signal transmis via le modulateur 3 et son équivalent théorique");
xlabel("Fréquence (Hz)");
ylabel("Amplitude");
ylim([ 0 2 ]);
legend("DSP numérique", "DSP théorique");

59
TP1/TP1_4.m Normal file
View file

@ -0,0 +1,59 @@
clear;
close all;
Fe = 24000;
Te = 1/Fe;
Rb = 6000;
M = 2^1;
Ts = log2(M)/Rb;
Ns = floor(Ts/Te);
N = 20;
bits = randi([0, 1], 1, N);
T = (0:N*Ns/log2(M)-1) * Te;
X_m = 2 * bits - 1; % mapping
X_k = kron(X_m, [1 zeros(1, Ns-1)]); % Suréchantillonnage
h = rcosdesign(0.5, 8, Ns); % réponse impulsionnelle en racine de cosinus surélevé.
X_f = filter(h, 1, X_k); % produit de convolution (filtrage)
figure;
plot(T, X_f);
title("Signal transmis via le modulateur 4");
xlabel("Secondes (s)");
ylabel("Amplitude");
%ylim([ -1.1 1.1 ]);
F = linspace(0, Fe/2, N);
alpha = 0.5;
sigma = 1;
indices = abs(F) < (1-alpha)/2/Ts;
DSP_theorique = indices(indices);
indices = (1-alpha)/2/Ts < abs(F) & abs(F) < (1+alpha)/2/Ts;
DSP_theorique = [ DSP_theorique, indices(indices) .* (1 + cos( pi*Ts/alpha .* ( abs(F(indices)) - (1-alpha)/2/Ts ) ))/2 ];
DSP_theorique = [ DSP_theorique, zeros(1, N-length(DSP_theorique)) ];
DSP_theorique = DSP_theorique*sigma;
DSP_numerique = pwelch(X_f);
F_num = linspace(0, Fe/2, length(DSP_numerique));
figure;
plot(F_num, DSP_numerique/max(smoothdata(DSP_numerique)));
hold;
plot(F, DSP_theorique);
title("DSP du signal transmis via le modulateur 4 et son équivalent théorique");
xlabel("Fréquence (Hz)");
ylabel("Amplitude");
%ylim([ 0 1 ]);
legend("DSP numérique", "DSP théorique");

80
TP1/TP1_all.m Normal file
View file

@ -0,0 +1,80 @@
clear;
close all;
Fe = 24000;
Te = 1/Fe;
N = 1000000;
bits = randi([0, 1], 1, N);
Rb = 6000;
% modulateur 1
M = 2^1;
Ts = log2(M)/Rb;
Ns = floor(Ts/Te);
T = (0:N*Ns/log2(M)-1) * Te;
X_m = 2 * bits - 1; % mapping
X_k = kron(X_m, [1 zeros(1, Ns-1)]); % Suréchantillonnage
h = ones(1, Ns); % réponse impulsionnelle rectangulaire
X_f = filter(h, 1, X_k); % produit de convolution (filtrage)
DSP_numerique = smoothdata(pwelch(X_f));
F_num = linspace(0, Fe/2, length(DSP_numerique));
plot(F_num, DSP_numerique/max(DSP_numerique));
hold;
% modulateur 2
M = 2^2;
Ts = log2(M)/Rb;
Ns = floor(Ts/Te);
T = (0:N*Ns/log2(M)-1) * Te;
X_r = reshape(bits, 2, N/2).'; % on regroupe pour avoir un symbole 4-aire
X_d = bi2de(X_r); % conversion en décimaux
X_m = X_d*2 - 3; % mapping
h = ones(1, Ns); % réponse impulsionnelle rectangulaire
X_k = kron(X_m.', [1 zeros(1, Ns-1)]); % Suréchantillonnage
X_f = filter(h, 1, X_k); % produit de convolution (filtrage)
DSP_numerique = smoothdata(pwelch(X_f));
F_num = linspace(0, Fe/2, length(DSP_numerique));
plot(F_num, DSP_numerique/max(DSP_numerique));
% modulateur 3
M = 2^1;
Ts = log2(M)/Rb;
Ns = floor(Ts/Te);
T = (0:N*Ns/log2(M)-1) * Te;
X_m = bits * 2 -1; % mapping
X_k = kron(X_m, [1 zeros(1, Ns-1)]); % Suréchantillonnage
h = [ones(1, Ns/2) -ones(1, Ns/2)]; % réponse impulsionnelle de type front
X_f = filter(h, 1, X_k); % produit de convolution (filtrage)
DSP_numerique = smoothdata(pwelch(X_f));
F_num = linspace(0, Fe/2, length(DSP_numerique));
plot(F_num, DSP_numerique/max(DSP_numerique));
% modulateur 4
M = 2^1;
Ts = log2(M)/Rb;
Ns = floor(Ts/Te);
T = (0:N*Ns/log2(M)-1) * Te;
X_m = 2 * bits - 1; % mapping
X_k = kron(X_m, [1 zeros(1, Ns-1)]); % Suréchantillonnage
h = rcosdesign(0.5, 8, Ns); % réponse impulsionnelle en racine de cosinus surélevé.
X_f = filter(h, 1, X_k); % produit de convolution (filtrage)
DSP_numerique = smoothdata(pwelch(X_f));
F_num = linspace(0, Fe/2, length(DSP_numerique));
plot(F_num, DSP_numerique/max(DSP_numerique));
% details
title("DSP des signaux transmis");
xlabel("Fréquence (Hz)");
ylabel("Amplitude");
ylim([ 0 1.5 ]);
legend("Modulateur 1", "Modulateur 2", "Modulateur 3", "Modulateur 4");

BIN
TP1/rapport.pdf Normal file

Binary file not shown.

97
TP1/rapport.tex Normal file
View file

@ -0,0 +1,97 @@
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{color}
\usepackage[french]{babel}
\usepackage[hidelinks=true]{hyperref}
\usepackage{mathtools}
\usepackage[nottoc, numbib]{tocbibind}
\usepackage[
top=1.5cm,
bottom=1.5cm,
left=1.5cm,
right=1.5cm
]{geometry}
\setlength{\parskip}{0.2cm}
\begin{document}
\begin{figure}[t]
\centering
\includegraphics[width=5cm]{inp_n7.png}
\end{figure}
\title{\vspace{4cm} \textbf{Compte-rendu de TP} \\ Introduction aux communications numériques \\
Étude des modulateurs bande de base \vspace{2cm}}
\author{Laurent Fainsin}
\date{\vspace{7cm} Département Sciences du Numérique \\
Première année \\
2020 — 2021 }
\maketitle
\newpage
% utiliser les mêmes bits pour les tracés du signal TODO
% fix dsp3 -> mettre à 1
\begin{figure}[ht!]
\hspace{-2.5cm}
\begin{tabular}{cc}
\hspace{1.1cm}
\includegraphics[width=9.7cm]{signal_1_trim.png} &
\includegraphics[width=9.7cm]{DSP_1_trim.png} \\
\hspace{1.1cm}
\includegraphics[width=9.7cm]{signal_2_trim.png} &
\includegraphics[width=9.7cm]{DSP_2_trim.png} \\
\hspace{1.1cm}
\includegraphics[width=9.7cm]{signal_3_trim.png} &
\includegraphics[width=9.7cm]{DSP_3_trim.png} \\
\hspace{1.1cm}
\includegraphics[width=9.7cm]{signal_4_trim.png} &
\includegraphics[width=9.7cm]{DSP_4_trim.png} \\
\end{tabular}
\caption{Signal et DSP de chaque modulateur \label{fig : plot_all}}
\end{figure}
\newpage
\begin{figure}[ht!]
\hspace{-2.4cm}
\includegraphics[width=22cm]{DSP_all.png}
\caption{DSP (lissées) des quatres modulateurs \label{fig : dsp_all}}
\end{figure}
\vspace{1cm}
Question 1 : Quel est le classement des modulateurs par ordre defficacité spectrale décroissante ?
Grâce à la figure \ref{fig : dsp_all}, les modulateurs bande de base étudiés rangés par ordre defficacité spectrale décroissant sont:
\begin{enumerate}
\item Modulateur 2: symboles 4-aires à moyenne nulle, réponse impulsionnelle rectangulaire.
\item Modulateur 4: symboles binaires à moyenne nulle, réponse impulsionnelle en racine de cosinus surélevé.
\item Modulateur 1: symboles binaires à moyenne nulle, réponse impulsionnelle rectangulaire.
\item Modulateur 3: symboles binaires à moyenne nulle, réponse impulsionnelle de type front.
\end{enumerate}
\vspace{1cm}
Question 2 : Quels sont les éléments dun modulateur bande de base qui agissent sur lefficacité spectrale obtenue pour la transmission et de quelle manière ?
À partir de la figure \ref{fig : plot_all} on peut faire les remarques suivante:
\begin{itemize}
\item Utiliser des symboles 4-aires au lieu de symboles binaires permet de diviser par 2 la bande spectrale (cette différence est visible avec les modulateur 1 et 2).
\item Utiliser une réponse impulsionnelle de type front permet de supprimer les composantes fréquentielles basse, ceci peut être pratique dans certains cas (cela est visible sur le modulateur 3).
\item Une réponse impulsionnelle en racine de cosinus surélevé possède une meilleure bande spectrale qu'une simple réponse impulsionnelle rectangulaire, car son amplitude est nulle à partir d'une certaine fréquence (cela est visible avec les modulateurs 1 et 4).
\end{itemize}
\end{document}

BIN
TP2-questions.pdf Normal file

Binary file not shown.

BIN
TP2.pdf Normal file

Binary file not shown.

51
TP2/chaine1_1.m Normal file
View file

@ -0,0 +1,51 @@
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
fc = 4000; % fréquence de coupure, BW
ordre = 100; % ordre du filtre
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
g = conv(conv(h, h_c), h_r); % réponse impulsionnelle globale
n0 = 8; % 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_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çup
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

61
TP2/chaine1_2.m Normal file
View file

@ -0,0 +1,61 @@
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
fc = 4000; % fréquence de coupure, BW
ordre = 100; % ordre du filtre
h = ones(1, Ns); % mise en forme: réponse impulsionnelle rectangulaire
h_c = (2*fc/Fe)*sinc(2*fc*[-(ordre-1)*Te/2 : Te : (ordre-1)*Te/2]); % propagation: bande limitée BW
h_r = h; % réception: réponse impulsionnelle rectangulaire
g = conv(conv(h, h_c), h_r); % réponse impulsionnelle globale
n0 = 8; % 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, ordre/2) ]; % 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çup
X_r = X_r(ordre/2+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
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, abs(fft(h_c, padding)) );
xlabel('Fréquence (Hz)');
ylabel('Amplitude');
legend('|H H_r|', '|H_c|');
title(strcat("Critère de Nyquist en fréquentiel pour BW = ", num2str(fc)));

52
TP2/chaine2_1.m Normal file
View file

@ -0,0 +1,52 @@
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
fc = 4000; % fréquence de coupure, BW
ordre = 100; % ordre du filtre
span = 10; % largeur du racine de cosinus surélevé
h = rcosdesign(0.5, span, Ns); % mise en forme: racine de cosinus surélevé
h_c = [ 1 zeros(1, Ns-1) ]; % propagation: dirac
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

61
TP2/chaine2_2.m Normal file
View file

@ -0,0 +1,61 @@
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
fc = 1000; % fréquence de coupure, BW
ordre = 100; % ordre du filtre
span = 10; % largeur du racine de cosinus surélevé
h = rcosdesign(0.5, span, Ns); % mise en forme: racine de cosinus surélevé
h_c = (2*fc/Fe)*sinc(2*fc*[-(ordre-1)*Te/2 : Te : (ordre-1)*Te/2]); % propagation: bande limitée BW
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 + ordre/2) ]; % 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 + ordre/2: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
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, abs(fft(h_c, padding)) );
xlabel('Fréquence (Hz)');
ylabel('Amplitude');
legend('|H H_r|', '|H_c|');
title(strcat("Critère de Nyquist en fréquentiel pour BW = ", num2str(fc)));

64
TP2/chaine_bonus.m Normal file
View file

@ -0,0 +1,64 @@
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");

BIN
TP2/rapport.pdf Normal file

Binary file not shown.

198
TP2/rapport.tex Normal file
View file

@ -0,0 +1,198 @@
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{color}
\usepackage[french]{babel}
\usepackage[hidelinks=true]{hyperref}
\usepackage{mathtools}
\usepackage[nottoc, numbib]{tocbibind}
\usepackage[
top=1.5cm,
bottom=1.5cm,
left=1.5cm,
right=1.5cm
]{geometry}
\setlength{\parskip}{0.2cm}
\begin{document}
\begin{figure}[t]
\centering
\includegraphics[width=5cm]{inp_n7.png}
\end{figure}
\title{
\vspace{4cm}
\textbf{Compte-rendu de TP} \\
Introduction aux communications numériques \\
Étude de linterférence entre symbole et du critère de Nyquist
}
\author{Laurent Fainsin}
\date{
\vspace{7cm}
Département Sciences du Numérique \\
Première année \\
2020 — 2021
}
\maketitle
\newpage
\tableofcontents
\newpage
\section{Étude sans canal de propagation: bloc modulateur/démodulateur}
\subsection{Expliquez comment sont obtenus les instants optimaux déchantillonnage}
Pour sélectionner l'instant initial $n_0$ optimal à l'échantillonage, on cherche à vérifier la condition de Nyquist. Pour cela on peut tracer $g$ ou le diagramme de l'oeil du signal.
\begin{figure}[ht!]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{g_1_1_trim.png} &
\includegraphics[width=9.5cm]{oeil_1_1_trim.png} \\
\end{tabular}
\caption{Vérification de $n_0$ pour la chaine 1 \label{fig : 1_1}}
\end{figure}
Ainsi, grâce à ces tracés, on remarque que pour vérifier la condition de Nyquist avec une chaine dont la réponse impulsionnelle est
rectangulaire (et sans canal de propagation), il faut $n_0 = 8$.
On cherche plus particulièrement l'instant $n_0$ tel que : \\
$\left\{
\begin{array}{l}
g(n_0) \neq 0 \\
g(n_0 + kN_S) = 0
\end{array}
\right.$, $n_0 = 8$ est donc conforme à cet instant.
De même sur le diagramme de l'oeil cette vérification s'effectue par la recherche d'un $n_0$ tel que le tracé converge vers deux valeurs uniques (puisque ici nous avons un signal binaire).
\begin{figure}[ht!]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{g_2_1_trim.png} &
\includegraphics[width=9.5cm]{oeil_2_1_trim.png} \\
\end{tabular}
\caption{Vérification de $n_0$ pour la chaine 2 \label{fig : 2_1}}
\end{figure}
Ainsi pour la chaine avec une réponse impulsionnelle
en racine de cosinus surélevé de roll off $\alpha = 0.5$, il faut $n_0 = 1$.
\subsection{Expliquez pourquoi le taux derreur binaire nest plus nul avec $n_0 = 3$}
Si on ne sélectionne pas l'instant optimal trouvé via la question précédente, alors il y a lors de l'échantillonage des interférences inter-symboles qui viennent fausser la phase de décision (puisque la condition de Nyquist n'est pas respectée).
\newpage
\section{Étude avec canal de propagation sans bruit}
\subsection{Le critère de Nyquist peut-il être vérifié avec BW = 4000 Hz ?}
\subsubsection{Chaine 1}
\begin{figure}[ht!]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{g_1_2_4000_trim.png} &
\includegraphics[width=9.5cm]{oeil_1_2_4000_trim.png} \\
\end{tabular}
\caption{Vérification de $n_0$ pour la chaine 1 \label{fig : 1_2_1000}}
\end{figure}
\begin{figure}[ht!]
%\hspace{-1cm}
\centering
\includegraphics[width=9.5cm]{nyquist_1_2_4000_trim.png}
\caption{Vérification de Nyquist fréquentiel pour la chaine 1 \label{fig : nyquist_1_4000}}
\end{figure}
On vérife dans un premier temps que l'instant optimal existe, celui-ci est toujours $n_0 = 8$.
Le critère de Nyquist en fréquentiel est: \\
$\displaystyle \sum_k^{+\infty} G^{(t_0)}(f - \frac{k}{T_S}) = Cte$
On sait d'après le cours qu'une telle somme de racine de cosinus surélevé est constante, de plus grâce à la Figure \ref{fig : nyquist_1_4000} on observe que le spectre de $| H H_r |$ est "inclus" (pas totalement mais presque) dans celui de $| H_c |$, on en déduit alors que le critère de Nyquist en fréquentiel est vérifié.
\newpage
\subsubsection{Chaine 2}
\begin{figure}[ht!]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{g_2_2_4000_trim.png} &
\includegraphics[width=9.5cm]{oeil_2_2_4000_trim.png} \\
\end{tabular}
\caption{Vérification de $n_0$ pour la chaine 2 \label{fig : 2_2_4000}}
\end{figure}
\begin{figure}[ht!]
%\hspace{-1cm}
\centering
\includegraphics[width=9.5cm]{nyquist_2_2_4000_trim.png}
\caption{Vérification de Nyquist fréquentiel pour la chaine 2 \label{fig : nyquist_2_4000}}
\end{figure}
On vérife dans un premier temps que l'instant optimal est toujours $n_0 = 1$.
Ensuite, on observe grâce à la Figure \ref{fig : nyquist_2_4000} que le spectre de $| H H_r |$ est inclus dans celui de $| H_c |$, on en déduit alors que le critère de Nyquist en fréquentiel est vérifié.
\newpage
\subsection{Le critère de Nyquist peut-il être vérifié avec BW = 1000 Hz ?}
\subsubsection{Chaine 1}
\begin{figure}[ht!]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{g_1_2_1000_trim.png} &
\includegraphics[width=9.5cm]{oeil_1_2_1000_trim.png} \\
\end{tabular}
\caption{Vérification de $n_0$ pour la chaine 1 \label{fig : 1_2_1000}}
\end{figure}
\begin{figure}[ht!]
%\hspace{-1cm}
\centering
\includegraphics[width=9.5cm]{nyquist_1_2_1000_trim.png}
\caption{Vérification de Nyquist fréquentiel pour la chaine 1 \label{fig : nyquist_1_1000}}
\end{figure}
Cette fois ci on observe avec le diagramme de l'oeil de la Figure \ref{fig : 1_2_1000} qu'il est impossible de trouver un $n_0$ tel que la condition temporelle de Nyquist soit vérifiée.
De même si l'on observe les spectres Figure \ref{fig : nyquist_1_1000}, on remarque que la condition de Nyquist en fréquentiel n'est pas respectée car le spectre de $| H H_r |$ n'est pas inclus dans celui de $| H_c |$.
\newpage
\subsubsection{Chaine 2}
\begin{figure}[ht!]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{g_2_2_1000_trim.png} &
\includegraphics[width=9.5cm]{oeil_2_2_1000_trim.png} \\
\end{tabular}
\caption{Vérification de $n_0$ pour la chaine 2 \label{fig : 2_2_1000}}
\end{figure}
\begin{figure}[ht!]
%\hspace{-1cm}
\centering
\includegraphics[width=9.5cm]{nyquist_2_2_1000_trim.png}
\caption{Vérification de Nyquist fréquentiel pour la chaine 2 \label{fig : nyquist_2_1000}}
\end{figure}
Cette fois ci on observe avec le diagramme de l'oeil de la Figure \ref{fig : 2_2_1000} qu'il est impossible de trouver un $n_0$ tel que la condition temporelle de Nyquist soit vérifiée.
De même si l'on observe les spectres Figure \ref{fig : nyquist_2_1000}, on remarque que la condition de Nyquist en fréquentiel n'est pas respectée car le spectre de $| H H_r |$ n'est pas inclus dans celui de $| H_c |$.
\end{document}

92
TP3/chaine_1.m Normal file
View file

@ -0,0 +1,92 @@
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^1; % signal binaire
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 = [ones(1, Ns/2) zeros(1, Ns/2)]; % réception: réponse échellon
n0 = 4; % 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_m = 2 * bits - 1; % mapping binaire à 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
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, 100);
EbN0 = 10.^(EbN0_db./10);
TEBs = [];
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 ); % échantillonage du signal reçu
recu = X_e > 0; % on récupère les bits, décision + "démapping"
TEB = mean((recu - bits).^2); % on calcule l'erreur
TEBs = [ TEBs TEB ];
end
TEB_theorique = qfunc(sqrt(EbN0));
TEB_theorique_ref = qfunc(sqrt(2*EbN0));
figure;
semilogy(EbN0_db, TEBs, '+');
hold;
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("TEB");
legend("TEB numérique", "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

106
TP3/chaine_2.m Normal file
View file

@ -0,0 +1,106 @@
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

479
TP3/chaine_ref.m Normal file
View file

@ -0,0 +1,479 @@
\documentclass[a4paper, 12pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{color}
\usepackage{xcolor}
\usepackage[french]{babel}
\usepackage[hidelinks]{hyperref}
\usepackage{mathtools}
\usepackage[nottoc, numbib]{tocbibind}
\usepackage{lipsum}
\usepackage{lscape}
\usepackage[justification=centering]{caption}
\usepackage{caption}
\usepackage{subcaption}
\usepackage{minted}
\usepackage{natbib}
\usepackage{multicol}
\newminted{bash}{numbersep=6pt}
\usepackage{contour}
\usepackage{ulem}
\renewcommand{\ULdepth}{1.8pt}
\contourlength{0.8pt}
\newcommand{\myuline}[1]{%
\uline{\phantom{#1}}%
\llap{\contour{white}{#1}}%
}
\newcommand{\dst}{\displaystyle}
\usepackage[
top=1.5cm,
bottom=1.5cm,
left=1.5cm,
right=1.5cm
]{geometry}
\setlength{\parskip}{0.2cm}
\setlength{\parindent}{0pt}
\begin{document}
\begin{figure}[t]
\centering
\includegraphics[width=5cm]{inp_n7.png}
\end{figure}
\title{
\vspace{4cm}
\textbf{Rapport de Projet} \\
Impact d'un canal de propagation sélectif en fréquence \\
et introduction à l'égalisation
\vspace{1cm}
\begin{figure}[H]
\centering
\includegraphics[width=10cm]{cover.png}
\label{cover}
\end{figure}
\vspace{2cm}
}
\author{
\myuline{Groupe I} \\
Fainsin Laurent \\
Heurtebise Tom \\
}
\date{
\vspace{3.5cm}
Département Sciences du Numérique \\
Première année \\
2020 2021
}
\maketitle
\newpage
\tableofcontents
\newpage
\section{Introduction et rappel du sujet}
Vous trouverez dans ce rapport les réponses aux questions posées par le sujet du projet \ref{fig: sujet} avec des figures venant appuyer nos propos. Le rapport se suffit à lui-même et ne nécessite aucun aller-retour entre le code matlab et ce dernier. Avant de vous présenter les résultats que nous avons obtenus nous vous proposons un bref rappel du sujet qui intègre des figures issues du sujet.
Le but de ce projet était d'étudier une chaine de transmission présentant un canal sélectif en fréquence, c'est-à-dire un canal pour lequel la réponse en fréquence de module constant sur la bande du filtre de Nyquist du filtre d'émission et de réception est perturbée par le filtre du canal.
On retrouve ce type de situation dans le cadre de transmissions terrestres présentant de nombreux obstacles comme sur la figure ci-dessous :
\begin{figure}[H]
\centering
\includegraphics[width=10cm]{sujet.png}
\caption{Propagation multi-trajet \label{sujet}}
\end{figure}
Ainsi sur la figure \ref{sujet}, on peut noter que tout se passe comme si le signal empruntait deux trajets différents de durée différente. La conséquence de ceci est l'apparition d'interférences dans le signal reçu. Ces dernières peuvent être atténuer par un processus que l'on nomme égalisation et que nous avons étudié dans la deuxième partie du projet.
\section{Impact d'un canal de propagation multitrajets}
\subsection{Etude théorique}
Dans cette section le sujet nous demandait de répondre à quelques questions théoriques sur la canal de propagation multitrajet.
\subsubsection{Écrire $y_e(t)$ en fonction de $x_e(t)$ et des paramètres du canal.}
La présence d'un seul obstacle sur la figure \ref{sujet} nous permet d'écrire $y_e$ comme la somme du signal en ligne directe et celle du signal retardé et atténué par l'obstacle:
$$ y_e(t) = \alpha_0 x (t - \tau_0) + \alpha_1 x (t - \tau_1) $$
\subsubsection{En déduire la réponse impulsionnelle $h_c(t)$ du canal passe-bas équivalent.}
\begin{align*}
y_e(t) &= \alpha_0 \delta(t - \tau_0) * x_e(t) + \alpha_1 \delta(t - \tau_1) * x_e(t) \\
&= (\alpha_0 \delta(t - \tau_0) + \alpha_1 \delta(t - \tau_1)) * x_e(t) \\
&= h_c(t) * x_e(t) \\
\implies h_c(t) &= \alpha_0 \delta(t - \tau_0) + \alpha_1 \delta(t - \tau_1) \\
\end{align*}
\subsubsection{Sans bruit, tracer le signal en sortie du filtre de réception $h_r(t)$\\
pour $\tau_0 = 0$, $\tau_1 = \tau_0 + T_s$, $\alpha_0 = 1$, $\alpha_1 = 0.5$ et $\text{bits} = 1110010$.}
Afin de répondre à cette question, nous avons d'abord du déterminer l'expression de $g(t)$.
\begin{align*}
g(t) &= h(t) * h_c(t) * h_r(t) = h(t) * h_r(t) * h_c(t) \\
&= \Pi_{T_s}\left( t - \dfrac{T_s}{2} \right) * \Pi_{T_s}\left( t - \dfrac{T_s}{2} \right) * (\alpha_0 \delta(t-\tau_0) + \alpha_1 \delta(t-\tau_1)) \\
&= T_s \Lambda_{T_s} (t - T_s) * (\alpha_0 \delta(t-\tau_0) + \alpha_1 \delta(t-\tau_1)) \\
&= \alpha_0 T_s \Lambda_{T_s} (t - T_s - \tau_0) + \alpha_1 \Lambda_{T_s} (t - T_s - \tau_1) \\
&= T_s \Lambda_{T_s} (t - T_s) + \dfrac{T_s}{2} \Lambda_{T_s} (t - 2T_s)
\end{align*}
En traçant $g(t)$ sur MATLAB on obtient la figure suivante :
\begin{figure}[H]
\centering
\includegraphics[width=12.5cm]{trim_g_selectif.png}
\caption{$g(t) = h(t) * h_c(t) * h_r(t)$}
\label{g_selectif}
\end{figure}
On peut donc déduire le signal en sortie du filtre de réception qui s'écrit d'après le cours :
$$ y_e(t) = \sum_k a_k g(t - k T_s)$$
Ce qui donne sur MATLAB :
\begin{figure}[H]
\centering
% todo pas encore fait
%\includegraphics[width=10cm]{trim_construct_reception.png}
\caption{Signal en sortie du filtre de réception pour la séquence 1110010}
\label{construct_reception}
\end{figure}
\subsubsection{Tracer le diagramme de loeil sans bruit en sortie du filtre de réception $h_r(t)$.\\
Est-il possible de respecter le critère de Nyquist sur cette chaine de transmission ?}
Voici le tracé que nous déduisons de celui qui précède :
\begin{figure}[H]
\centering
\includegraphics[width=10cm]{trim_oeil_selectif.png}
\caption{Diagramme de l'oeil théorique}
\label{oeil_selectif}
\end{figure}
On déduit de ce diagramme de l'oeil qu'il est impossible de respecter le critère de Nyquist puisqu'il n'existe pas de moment pour lequel on retrouve le codage des deux symboles de départ.
\subsubsection{En supposant que lon échantillonne à $t_0 +mT_s$ avec $t_0 = T_s$ \\
et que lon utilise un détecteur à seuil à 0 pour prendre les décisions, \\
calculer le TEB de la liaison en fonction de $T_s$ et $\sigma_w$, avec $\sigma^2_w$.}
Ici un symbole code un bit ($M=2$) on a donc $TEB = TES$. \\
Or, on sait que l'expression du TES est donnée par:
$$TES = P[a_k = -1] P[\hat{a_k} = +1\ |\ a_k = -1] + P[a_k = +1] P[\hat{a_k} = -1\ |\ a_k = +1] $$
On peut exprimer chacune des probabilités conditionnelles comme il suit:
\begin{align*}
P[\hat{a_k} = +1\ |\ a_k = -1] &= P[ \{ (\hat{a_k} = +1\ |\ a_k = -1) \wedge (a_{k-1} = -1) \} \lor \{ (\hat{a_k} = +1\ |\ a_k = -1) \wedge (a_{k-1} = +1) \} ] \\
&= P[a_{k-1} = -1] P[ (\hat{a_k} = +1\ |\ a_k = -1)\ |\ a_{k-1} = -1 ] \\
&\quad + P[a_{k-1} = +1] P[ (\hat{a_k} = +1\ |\ a_k = -1)\ |\ a_{k-1} = +1 ]
\end{align*}
De plus posons $\omega_m$ l'échantillon de bruit gaussien prélevé à l'instant $t_0 + mT_s$ et rappelons que nous avons fixé le seuil de décision à 0. D'après le cours nous avons que le signal en sortie de l'échantilloneur est $z(t) = a_k.c_k.g(t_0) + \omega_m$
avec les $c_k$ qui sont les amplitudes prises par le signal échantilloné. D'après le diagramme de l'oeil les 4 amplitudes possibles sont -1.5,-0.5, 0.5 et 1.5.\\
On a donc :
$ P[\hat{a_k} = +1\ |\ a_k = -1] &= P[a_{k-1} = - 1].P[-1.5\dfrac{T_s}{2} + \omega_m > 0]
+ P[a_{k-1} = +1].P[-0.4\dfrac{T_s}{2} + \omega_m > 0]$ \\
$$\Longleftrightarrow P[\hat{a_k} = +1\ |\ a_k = -1] = \dfrac{1}{2} Q\left(\dfrac{1.5T_s}{2\sigma_w} \right) + \dfrac{1}{2} Q\left(\dfrac{0.5T_s}{2\sigma_w}\right)$$
En procédant de façon analogue on trouve :
$$P[\hat{a_k} = -1\ |\ a_k = +1] = \dfrac{1}{2} Q\left(\dfrac{1.5T_s}{2\sigma_w} \right) + \dfrac{1}{2} Q\left(\dfrac{0.5T_s}{2\sigma_w}\right)$$\\
On en déduit donc que :
$$TEB = TES = \dfrac{1}{2} P[\hat{a_k} = +1\ |\ a_k = -1] + \dfrac{1}{2} P[\hat{a_k} = -1\ |\ a_k = +1] $$
$$ \Longleftrightarrow TEB = 2.\dfrac{1}{2} \left( \dfrac{1}{2} Q\left(\dfrac{1.5T_s}{2\sigma_w} \right) + \dfrac{1}{2}Q\left(\dfrac{0.5T_s}{2\sigma_w}\right) \right) $$
$$ \Longleftrightarrow TEB = \dfrac{1}{2} Q\left(\dfrac{1.5T_s}{2\sigma_w} \right) + \dfrac{1}{2} Q\left(\dfrac{0.5T_s}{2\sigma_w}\right)$$
\subsubsection{Calculer la puissance du bruit en sortie du filtre de réception $\sigma_w^2$ en fonction de $N_0$ et de $T_s$.}
Rappelons que la puissance du bruit en sortie du filtre de réception est donnée par l'expression suivante :
$$\sigma_w^2 = \int_{\mathbb{R}} S_r(f) df $$ avec $S_r(f)$ la densité spectrale du signal en sortie du filtre de réception. \\
Or on connaît l'expression de la densité spectrale du bruit à l'entrée de ce filtre. D'après les formules de Wienner-Lee, on a donc :
$$\sigma_w^2 = \int_{\mathbb{R}} |H_r(f)|^2 S_w(f) df $$ avec $S_w(f)$ la densité spectrale du bruit blanc. \\
On en déduit donc que : $$\sigma_w^2 = N_0 \int_{\mathbb{R}} |H_r(f)|^2 df $$ et finalement on peut conclure grâce à la formule de Parseval :
$$ \sigma_w^2 = N_0 \int_{\mathbb{R}} |h_r(t)|^2 dt = N_0.T_s$$
\subsubsection{Calculer l'énergie des symboles à lentrée du récepteur, $E_s$, en fonction de $T_s$.}
$$E_s = P_c.T_s$$ avec $P_c$ la puissance symbole reçue par le filtre de réception. Calculons donc $P_c$ : \\
Si on note $S_c$ la densité spectrale de puissance du signal à l'entrée du filtre de réception, on a :\\
$$ P_c = \int_{\mathbb{R}} S_c(f) df$$
Or le signal à l'entrée du filtre de réception s'écrit sous la forme suivante (en négligeant le bruit) :
$$x_c (t) = \Sigma_k a_k \delta(t- kT_s) *h(t)*h_c(t) $$\\
Or nous savons exprimer la densité spectrale d'une telle expression, grâce à la formule suivante (issue du cours) :
\begin{figure}[H]
\centering
\includegraphics[width=14cm]{forumle_cours.PNG}
\caption{Formule issue du cours numéro 1}
\label{oeil_selectif}
\end{figure}
Cette formule se simplifie puisque les symboles son indépendants et moyenne nulles ($a_k = \pm{1}$) et on a aisément que $\sigma_a^2 = 1$ :
$$ S_{c} (f) = \dfrac{|H_e(f)|^2}{T_s} $$ avec $H_e(f) = H(f).H_c(f)$ \\
On peut donc écrire :
$$ E_s = T_s \int_{\mathbb{R}} (S_c(f) df$$
$$\Longleftrightarrow E_s = T_s\int_{\mathbb{R}} \dfrac{|H_e(f)|^2}{T_s} df$$
$$\Longleftrightarrow E_s = \int_{\mathbb{R}} |H_e(f)|^2 df$$ et donc d'après Parseval :
$$\Longleftrightarrow E_s = \int_{\mathbb{R}} |h_e(t)|^2 dt$$
avec $h_e(t) = h(t)*h_c(t) = \alpha_0 \Pi_{T_s}(t) + \alpha_1\Pi_{T_s}(t-T_s)$
Il est aisé de donner la valeur de l'aire sous cette fonction (au carré) qui est :
$$\Longleftrightarrow E_s = \int_{\mathbb{R}} |h_e(t)|^2 dt = (1.T_s + 0.25 T_s)$$
$$\Longleftrightarrow E_s = 1.25 T_s$$
\subsubsection{Déduire des questions précédentes lexpression du taux derreur binaire (TEB) en fonction de $\dfrac{E_b}{N_0}$, rapport signal sur bruit par bit à lentrée du récepteur, pour la chaine étudiée}
Rappelons les trois résultats que nous venons d'obtenir :
$$ TEB = \dfrac{1}{2} Q\left(\dfrac{1.5T_s}{2\sigma_w} \right) + \dfrac{1}{2} Q\left(\dfrac{0.5T_s}{2\sigma_w}\right) (1) $$
$$ \sigma_w^2 = N_0 \int_{\mathbb{R}} |h_r(t)|^2 dt = N_0.T_s (2) $$
$$E_s = E_b= 1.25 T_s (3)$$
A partir de (3) on tire que $T_s = \dfrac{E_b}{1.25}$. De ce résultat et de (2) on obtient : $\sigma_w = \sqrt{\left(N_0\dfrac{E_b}{1.25}\right)}$\\
Enfin en remplaçant dans (1) on trouve la formule suivante :
$$ TEB = \dfrac{1}{2} Q\left(\dfrac{3}{4} \sqrt{1.25\dfrac{E_b}{N_0}} \right) + \dfrac{1}{2} Q\left(\dfrac{1}{4}\sqrt{1.25\dfrac{E_b}{N_0}}\right)$$
\newpage
\subsection{Implantation sous Matlab}
\subsubsection{Implantez la chaine de transmission sans canal et vérifiez que le TEB de la liaison est bien nul.}
Voici pour la chaine de transmission sans canal (ce qui est équivalent à un canal donc la fonction de transfert est un dirac), la fonction de transfert $g$, son diagramme de l'oeil et le tracé du signal en sortie du recepteur pour $\text{bits} = 1110010$:
\begin{figure}[H]
\hspace{-0.6cm}
\begin{tabular}{cc}
\includegraphics[width=9cm]{trim_oeil_dirac.png} &
\includegraphics[width=9cm]{trim_g_dirac.png} \\
\multicolumn{2}{c}{\includegraphics[width=17cm]{trim_signal_dirac.png}}
\end{tabular}
\end{figure}
\newpage
\subsubsection{Implantez la chaine de transmission avec la partie filtrage réalisée par le canal de propagation et vérifiez que vous retrouvez bien les résultats obtenus dans votre étude théorique.}
Voici pour la chaine de transmission avec canal selectif ($\tau_0 = 0$, $\tau_1 = \tau_0 + T_s$, $\alpha_0 = 1$, $\alpha_1 = 0.5$), la fonction de transfert $g$, son diagramme de l'oeil et le tracé du signal en sortie du recepteur pour $\text{bits} = 1110010$:
\begin{figure}[H]
\hspace{-0.6cm}
\begin{tabular}{cc}
\includegraphics[width=9cm]{trim_oeil_selectif.png} &
\includegraphics[width=9cm]{trim_g_selectif.png} \\
\multicolumn{2}{c}{\includegraphics[width=17cm]{trim_signal_selectif.png}}
\end{tabular}
\end{figure}
\newpage
\subsubsection{Visualisez la constellation obtenue en réception. Est-elle conforme à ce que vous attendiez ?}
Tout comme précédemment, on peut tracer la constellation de la chaine sans canal et celle de la chaine avec canal selectif:
\begin{figure}[H]
\centering
\includegraphics[width=15cm]{trim_constellations_dirac_selectif.png}
\caption{Constellations}
\label{oeil_selectif}
\end{figure}
On observe alors que la constellation associée au canal selectif possède quatres symboles au lieu de deux. Cela est du au retard qui fait que chaque bit est désormais associé à deux symboles. De même on observe que les amplitudes des symboles du canal selectif sont plus grandes.
\subsubsection{Mesurez le TEB et expliquez la valeur obtenue.}
$$\text{TEB} = \dfrac{1}{N} \sum_{k=1}^N (\text{bit}_k - \text{bit}_k)^2$$
Bien que la chaine avec canal selectif ne respecte pas le critère de Nyquist, on observe tout de même que le TEB est nul. Cela est dû grâce à notre choix de seuil en 0, en effet, bien qu'il y ait désomais deux symboles qui codent le même bit, cela ne change rien du point de vue de la décision.
\subsubsection{Implantez la chaine de transmission complète avec le filtrage canal et lajout de bruit. Tracez le TEB obtenu en fonction du rapport SNR à lentrée du récepteur.}
% tracés pas encore fait car on a pas le théorique. Ca critique beaucoup mdrr
\newpage
\section{Egalisation ZFE}
\subsection{Etude théorique}
\subsubsection{Déterminer les coefficients de légaliseur à implanter pour égaliser le canal multi-trajet considéré précédemment.}
Pour le calcul des coefficients théoriques nous choisi le cas où $K= N$ ainsi que $N=3$ et ceci uniquement afin de valider les 3 premiers coefficients obtenus par simulation (le raisonnement étant itérable autant de fois que l'on souhaite). Pour calculer ces coefficients nous sommes partis du système fourni dans le sujet :
$
\begin{pmatrix}
1 \\
0 \\
0 \\
\end{pmatrix}
$
=
$
\begin{pmatrix}
z(t_0) & 0 & 0 \\
z(t_0 + T_s) & z(t_0) & 0 \\
z(t_0 + 2T_s) & z(t_0 + T_s) & z(t_0) \\
\end{pmatrix}
$
.
$
\begin{pmatrix}
c_1 \\
c_2 \\
c_3 \\
\end{pmatrix}
$
Ensuite il nous a suffi de lire la valeur que prend z tous les $T_s$ comme vous pourrez le constater vous même sur la figure ci-dessous :
\begin{figure}[H]
\centering
\includegraphics[width=15cm]{TO_DO.png}
\caption{Signal en sortie du filtre de réception obtenu par l'injection d'un dirac dans le chaine}
\label{chaine_dirac}
\end{figure}
Ainsi il est aisé de noter que $z(t_0) = T_s$, $z(t_0+T_s) = -0.5 T_s$ et $z(t_0 + 2T_s)= -1.5T_s$\\
Le système associé est alors le suivant :
$
\begin{cases}
T_s.c_1 + 0 + 0 &= 1 \\
-0.5T_sc_1 + T_sc_2 + 0 &=0 \\
-1.5T_sc_1 + -0.5T_sc_2 + T_sc_3 &=0
\end{cases}
$
\vspace{0.5cm}On en déduit ainsi que :
$
\begin{cases}
c_1 &= 1/T_s \\
c_2 &=0.5/T_s \\
c_3 &= 1.75/T_s
\end{cases}
$
\subsection{Implantation sous Matlab}
\subsubsection{Déterminer par simulation les coefficients de légaliseur et les comparer à ceux trouvés précédemment.}
En fournissant en entrée de notre chaine de transmission un dirac, on peut former notre matrice Z en utilisant les coefficients du signal à l'entrée du filtre de réception, nous permttant de résoudre le système décris par l'équation suivante:
$$ x_r(t_0 + m T_s) = \sum_{k=0}^N c_k z(t_0 + (m-k)T_s) $$
Ainsi pour un ordre $N=10$, on obtient: \\
\begin{matrix}
$C^T = (0.1250 & -0.0625 & 0.0312 & -0.0156 & 0.0078 & -0.003 & 0.0020 & -0.0010 & 0.0005 & -0.0002)$
\end{matrix}
\subsubsection{Tracer la réponse en fréquence du canal de propagation, la réponse en fréquence de légaliseur, le produit des deux. Que peut-on conclure ?}
\begin{figure}[H]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{trim_freq_G.png} &
\includegraphics[width=9.5cm]{trim_freq_C.png} \\
\includegraphics[width=9.5cm]{trim_freq_G_C.png} &
\includegraphics[width=9.5cm]{trim_freq_g_c.png}
\end{tabular}
\end{figure}
En traçant les réponses en fréquence de $G$ et $C$ ainsi que le produit $G \times C$, on observe que les fréquences autour de zéro sont atténuées et que, au contraire, celles d'amplitudes relativement faible sont amplifiées.
On remarque alors que $G \times C$ ressemble nettement plus à un sinus cardinal que $G$ tout seul (sans égalisation). De ce fait, le critère de Nyquist est respecté, on confirme cela en traçant la transformée de Fourrier invervse de $G \times C$ et en remarquant que l'on obtient une distribution en forme de porte (permettant elle aussi de valider le critère de Nyquist).
\subsubsection{Tracer la réponse impulsionnelle de la chaine de transmission échantillonnée à $N_s$ avec et sans égalisation. Que peut-on conclure ?\\
Tracer de même les constellations obtenues avant et après égalisation.}
\begin{figure}[H]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{trim_impulsionnel_egalise_slim.png} &
\includegraphics[width=9.5cm]{trim_constellations_egalise_slim.png}
\end{tabular}
\caption{Réponses impulsionnelles et constellations de la chaine}
\label{impulsionnelles_constellations}
\end{figure}
On remarque sur la figure \ref{impulsionnelles_constellations} que la réponse impulsionnelle de la chaine après égalisation est bien ramenée à -1 (au lieu de -4 ou -12). On en déduit que cela va nous permetrre de respecter le critère de Nyquist (puisque la constellation après égalisation se rapproche de celle attendue).
\subsubsection{Ajouter du bruit dans la chaine de transmission, tracer le TEB obtenu avec égalisation}
\begin{figure}[H]
\centering
%\includegraphics[width=12.5cm]{trim_teb_egalise.png}
\caption{TEB de la chaine égalisée}
\label{g_selectif}
\end{figure}
\newpage
\begin{figure}[h!]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=6cm]{trim_constellations_dirac_0db.png} &
\includegraphics[width=6cm]{trim_histogramme_dirac_0db.png} \\
\includegraphics[width=6cm]{trim_constellations_dirac_4db.png} &
\includegraphics[width=6cm]{trim_histogramme_dirac_4db.png} \\
\includegraphics[width=6cm]{trim_constellations_dirac_8db.png} &
\includegraphics[width=6cm]{trim_histogramme_dirac_8db.png} \\
\includegraphics[width=6cm]{trim_constellations_dirac_12db.png} &
\includegraphics[width=6cm]{trim_histogramme_dirac_12db.png} \\
\end{tabular}
\caption{Constellations de la chaine sans canal, pour différents SNR \label{constellations_SNR_dirac}}
\end{figure}
\newpage
\begin{figure}[h!]
\centering
\begin{tabular}{cc}
\includegraphics[width=6cm]{trim_constellations_selectif_0db.png} &
\includegraphics[width=6cm]{trim_histogramme_selectif_0db.png} \\
\includegraphics[width=6cm]{trim_constellations_selectif_4db.png} &
\includegraphics[width=6cm]{trim_histogramme_selectif_4db.png} \\
\includegraphics[width=6cm]{trim_constellations_selectif_8db.png} &
\includegraphics[width=6cm]{trim_histogramme_selectif_8db.png} \\
\includegraphics[width=6cm]{trim_constellations_selectif_12db.png} &
\includegraphics[width=6cm]{trim_histogramme_selectif_12db.png} \\
\end{tabular}
\caption{Constellations de la chaine avec canal, pour différents SNR \label{constellations_SNR_selectif}}
\end{figure}
\newpage
\begin{figure}[h!]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=6cm]{trim_constellations_egalise_0db.png} &
\includegraphics[width=6cm]{trim_histogramme_egalise_0db.png} \\
\includegraphics[width=6cm]{trim_constellations_egalise_4db.png} &
\includegraphics[width=6cm]{trim_histogramme_egalise_4db.png} \\
\includegraphics[width=6cm]{trim_constellations_egalise_8db.png} &
\includegraphics[width=6cm]{trim_histogramme_egalise_8db.png} \\
\includegraphics[width=6cm]{trim_constellations_egalise_12db.png} &
\includegraphics[width=6cm]{trim_histogramme_egalise_12db.png} \\
\end{tabular}
\caption{Constellations de la chaine égalisée, pour différents SNR \label{constellations_SNR_egalisé}}
\end{figure}
\end{document}

BIN
TP3/rapport.pdf Normal file

Binary file not shown.

218
TP3/rapport.tex Normal file
View file

@ -0,0 +1,218 @@
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{color}
\usepackage[french]{babel}
\usepackage[hidelinks=true]{hyperref}
\usepackage{mathtools}
\usepackage[nottoc, numbib]{tocbibind}
%\usepackage[section]{placeins}
\renewcommand\thesection{}
\usepackage[
top=1.5cm,
bottom=1.5cm,
left=1.5cm,
right=1.5cm
]{geometry}
\setlength{\parskip}{0.2cm}
\setlength{\parindent}{0pt}
\begin{document}
\begin{figure}[t]
\centering
\includegraphics[width=5cm]{inp_n7.png}
\end{figure}
\title{
\vspace{4cm}
\textbf{Compte-rendu de TP} \\
Introduction aux communications numériques \\
Etude de limpact du bruit dans la chaine de transmission
}
\author{Laurent Fainsin}
\date{
\vspace{7cm}
Département Sciences du Numérique \\
Première année \\
2020 — 2021
}
\maketitle
\newpage
\tableofcontents
\newpage
\section{Chaine de référence}
La chaine de référence est créée avec un mapping binaire à moyenne nulle et des réponses impulsionnelles des filtres de mise en forme et de réception rectangulaires de durée Ts et de hauteur 1.
On trace les deux figures suivantes pour déterminer l'instant idéal $n_0$ lors de l'échantillonnage.
\begin{figure}[ht!]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{trim_c1_g.png} &
\includegraphics[width=9.5cm]{trim_c1_oeil_inf.png} \\
\end{tabular}
\caption{Sélection de $n_0$ \label{fig : c1_select}}
\end{figure}
Grâce à la figure \ref{fig : c1_select} on prend $n_0 = 4$. On remarque alors que lors d'une transmission non bruitée le taux d'erreur binaire est nul.
\begin{figure}[ht!]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{trim_c1_oeil_0.png} &
\includegraphics[width=9.5cm]{trim_c1_oeil_4.png} \\
\includegraphics[width=9.5cm]{trim_c1_oeil_8.png} &
\includegraphics[width=9.5cm]{trim_c1_oeil_12.png} \\
\end{tabular}
\caption{Diagramme de l'oeil pour différents $E_b/N_0$ \label{fig : c1_oeil}}
\end{figure}
Sur la figure \ref{fig : c1_oeil} on remarque que, plus le rapport $E_b/N_0$ est élevé, plus le diagramme de l'oeil se sépare en deux régions distinctes, permettant ainsi une décision plus fiable et un TEB plus faible.
\newpage
\begin{figure}[ht!]
\centering
\includegraphics[width=14cm]{trim_c1_TEB.png}
\caption{Tracé du TEB en fonction de $E_b/N_0$ \label{fig : c1_TEB}}
\end{figure}
On trace sur la figure \ref{fig : c1_TEB} le taux d'erreur d'erreur binaire pour de nombreuses valeurs de $E_b/N_0$ et l'on observe que l'on retrouve le tracé théorique du TEB, déterminé à partir de l'équation : $ \displaystyle \text{TEB}_{\text{theo}} = Q \left( \sqrt{2\frac{E_b}{N_0}} \right)$
\newpage
\section{Chaine n°1}
Cette première chaine est créée avec un mapping binaire à moyenne nulle et des réponses impulsionnelles des filtres de mise en forme rectangulaire et de réception de type front.
On trace les deux figures suivantes pour déterminer l'instant idéal $n_0$ lors de l'échantillonnage.
\begin{figure}[ht!]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{trim_c2_g.png} &
\includegraphics[width=9.5cm]{trim_c2_oeil_inf.png} \\
\end{tabular}
\caption{Sélection de $n_0$ \label{fig : c2_select}}
\end{figure}
Grâce à la figure \ref{fig : c2_select} on prend $n_0 \in [2, 4]$. On remarque alors que lors d'une transmission non bruitée le taux d'erreur binaire est nul.
\begin{figure}[ht!]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{trim_c2_oeil_0.png} &
\includegraphics[width=9.5cm]{trim_c2_oeil_4.png} \\
\includegraphics[width=9.5cm]{trim_c2_oeil_8.png} &
\includegraphics[width=9.5cm]{trim_c2_oeil_12.png} \\
\end{tabular}
\caption{Diagramme de l'oeil pour différents $E_b/N_0$ \label{fig : c2_oeil}}
\end{figure}
Sur la figure \ref{fig : c2_oeil} on remarque encore que, plus le rapport $E_b/N_0$ est élevé, plus le diagramme de l'oeil se sépare en deux régions distinctes, permettant ainsi une décision plus fiable et un TEB plus faible.
\newpage
\begin{figure}[ht!]
\centering
\includegraphics[width=14cm]{trim_c2_TEB.png}
\caption{Tracé du TEB en fonction de $E_b/N_0$ \label{fig : c2_TEB}}
\end{figure}
On trace sur la figure \ref{fig : c2_TEB} le taux d'erreur d'erreur binaire pour de nombreuses valeurs de $E_b/N_0$ et l'on observe que l'on retrouve le tracé théorique du TEB, déterminé à partir de l'équation : $ \displaystyle \text{TEB}_{\text{theo}} = Q \left( \sqrt{\frac{E_b}{N_0}} \right)$
Si l'on compare le TEB de cette chaine de transmission avec celle de référence, on remarque qu'en puissance celle de référence est plus efficace. Si l'on se réfère aux résultats du TP1 on avait trouvé que la chaine n°1 était spectralement moins efficace que la chaine de référence, notre observation n'est donc pas surprenante.
\newpage
\section{Chaine n°2}
Cette deuxième chaine est créée avec un mapping 4-aire à moyenne nulle et des réponses impulsionnelles des filtres de mise et de réception en forme rectangulaire.
\begin{figure}[ht!]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{trim_c3_g.png} &
\includegraphics[width=9.5cm]{trim_c3_oeil_inf.png} \\
\end{tabular}
\caption{Sélection de $n_0$ \label{fig : c3_select}}
\end{figure}
Grâce à la figure \ref{fig : c3_select} on prend $n_0 = 8$ et on détermine les seuils optimaux de décisions : \{ 16, 0, -16 \}. On remarque alors que lors d'une transmission non bruitée le taux d'erreur binaire est nul.
\begin{figure}[ht!]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{trim_c3_oeil_0.png} &
\includegraphics[width=9.5cm]{trim_c3_oeil_4.png} \\
\includegraphics[width=9.5cm]{trim_c3_oeil_8.png} &
\includegraphics[width=9.5cm]{trim_c3_oeil_12.png} \\
\end{tabular}
\caption{Diagramme de l'oeil pour différents $E_b/N_0$ \label{fig : c3_oeil}}
\end{figure}
Sur la figure \ref{fig : c3_oeil} on remarque encore que, plus le rapport $E_b/N_0$ est élevé, plus le diagramme de l'oeil se sépare en deux régions distinctes, permettant ainsi une décision plus fiable et un TEB plus faible.
\newpage
\begin{figure}[ht!]
\centering
\includegraphics[width=14cm]{trim_c3_TEB.png}
\caption{Tracé du TEB et TES en fonction de $E_b/N_0$ \label{fig : c3_TEB}}
\end{figure}
On trace sur la figure \ref{fig : c3_TEB} le taux d'erreur binaire et le taux d'erreur symbole pour de nombreuses valeurs de $E_b/N_0$ et l'on observe que l'on retrouve les tracés théoriques, déterminés à partir des équations :
$ \displaystyle \text{TES}_{\text{theo}} = \frac32 Q \left( \sqrt{\frac45\frac{E_b}{N_0}} \right)$ \qquad
$ \displaystyle \text{TEB}_{\text{theo}} = \frac34 Q \left( \sqrt{\frac45\frac{E_b}{N_0}} \right) = \frac{\text{TES}_{\text{theo}}}{\log_2(M)}$
On remarque cependant que les tracés numérique et théorique du TEB sont légèrement décalés, cela s'explique du fait que nous avons choisi ici un mapping binaire "naturel", tandis que l'équation thérique provient d'un mapping de Gray.
\begin{center}
\hspace*{.09\linewidth}
\begin{minipage}{.25\linewidth}
Mapping "naturel" : \\
$\begin{array}{lcr}
00 &\rightarrow &-3 \\
01 &\rightarrow &-1 \\
10 &\rightarrow & 1 \\
11 &\rightarrow & 3
\end{array}$
\end{minipage}
\begin{minipage}{.25\linewidth}
Mapping de Gray : \\
$\begin{array}{lcr}
00 &\rightarrow &-3 \\
01 &\rightarrow &-1 \\
11 &\rightarrow & 1 \\
10 &\rightarrow & 3
\end{array}$
\end{minipage}
\end{center}
En effet, si on suppose que l'on a utilisé un mapping de Gray et que l'on utilise l'approximation du TEB par celle du TES, on retrouve des tracés alignés:
\begin{figure}[ht!]
\centering
\includegraphics[width=14cm]{trim_c3_TEB_Gray.png}
\caption{Tracé du TEB et TES en fonction de $E_b/N_0$ (Gray) \label{fig : c3_TEB_Gray}}
\end{figure}
On remarque que la chaine n°2 est moins efficace que celle de référence, car transmettre 4 symboles est propice à plus d'erreur. Cela va cependant à l'encontre des résultats trouvés lors du TP1.
\end{document}

Binary file not shown.

Binary file not shown.

Binary file not shown.

122
TP4/code/ASK4.m Normal file
View file

@ -0,0 +1,122 @@
clear;
close all;
Fe = 12000; % fréquence d'échantillonage (Hz)
Te = 1/Fe; % période d'échantillonage (s)
N = 50000; % nombre de bits envoyés
Rb = 6000; % débit binaire
Fp = 2000; % fréquence porteuse
load('bits');
%bits = randi([0, 1], 1, N); % bits envoyés
M = 2^2; % signal 4-ASK
Ts = log2(M)/Rb; % période symbole
Ns = floor(Ts/Te);
T = (0:N*Ns/log2(M)-1) * Te; % échelle temporelle
fc = 1.25*Fe; % fréquence de coupure/
ordre = 100; % ordre du filtre
alpha = 0.35; % roll off
span = 10; % largeur du racine de cosinus surélevé
h = rcosdesign(alpha, span, Ns); % mise en forme: racine de cosinus surélevé
h_c = [ 1 zeros(1, Ns-1) ]; % propagation: dirac
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 le diagramme de l'oeil de real(X_env)
X_regrp = reshape(bits, log2(M), N/log2(M)).'; % on regroupe les bits
X_co = bi2de(X_regrp) * 2 - 3; % mapping
X_kr = kron(X_co.', [1 zeros(1, Ns-1)]); % Suréchantillonnage
X_env = [ X_kr zeros(1, span*Ns/2) ]; % on rajoute des zéros pour le retard
X_env = filter(h, 1, X_env); % enveloppe complexe
X_env = X_env(span*Ns/2 + 1 : end); % on dégage les zéros
X_tran = filter(h_c, 1, X_env); % signal transmis -> passage dans le canal
DSP = pwelch(real(X_env));
P_x = mean(abs(X_env).^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_bruit = sqrt(sigma2_x) * randn(2, length(X_tran)); % bruit
X_bruit = X_tran + X_bruit(1,:) + j * X_bruit(2,:); % signal bruité
X_recu = [ X_bruit zeros(1, span*Ns/2) ]; % on rajoute des zéros pour le retard
X_recu = filter(h_r, 1, X_recu); % signal reçu
X_recu = X_recu(span*Ns/2 + 1:end); % on dégage les zéros
X_sample = X_recu( n0 : Ns : N*Ns/log2(M) ); % signal échantillonné
X_demod = 3*( X_sample >= 2 ) + 1*( X_sample >= 0 & X_sample < 2 ) + -1*( X_sample < 0 & X_sample > -2 ) + -3*( X_sample <= -2 );
recu = de2bi((X_demod + 3)/2, log2(M)); % on reconstitue les bits à partir des symbols
TES = mean((bi2de(recu) - bi2de(X_regrp)).^2); % on calcule l'erreur symbole
recu = reshape(recu', size(bits)); % on transforme les symboles en bits
TEB = mean((recu - bits).^2); % on calcule l'erreur binaire
TESs = [ TESs TES ];
TEBs = [ TEBs TEB ];
end
TEB_theorique = qfunc(sqrt(2*EbN0));
figure;
semilogy(EbN0_db, TESs, '+');
hold;
semilogy(EbN0_db, TEBs, '+');
plot(EbN0_db, TEB_theorique);
title("TEB = f(E_b/N_0)");
xlabel("E_b/N_0 (dB)");
ylabel("erreur (dB)");
legend("TES numérique", "TEB numérique", "TEB théorique");
save ASK4 TEBs DSP
save EbN0_db EbN0_db
%%
EbN0_db = [2 4 6 8];
EbN0 = 10.^(EbN0_db./10);
for e=EbN0
sigma2_x = P_x * Ns / (2 * log2(M) * e); % calcul de sigma^2
X_bruit = sqrt(sigma2_x) * randn(2, length(X_tran)); % bruit
X_bruit = X_tran + X_bruit(1,:) + j * X_bruit(2,:); % signal bruité
X_recu = [ X_bruit zeros(1, span*Ns/2) ]; % on rajoute des zéros pour le retard
X_recu = filter(h_r, 1, X_recu); % signal reçu
X_recu = X_recu(span*Ns/2 + 1:end); % on dégage les zéros
X_sample = X_recu( n0 : Ns : N*Ns/log2(M) ); % signal échantillonné
X_demod = 3*( X_sample >= 2 ) + 1*( X_sample >= 0 & X_sample < 2 ) + -1*( X_sample < 0 & X_sample > -2 ) + -3*( X_sample <= -2 );
recu = de2bi((X_demod + 3)/2, log2(M)); % on reconstitue les bits à partir des symbols
TES = mean((bi2de(recu) - bi2de(X_regrp)).^2); % on calcule l'erreur symbole
recu = reshape(recu', size(bits)); % on transforme les symboles en bits
TEB = mean((recu - bits).^2); % on calcule l'erreur binaire
figure;
plot(X_sample, '+');
hold;
plot(complex(X_co), '.', 'MarkerSize', 25);
axis([-4, 4, -4, 4]);
title(sprintf("Eb/N0 = %.2fdB, erreur = %.2f%s", 10*log10(e), TEB*100, "%"));
legend("X\_sample", "X\_co");
axis square;
end

BIN
TP4/code/ASK4.mat Normal file

Binary file not shown.

BIN
TP4/code/EbN0_db.mat Normal file

Binary file not shown.

121
TP4/code/PSK8.m Normal file
View file

@ -0,0 +1,121 @@
clear;
close all;
Fe = 12000; % fréquence d'échantillonage (Hz)
Te = 1/Fe; % période d'échantillonage (s)
N = 30000; % nombre de bits envoyés
Rb = 6000; % débit binaire
Fp = 2000; % fréquence porteuse
bits = randi([0, 1], 1, N); % bits envoyés
M = 2^3; % signal 8-PSK
Ts = log2(M)/Rb; % période symbole
Ns = floor(Ts/Te);
T = (0:N*Ns/log2(M)-1) * Te; % échelle temporelle
fc = 1.25*Fe; % fréquence de coupure/
ordre = 100; % ordre du filtre
alpha = 0.35; % roll off
span = 10; % largeur du racine de cosinus surélevé
h = rcosdesign(alpha, span, Ns); % mise en forme: racine de cosinus surélevé
h_c = [ 1 zeros(1, Ns-1) ]; % propagation: dirac
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 le diagramme de l'oeil de real(X_env)
X_regrp = reshape(bits, log2(M), N/log2(M)).'; % on regroupe les bits
X_co = pskmod(bi2de(X_regrp), M, 0, 'gray');
X_kr = kron(X_co.', [1 zeros(1, Ns-1)]); % Suréchantillonnage
X_env = [ X_kr zeros(1, span*Ns/2) ]; % on rajoute des zéros pour le retard
X_env = filter(h, 1, X_env); % enveloppe complexe
X_env = X_env(span*Ns/2 + 1 : end); % on dégage les zéros
X_tran = filter(h_c, 1, X_env); % signal transmis -> passage dans le canal
DSP = pwelch(real(X_env));
P_x = mean(abs(X_env).^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_bruit = sqrt(sigma2_x) * randn(2, length(X_tran)); % bruit
X_bruit = X_tran + X_bruit(1,:) + j * X_bruit(2,:); % signal bruité
X_recu = [ X_bruit zeros(1, span*Ns/2) ]; % on rajoute des zéros pour le retard
X_recu = filter(h_r, 1, X_recu); % signal reçu
X_recu = X_recu(span*Ns/2 + 1:end); % on dégage les zéros
X_sample = X_recu( n0 : Ns : N*Ns/log2(M) ); % signal échantillonné
X_demod = pskdemod(X_sample, M, 0, 'gray'); % demodulation
recu = de2bi(X_demod, log2(M)); % on reconstitue les bits à partir des symbols
TES = mean((bi2de(recu) - bi2de(X_regrp)).^2); % on calcule l'erreur symbole
recu = reshape(recu', size(bits)); % on transforme les symboles en bits
TEB = mean((recu - bits).^2); % on calcule l'erreur binaire
TESs = [ TESs TES ];
TEBs = [ TEBs TEB ];
end
TEB_theorique = qfunc(sqrt(2*EbN0));
figure;
semilogy(EbN0_db, TESs, '+');
hold;
semilogy(EbN0_db, TEBs, '+');
plot(EbN0_db, TEB_theorique);
title("TEB = f(E_b/N_0)");
xlabel("E_b/N_0 (dB)");
ylabel("erreur (dB)");
legend("TES numérique", "TEB numérique", "TEB théorique");
save PSK8 TEBs DSP
save EbN0_db EbN0_db
%%
EbN0_db = [2 4 6 8];
EbN0 = 10.^(EbN0_db./10);
for e=EbN0
sigma2_x = P_x * Ns / (2 * log2(M) * e); % calcul de sigma^2
X_bruit = sqrt(sigma2_x) * randn(2, length(X_tran)); % bruit
X_bruit = X_tran + X_bruit(1,:) + j * X_bruit(2,:); % signal bruité
X_recu = [ X_bruit zeros(1, span*Ns/2) ]; % on rajoute des zéros pour le retard
X_recu = filter(h_r, 1, X_recu); % signal reçu
X_recu = X_recu(span*Ns/2 + 1:end); % on dégage les zéros
X_sample = X_recu( n0 : Ns : N*Ns/log2(M) ); % signal échantillonné
X_demod = pskdemod(X_sample, M, 0, 'gray'); % demodulation
recu = de2bi(X_demod, log2(M)); % on reconstitue les bits à partir des symbols
TES = mean((bi2de(recu) - bi2de(X_regrp)).^2); % on calcule l'erreur symbole
recu = reshape(recu', size(bits)); % on transforme les symboles en bits
TEB = mean((recu - bits).^2); % on calcule l'erreur binaire
figure;
plot(X_sample, '+');
hold;
plot(complex(X_co), '.', 'MarkerSize', 25);
axis([-2, 2, -2, 2]);
title(sprintf("Eb/N0 = %.2fdB, erreur = %.2f%s", 10*log10(e), TEB*100, "%"));
legend("X\_sample", "X\_co");
axis square;
end

BIN
TP4/code/PSK8.mat Normal file

Binary file not shown.

119
TP4/code/QAM16.m Normal file
View file

@ -0,0 +1,119 @@
clear;
close all;
Fe = 12000; % fréquence d'échantillonage (Hz)
Te = 1/Fe; % période d'échantillonage (s)
N = 10000; % nombre de bits envoyés
Rb = 6000; % débit binaire
Fp = 2000; % fréquence porteuse
bits = randi([0, 1], 1, N); % bits envoyés
M = 2^4; % signal 16-QAM
Ts = log2(M)/Rb; % période symbole
Ns = floor(Ts/Te);
T = (0:N*Ns/log2(M)-1) * Te; % échelle temporelle
fc = 1.25*Fe; % fréquence de coupure/
ordre = 100; % ordre du filtre
alpha = 0.35; % roll off
span = 10; % largeur du racine de cosinus surélevé
h = rcosdesign(alpha, span, Ns); % mise en forme: racine de cosinus surélevé
h_c = [ 1 zeros(1, Ns-1) ]; % propagation: dirac
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 le diagramme de l'oeil de real(X_env)
X_regrp = reshape(bits, log2(M), N/log2(M)).'; % on regroupe les bits
X_co = qammod(bi2de(X_regrp), M, 'gray');
X_kr = kron(X_co.', [1 zeros(1, Ns-1)]); % Suréchantillonnage
X_env = [ X_kr zeros(1, span*Ns/2) ]; % on rajoute des zéros pour le retard
X_env = filter(h, 1, X_env); % enveloppe complexe
X_env = X_env(span*Ns/2 + 1 : end); % on dégage les zéros
X_tran = filter(h_c, 1, X_env); % signal transmis -> passage dans le canal
DSP = pwelch(real(X_env));
P_x = mean(abs(X_env).^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_bruit = sqrt(sigma2_x) * randn(2, length(X_tran)); % bruit
X_bruit = X_tran + X_bruit(1,:) + j * X_bruit(2,:); % signal bruité
X_recu = [ X_bruit zeros(1, span*Ns/2) ]; % on rajoute des zéros pour le retard
X_recu = filter(h_r, 1, X_recu); % signal reçu
X_recu = X_recu(span*Ns/2 + 1:end); % on dégage les zéros
X_sample = X_recu( n0 : Ns : N*Ns/log2(M) ); % signal échantillonné
X_demod = qamdemod(X_sample, M, 'gray'); % demodulation
recu = de2bi(X_demod, log2(M)); % on reconstitue les bits à partir des symbols
TES = mean((bi2de(recu) - bi2de(X_regrp)).^2); % on calcule l'erreur symbole
recu = reshape(recu', size(bits)); % on transforme les symboles en bits
TEB = mean((recu - bits).^2); % on calcule l'erreur binaire
TESs = [ TESs TES ];
TEBs = [ TEBs TEB ];
end
TEB_theorique = qfunc(sqrt(2*EbN0));
figure;
semilogy(EbN0_db, TESs, '+');
hold;
semilogy(EbN0_db, TEBs, '+');
plot(EbN0_db, TEB_theorique);
title("TEB = f(E_b/N_0)");
xlabel("E_b/N_0 (dB)");
ylabel("erreur (dB)");
legend("TES numérique", "TEB numérique", "TEB théorique");
save QAM16 TEBs DSP
save EbN0_db EbN0_db
%%
EbN0_db = [2 4 6 8];
EbN0 = 10.^(EbN0_db./10);
for e=EbN0
sigma2_x = P_x * Ns / (2 * log2(M) * e); % calcul de sigma^2
X_bruit = sqrt(sigma2_x) * randn(2, length(X_tran)); % bruit
X_bruit = X_tran + X_bruit(1,:) + j * X_bruit(2,:); % signal bruité
X_recu = [ X_bruit zeros(1, span*Ns/2) ]; % on rajoute des zéros pour le retard
X_recu = filter(h_r, 1, X_recu); % signal reçu
X_recu = X_recu(span*Ns/2 + 1:end); % on dégage les zéros
X_sample = X_recu( n0 : Ns : N*Ns/log2(M) ); % signal échantillonné
X_demod = qamdemod(X_sample, M, 'gray'); % demodulation
recu = de2bi(X_demod, log2(M)); % on reconstitue les bits à partir des symbols
TES = mean((bi2de(recu) - bi2de(X_regrp)).^2); % on calcule l'erreur symbole
recu = reshape(recu', size(bits)); % on transforme les symboles en bits
TEB = mean((recu - bits).^2); % on calcule l'erreur binaire
figure;
plot(X_sample, '+');
hold;
plot(complex(X_co), '.', 'MarkerSize', 25);
axis([-4, 4, -4, 4]);
title(sprintf("Eb/N0 = %.2fdB, erreur = %.2f%s", 10*log10(e), TEB*100, "%"));
legend("X\_sample", "X\_co");
axis square;
end

BIN
TP4/code/QAM16.mat Normal file

Binary file not shown.

121
TP4/code/QPSK.m Normal file
View file

@ -0,0 +1,121 @@
clear;
close all;
Fe = 12000; % fréquence d'échantillonage (Hz)
Te = 1/Fe; % période d'échantillonage (s)
N = 50000; % nombre de bits envoyés
Rb = 6000; % débit binaire
Fp = 2000; % fréquence porteuse
load('bits');
%bits = randi([0, 1], 1, N); % bits envoyés
M = 2^2; % signal 16-QAM
Ts = log2(M)/Rb; % période symbole
Ns = floor(Ts/Te);
T = (0:N*Ns/log2(M)-1) * Te; % échelle temporelle
fc = 1.25*Fe; % fréquence de coupure/
ordre = 100; % ordre du filtre
alpha = 0.35; % roll off
span = 10; % largeur du racine de cosinus surélevé
h = rcosdesign(alpha, span, Ns); % mise en forme: racine de cosinus surélevé
h_c = [ 1 zeros(1, Ns-1) ]; % propagation: dirac
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 le diagramme de l'oeil de real(X_env)
X_regrp = reshape(bits, log2(M), N/log2(M)).'; % on regroupe les bits
X_co = qammod(bi2de(X_regrp), M, 'gray');
X_kr = kron(X_co.', [1 zeros(1, Ns-1)]); % Suréchantillonnage
X_env = [ X_kr zeros(1, span*Ns/2) ]; % on rajoute des zéros pour le retard
X_env = filter(h, 1, X_env); % enveloppe complexe
X_env = X_env(span*Ns/2 + 1 : end); % on dégage les zéros
X_tran = filter(h_c, 1, X_env); % signal transmis -> passage dans le canal
DSP = pwelch(real(X_env));
P_x = mean(abs(X_env).^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_bruit = sqrt(sigma2_x) * randn(2, length(X_tran)); % bruit
X_bruit = X_tran + X_bruit(1,:) + j * X_bruit(2,:); % signal bruité
X_recu = [ X_bruit zeros(1, span*Ns/2) ]; % on rajoute des zéros pour le retard
X_recu = filter(h_r, 1, X_recu); % signal reçu
X_recu = X_recu(span*Ns/2 + 1:end); % on dégage les zéros
X_sample = X_recu( n0 : Ns : N*Ns/log2(M) ); % signal échantillonné
X_demod = qamdemod(X_sample, M, 'gray'); % demodulation
recu = de2bi(X_demod, log2(M)); % on reconstitue les bits à partir des symbols
TES = mean((bi2de(recu) - bi2de(X_regrp)).^2); % on calcule l'erreur symbole
recu = reshape(recu', size(bits)); % on transforme les symboles en bits
TEB = mean((recu - bits).^2); % on calcule l'erreur binaire
TESs = [ TESs TES ];
TEBs = [ TEBs TEB ];
end
TEB_theorique = qfunc(sqrt(2*EbN0));
figure;
semilogy(EbN0_db, TESs, '+');
hold;
semilogy(EbN0_db, TEBs, '+');
plot(EbN0_db, TEB_theorique);
title("TEB = f(E_b/N_0)");
xlabel("E_b/N_0 (dB)");
ylabel("erreur (dB)");
legend("TES numérique", "TEB numérique", "TEB théorique");
save QPSK TEBs DSP
save EbN0_db EbN0_db
%%
EbN0_db = [2 4 6 8];
EbN0 = 10.^(EbN0_db./10);
for e=EbN0
sigma2_x = P_x * Ns / (2 * log2(M) * e); % calcul de sigma^2
X_bruit = sqrt(sigma2_x) * randn(2, length(X_tran)); % bruit
X_bruit = X_tran + X_bruit(1,:) + j * X_bruit(2,:); % signal bruité
X_recu = [ X_bruit zeros(1, span*Ns/2) ]; % on rajoute des zéros pour le retard
X_recu = filter(h_r, 1, X_recu); % signal reçu
X_recu = X_recu(span*Ns/2 + 1:end); % on dégage les zéros
X_sample = X_recu( n0 : Ns : N*Ns/log2(M) ); % signal échantillonné
X_demod = qamdemod(X_sample, M, 'gray'); % demodulation
recu = de2bi(X_demod, log2(M)); % on reconstitue les bits à partir des symbols
TES = mean((bi2de(recu) - bi2de(X_regrp)).^2); % on calcule l'erreur symbole
recu = reshape(recu', size(bits)); % on transforme les symboles en bits
TEB = mean((recu - bits).^2); % on calcule l'erreur binaire
figure;
plot(X_sample, '+');
hold;
plot(complex(X_co), '.', 'MarkerSize', 25);
axis([-2, 2, -2, 2]);
title(sprintf("Eb/N0 = %.2fdB, erreur = %.2f%s", 10*log10(e), TEB*100, "%"));
legend("X\_sample", "X\_co");
axis square;
end

BIN
TP4/code/QPSK.mat Normal file

Binary file not shown.

BIN
TP4/code/bits.mat Normal file

Binary file not shown.

119
TP4/code/equivalent.m Normal file
View file

@ -0,0 +1,119 @@
clear;
close all;
Fe = 10000; % fréquence d'échantillonage (Hz)
Te = 1/Fe; % période d'échantillonage (s)
N = 50000; % nombre de bits envoyés
Rb = 2000; % débit binaire
Fp = 2000; % fréquence porteuse
load('bits.mat')
%bits = randi([0, 1], 1, N); % bits envoyés
M = 2^2; % signal QPSK
Ts = log2(M)/Rb; % période symbole
Ns = floor(Ts/Te); % facteur suréchantillonage
T = (0:N*Ns/log2(M)-1) * Te; % échelle temporelle
fc = 1.25*Fe; % fréquence de coupure du lowpass
ordre = 100; % ordre du filtre
lowpass = (2*fc/Fe)*sinc(2*fc*[-(ordre-1)*Te/2 : Te : (ordre-1)*Te/2]); % coefficients du filtre passe-bas
alpha = 0.35; % roll off du racine de cosinus surélevé
span = 10; % largeur du racine de cosinus surélevé
h = rcosdesign(alpha, span, Ns); % mise en forme: racine de cosinus surélevé
h_c = [ 1 zeros(1, Ns-1) ]; % propagation/canal: dirac
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 le diagramme de l'oeil, ou g
X_grp = reshape(bits, log2(M), N/log2(M)).'; % on regroupe les bits
X_ma = X_grp * 2 - 1; % mapping
X_co = X_ma(:,1) + 1j * X_ma(:,2); % symboles complexes
X_kr = kron(X_co.', [1 zeros(1, Ns-1)]); % Suréchantillonnage
X_env = [ X_kr zeros(1, span*Ns/2) ]; % on rajoute des zéros pour le retard
X_env = filter(h, 1, X_env); % enveloppe complexe
X_env = X_env(span*Ns/2 + 1 : end); % on dégage les zéros
figure;
preview = 250;
plot(T(1:preview), real(X_env(1:preview)));
title("Partie réelle de l'enveloppe complexe du signal");
xlabel("Temps (s)");
ylabel("Amplitude");
figure;
pwelch(real(X_env)); % on trace la DSP de l'enveloppe
title("DSP de l'enveloppe complexe associé");
figure;
oeil = reshape(real(X_env), Ns, length(X_env)/Ns);
plot(oeil);
title("Diagramme de l'oeil, signal non bruité");
xlabel("Temps (s)");
ylabel("Amplitude");
X_tran = filter(h_c, 1, X_env); % passage dans le canal
P_x = mean(abs(X_tran).^2);
EbN0_db = linspace(0, 8, 256);
EbN0 = 10.^(EbN0_db./10);
TEBs = [];
TESs = [];
%figure;
for e=EbN0
sigma2_x = P_x * Ns / (2 * log2(M) * e); % calcul de sigma^2
X_bruit = sqrt(sigma2_x) * randn(2, length(X_tran)); % signal bruité
X_bruit = X_tran + X_bruit(1,:) + 1j * X_bruit(2,:);
X_recu = [ X_bruit zeros(1, span*Ns/2) ]; % on rajoute des zéros pour le retard
X_recu = filter(h_r, 1, X_recu); % signal reçu
X_recu = X_recu(span*Ns/2 + 1:end); % on dégage les zéros
X_sample = X_recu( n0 : Ns : N*Ns/log2(M) ); % signal échantillonné
X_demod_re = real(X_sample) > 0; % detection par seuil des réels
X_demod_im = imag(X_sample) > 0; % detection par seuil des imaginaires
recu = double( [ X_demod_re' X_demod_im' ] ); % on reconstitue les bits à partir des symboles
TES = mean((bi2de(recu) - bi2de(X_grp)).^2); % on calcule l'erreur symbole
recu = reshape(recu', size(bits)); % on transforme les symboles en bits
TEB = mean((recu - bits).^2); % on calcule l'erreur binaire
TESs = [ TESs TES ];
TEBs = [ TEBs TEB ];
%plot(X_sample, '+');
%hold;
%plot(X_co, '*');
%hold;
%axis square;
%grid;
%axis([-2, 2, -2, 2]);
%title(sprintf("Eb/N0 = %.2fdB, erreur = %.2f%s", 10*log10(e), TEB*100, "%"));
%legend("symboles reçus", "symboles théoriques");
%drawnow;
end
TEB_theorique = qfunc(sqrt(2*EbN0));
figure;
semilogy(EbN0_db, TESs, '+');
hold;
semilogy(EbN0_db, TEBs, '+');
plot(EbN0_db, TEB_theorique);
title("TEB = f(E_b/N_0)");
xlabel("E_b/N_0 (dB)");
ylabel("TEB");
legend("TES numérique", "TEB numérique", "TEB théorique");

48
TP4/code/modulations.m Normal file
View file

@ -0,0 +1,48 @@
clear;
close all;
load('EbN0_db');
figure;
load('ASK4');
semilogy(EbN0_db, smoothdata(TEBs));
hold;
load('QPSK');
semilogy(EbN0_db, smoothdata(TEBs));
load('PSK8');
semilogy(EbN0_db, smoothdata(TEBs));
load('QAM16');
semilogy(EbN0_db, smoothdata(TEBs));
title("TEB = f(E_b/N_0)");
xlabel("E_b/N_0 (dB)");
ylabel("TEB");
legend("4-ASK", "QPSK", "8-PSK", "16-QAM");
%%
figure;
load('ASK4');
plot(smoothdata(DSP)/max(smoothdata(DSP)));
hold;
load('QPSK');
plot(smoothdata(DSP)/max(smoothdata(DSP)));
load('PSK8');
plot(smoothdata(DSP)/max(smoothdata(DSP)));
load('QAM16');
plot(smoothdata(DSP)/max(smoothdata(DSP)));
title("DSP des modulations");
xlabel("Fréquence (Hz)");
ylabel("Amplitude");
axis tight;
xlim([0 6000]);
legend("4-ASK", "QPSK", "8-PSK", "16-QAM");

150
TP4/code/porteuse.m Normal file
View file

@ -0,0 +1,150 @@
clear;
close all;
Fe = 10000; % fréquence d'échantillonage (Hz)
Te = 1/Fe; % période d'échantillonage (s)
N = 50000; % nombre de bits envoyés
Rb = 2000; % débit binaire
Fp = 2000; % fréquence porteuse
load('bits.mat')
%bits = randi([0, 1], 1, N); % bits envoyés
M = 2^2; % signal QPSK
Ts = log2(M)/Rb; % période symbole
Ns = floor(Ts/Te); % facteur suréchantillonage
T = (0:N*Ns/log2(M)-1) * Te; % échelle temporelle
fc = 1.25*Fe; % fréquence de coupure du lowpass
ordre = 100; % ordre du filtre
lowpass = (2*fc/Fe)*sinc(2*fc*[-(ordre-1)*Te/2 : Te : (ordre-1)*Te/2]); % coefficients du filtre passe-bas
alpha = 0.35; % roll off du racine de cosinus surélevé
span = 10; % largeur du racine de cosinus surélevé
h = rcosdesign(alpha, span, Ns); % mise en forme: racine de cosinus surélevé
h_c = [ 1 zeros(1, Ns-1) ]; % propagation/canal: dirac
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 le diagramme de l'oeil, ou g
X_grp = reshape(bits, log2(M), N/log2(M)).'; % on regroupe les bits
X_ma = X_grp * 2 - 1; % mapping
X_co = X_ma(:,1) + 1j * X_ma(:,2); % symboles complexes
X_kr = kron(X_co.', [1 zeros(1, Ns-1)]); % Suréchantillonnage
X_env = [ X_kr zeros(1, span*Ns/2) ]; % on rajoute des zéros pour le retard
X_env = filter(h, 1, X_env); % enveloppe complexe
X_env = X_env(span*Ns/2 + 1 : end); % on dégage les zéros
figure;
preview = 250;
plot(T(1:preview), real(X_env(1:preview)));
title("Partie réelle de l'enveloppe complexe du signal");
xlabel("Temps (s)");
ylabel("Amplitude");
figure;
pwelch(real(X_env)); % on trace la DSP de l'enveloppe
title("DSP de l'enveloppe complexe associé");
figure;
oeil = reshape(real(X_env), Ns, length(X_env)/Ns);
plot(oeil);
title("Diagramme de l'oeil, signal non bruité");
xlabel("Temps (s)");
ylabel("Amplitude");
X_port = X_env .* exp( 2*pi*j*Fp*T ); % transposition en fréquence
figure;
pwelch(real(X_port)); % on trace la DSP du signal modulé sur porteuse
title("DSP du signal modulé sur porteuse");
X_reel = real(X_port); % passage en réel
figure;
plot(T(1:preview), X_reel(1:preview));
title("Signal réel transposé en fréquence");
xlabel("Temps (s)");
ylabel("Amplitude");
X_tran = filter(h_c, 1, X_reel); % passage dans le canal
P_x = mean(abs(X_reel).^2);
EbN0_db = linspace(0, 8, 256);
EbN0 = 10.^(EbN0_db./10);
TEBs = [];
TESs = [];
%figure;
for e=EbN0
sigma2_x = P_x * Ns / (2 * log2(M) * e); % calcul de sigma^2
X_bruit = X_tran + sqrt(sigma2_x) * randn(1, length(X_tran)); % signal bruité
X_cos = X_bruit .* cos( 2*pi*Fp*T ); % on prend la partie en phase du signal
X_cos = [ X_cos zeros(1, ordre/2) ]; % on rajoute des zéros
X_cos = filter(lowpass, 1, X_cos); % passe bas
X_cos = X_cos(ordre/2 + 1:end); % on dégage les zéros
X_sin = X_bruit .* sin( 2*pi*Fp*T ); % on prend la partie en quadrature du signal
X_sin = [ X_sin zeros(1, ordre/2) ]; % on rajoute des zéros
X_sin = filter(lowpass, 1, X_sin); % passe bas
X_sin = X_sin(ordre/2 + 1:end); % on dégage les zéros
X_base = X_cos - 1j * X_sin; % on reconsitue les symboles
X_base = -2 * X_base; % sinon ça marche pas ?
%plot(X_env)
%hold
%plot(X_base)
X_recu = [ X_base zeros(1, span*Ns/2) ]; % on rajoute des zéros pour le retard
X_recu = filter(h_r, 1, X_recu); % signal reçu
X_recu = X_recu(span*Ns/2 + 1:end); % on dégage les zéros
X_sample = X_recu( n0 : Ns : N*Ns/log2(M) ); % signal échantillonné
X_demod_re = real(X_sample) > 0; % detection par seuil des réels
X_demod_im = imag(X_sample) > 0; % detection par seuil des imaginaires
recu = double( [ X_demod_re' X_demod_im' ] ); % on reconstitue les bits à partir des symboles
TES = mean((bi2de(recu) - bi2de(X_grp)).^2); % on calcule l'erreur symbole
recu = reshape(recu', size(bits)); % on transforme les symboles en bits
TEB = mean((recu - bits).^2); % on calcule l'erreur binaire
TESs = [ TESs TES ];
TEBs = [ TEBs TEB ];
%plot(X_sample, '+');
%hold;
%plot(X_co, '*');
%hold;
%axis square;
%grid;
%axis([-2, 2, -2, 2]);
%title(sprintf("Eb/N0 = %.2fdB, erreur = %.2f%s", 10*log10(e), TEB*100, "%"));
%legend("symboles reçus", "symboles théoriques");
%drawnow;
end
TEB_theorique = qfunc(sqrt(2*EbN0));
figure;
semilogy(EbN0_db, TESs, '+');
hold;
semilogy(EbN0_db, TEBs, '+');
plot(EbN0_db, TEB_theorique);
title("TEB = f(E_b/N_0)");
xlabel("E_b/N_0 (dB)");
ylabel("TEB");
legend("TES numérique", "TEB numérique", "TEB théorique");

BIN
TP4/rapport.pdf Normal file

Binary file not shown.

175
TP4/rapport.tex Normal file
View file

@ -0,0 +1,175 @@
\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{color}
\usepackage{caption}
\usepackage[french]{babel}
\usepackage[hidelinks=true]{hyperref}
\usepackage{mathtools}
\usepackage[nottoc, numbib]{tocbibind}
%\usepackage[section]{placeins}
\renewcommand\thesection{}
\graphicspath{
{./img/}
}
\usepackage[
top=1.5cm,
bottom=1.5cm,
left=1.5cm,
right=1.5cm
]{geometry}
\setlength{\parskip}{0.2cm}
\setlength{\parindent}{0pt}
\begin{document}
\begin{figure}[t]
\centering
\includegraphics[width=5cm]{inp_n7.png}
\end{figure}
\title{
\vspace{4cm}
\textbf{Compte-rendu de TP} \\
Introduction aux communications numériques \\
Étude de chaines de transmission sur porteuse
}
\author{Laurent Fainsin}
\date{
\vspace{7cm}
Département Sciences du Numérique \\
Première année \\
2020 — 2021
}
\maketitle
\newpage
\tableofcontents
\newpage
\section{Chaine passe-bas équivalente}
\begin{figure}[ht!]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{trim_env_port.png} &
\includegraphics[width=9.5cm]{trim_freq_port.png} \\
\end{tabular}
\caption{Aperçu du signal avant et après transposition en fréquence \label{fig : preview_signal}}
\end{figure}
\begin{figure}[ht!]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{trim_dsp_env_port.png} &
\includegraphics[width=9.5cm]{trim_dsp_freq_port.png} \\
\end{tabular}
\caption{DSP du signal avant et après transposition en fréquence \label{fig : DSP_signal}}
\end{figure}
\begin{figure}[ht!]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{trim_oeil_port.png} &
\includegraphics[width=9.5cm]{trim_teb_port.png} \\
\end{tabular}
\caption{\label{fig : oeil_teb}}
\end{figure}
On observe sur la figure \ref{fig : DSP_signal} le déplacement du spectre autour de la fréquence $f_p = 2 kHz$, le signal sur le canal n'est plus en bande de base.
On remarque que le TEB du signal transmis sur porteuse et le TEB du signal transmis sur passe-bas équivalent sont identiques, ce qui est attendu. Le TEB est donné sur la figure \ref{fig : oeil_teb}.
\newpage
\section{Comparaison de modulations sur féquence porteuse}
\begin{figure}[ht!]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{trim_ASK4_2.png} &
\includegraphics[width=9.5cm]{trim_ASK4_4.png} \\
\includegraphics[width=9.5cm]{trim_ASK4_6.png} &
\includegraphics[width=9.5cm]{trim_ASK4_8.png} \\
\end{tabular}
\caption{Constellations de la modulation 4-ASK \label{fig : const_ASK4}}
\end{figure}
\newpage
\begin{figure}[ph]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{trim_QPSK_2.png} &
\includegraphics[width=9.5cm]{trim_QPSK_4.png} \\
\includegraphics[width=9.5cm]{trim_QPSK_6.png} &
\includegraphics[width=9.5cm]{trim_QPSK_8.png} \\
\end{tabular}
\caption{Constellations de la modulation QPSK \label{fig : const_QPSK}}
\end{figure}
\begin{figure}[ph]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{trim_PSK8_2.png} &
\includegraphics[width=9.5cm]{trim_PSK8_4.png} \\
\includegraphics[width=9.5cm]{trim_PSK8_6.png} &
\includegraphics[width=9.5cm]{trim_PSK8_8.png} \\
\end{tabular}
\caption{Constellations de la modulation 8-PSK \label{fig : const_PSK4}}
\end{figure}
\begin{figure}[ph]
\hspace{-1cm}
\begin{tabular}{cc}
\includegraphics[width=9.5cm]{trim_QAM16_2.png} &
\includegraphics[width=9.5cm]{trim_QAM16_4.png} \\
\includegraphics[width=9.5cm]{trim_QAM16_6.png} &
\includegraphics[width=9.5cm]{trim_QAM16_8.png} \\
\end{tabular}
\caption{Constellations de la modulation 16-QAM \label{fig : const_QAM16}}
\end{figure}
\newpage
\begin{figure}[ht!]
\centering
\includegraphics[width=17cm]{trim_mod_comp.png}
\caption{TEB (lissées) des modulations \label{fig : comp_TEB}}
\end{figure}
\begin{figure}[ht!]
\centering
\includegraphics[width=17cm]{trim_dsp_comp.png}
\caption{DSP (lissées) des modulations \label{fig : comp_DSP}}
\end{figure}
On a tracé sur la figure \ref{fig : comp_TEB} les TEB pour ces quatres modulations. On peut ainsi définir l'ordre d'efficacité en puissance :
\begin{enumerate}
\item QPSK
\item 8-PSK
\item 16-QAM
\item 4-ASK
\end{enumerate}
On a tracé sur la figure \ref{fig : comp_DSP} les DSP de ces quatres modulations. On peut ainsi définir l'ordre d'efficacité spectral :
\begin{enumerate}
\item 16-QAM
\item 8-PSK
\item QPSK
\item 4-ASK
\end{enumerate}
\end{document}

Binary file not shown.