init
This commit is contained in:
commit
1ec868417a
BIN
TP1-2-questions.pdf
Normal file
BIN
TP1-2-questions.pdf
Normal file
Binary file not shown.
48
TP1/TP1_1.m
Normal file
48
TP1/TP1_1.m
Normal 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
50
TP1/TP1_2.m
Normal 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
48
TP1/TP1_3.m
Normal 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
59
TP1/TP1_4.m
Normal 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
80
TP1/TP1_all.m
Normal 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
BIN
TP1/rapport.pdf
Normal file
Binary file not shown.
97
TP1/rapport.tex
Normal file
97
TP1/rapport.tex
Normal 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 d’efficacité spectrale décroissante ?
|
||||||
|
|
||||||
|
Grâce à la figure \ref{fig : dsp_all}, les modulateurs bande de base étudiés rangés par ordre d’efficacité 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 d’un modulateur bande de base qui agissent sur l’efficacité 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
BIN
TP2-questions.pdf
Normal file
Binary file not shown.
51
TP2/chaine1_1.m
Normal file
51
TP2/chaine1_1.m
Normal 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
61
TP2/chaine1_2.m
Normal 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
52
TP2/chaine2_1.m
Normal 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
61
TP2/chaine2_2.m
Normal 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
64
TP2/chaine_bonus.m
Normal 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
BIN
TP2/rapport.pdf
Normal file
Binary file not shown.
198
TP2/rapport.tex
Normal file
198
TP2/rapport.tex
Normal 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 l’interfé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 d’erreur binaire n’est 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
92
TP3/chaine_1.m
Normal 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
106
TP3/chaine_2.m
Normal 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
479
TP3/chaine_ref.m
Normal 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 l’oeil 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 l’on échantillonne à $t_0 +mT_s$ avec $t_0 = T_s$ \\
|
||||||
|
et que l’on 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 à l’entré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 l’expression du taux d’erreur binaire (TEB) en fonction de $\dfrac{E_b}{N_0}$, rapport signal sur bruit par bit à l’entré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 l’ajout de bruit. Tracez le TEB obtenu en fonction du rapport SNR à l’entré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
BIN
TP3/rapport.pdf
Normal file
Binary file not shown.
218
TP3/rapport.tex
Normal file
218
TP3/rapport.tex
Normal 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 l’impact 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}
|
BIN
TP3/texte_travail_1A_SN_Bruit_FA_TEB_2020_2021.pdf
Normal file
BIN
TP3/texte_travail_1A_SN_Bruit_FA_TEB_2020_2021.pdf
Normal file
Binary file not shown.
BIN
TP4/Questions_travail_Mod_porteuse_1SN_2020_2021.pdf
Normal file
BIN
TP4/Questions_travail_Mod_porteuse_1SN_2020_2021.pdf
Normal file
Binary file not shown.
BIN
TP4/Texte_TPs_Sur_Porteuse_2020_2021.pdf
Normal file
BIN
TP4/Texte_TPs_Sur_Porteuse_2020_2021.pdf
Normal file
Binary file not shown.
122
TP4/code/ASK4.m
Normal file
122
TP4/code/ASK4.m
Normal 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
BIN
TP4/code/ASK4.mat
Normal file
Binary file not shown.
BIN
TP4/code/EbN0_db.mat
Normal file
BIN
TP4/code/EbN0_db.mat
Normal file
Binary file not shown.
121
TP4/code/PSK8.m
Normal file
121
TP4/code/PSK8.m
Normal 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
BIN
TP4/code/PSK8.mat
Normal file
Binary file not shown.
119
TP4/code/QAM16.m
Normal file
119
TP4/code/QAM16.m
Normal 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
BIN
TP4/code/QAM16.mat
Normal file
Binary file not shown.
121
TP4/code/QPSK.m
Normal file
121
TP4/code/QPSK.m
Normal 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
BIN
TP4/code/QPSK.mat
Normal file
Binary file not shown.
BIN
TP4/code/bits.mat
Normal file
BIN
TP4/code/bits.mat
Normal file
Binary file not shown.
119
TP4/code/equivalent.m
Normal file
119
TP4/code/equivalent.m
Normal 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
48
TP4/code/modulations.m
Normal 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
150
TP4/code/porteuse.m
Normal 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
BIN
TP4/rapport.pdf
Normal file
Binary file not shown.
175
TP4/rapport.tex
Normal file
175
TP4/rapport.tex
Normal 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}
|
BIN
TP5/Seq5_Intro_Egalisation_2020_2021.pdf
Normal file
BIN
TP5/Seq5_Intro_Egalisation_2020_2021.pdf
Normal file
Binary file not shown.
Loading…
Reference in a new issue