192 lines
4.9 KiB
Mathematica
192 lines
4.9 KiB
Mathematica
|
clear;
|
||
|
F0 = 1180;
|
||
|
F1 = 980;
|
||
|
Fe = 48000;
|
||
|
Te = 1/Fe;
|
||
|
Ts = 1/300;
|
||
|
Ns = floor(Ts/Te);
|
||
|
|
||
|
|
||
|
|
||
|
% Question 3.1.1.1
|
||
|
% on charge les bits à transmettre, ceux-ci son placés dans la variable "bits"
|
||
|
load('DonneesBinome1.mat');
|
||
|
% on répète chaque bits Ns fois pour obtenir NRZ
|
||
|
NRZ = repelem(bits, Ns);
|
||
|
% on génère notre échelle temporelle
|
||
|
T = 0:Te:Ns*length(bits) /Fe - Te;
|
||
|
|
||
|
% Question 3.1.1.2
|
||
|
%plot(T, NRZ);
|
||
|
%xlabel("temps (s)");
|
||
|
%ylabel("NRZ(t)");
|
||
|
|
||
|
% Question 3.1.1.3
|
||
|
%N_fft = 48000;
|
||
|
%F = 0:1/N_fft:Fe;
|
||
|
%perio = abs(fft(NRZ, N_fft)).^2/N_fft;
|
||
|
%semilogy(perio);
|
||
|
%periodogram(NRZ);
|
||
|
|
||
|
|
||
|
|
||
|
% Question 3.1.2.1
|
||
|
% on génère deux phases aléatoires pour les cosinus de x(t)
|
||
|
phi = 2*pi*rand(2, 1);
|
||
|
% on peut finalement créer X via l'équation (1)
|
||
|
X = (1-NRZ).*cos(2*pi*F0*T + phi(1)) + NRZ.*cos(2*pi*F1*T + phi(2));
|
||
|
|
||
|
%plot(T, X);
|
||
|
%xlabel("temps (s)");
|
||
|
%ylabel("X(t)");
|
||
|
|
||
|
% Question 3.1.2.4
|
||
|
%periodogram(X);
|
||
|
|
||
|
|
||
|
|
||
|
% Question 3.2
|
||
|
SNR = 10;
|
||
|
Px = mean(abs(X).^2);
|
||
|
Pb = Px / 10^(SNR/10); % d'après l'équation (2)
|
||
|
bruit = sqrt(Pb)*randn(1, length(X));
|
||
|
Xb = X + bruit;
|
||
|
|
||
|
%periodogram(Xb);
|
||
|
%plot(Xb);
|
||
|
%semilogy([0:N-1]/N*Fe, abs(fft(Xb, N)));
|
||
|
|
||
|
|
||
|
|
||
|
% on choisit 4000 Hz en fréquence de coupure car au milieu de F0 et F1
|
||
|
fc_tild = 1080/Fe;
|
||
|
% on choisit un ordre élevé pour être sûr que les fréquences indésirables soient filtrées
|
||
|
ordre = 100;
|
||
|
% on utilise ici un filtre RIF
|
||
|
A = 1;
|
||
|
% on génère B grâce à la transformé inverse d'une fonction porte
|
||
|
B = 2*fc_tild*sinc(2*fc_tild*[-ordre/2:1:ordre/2]);
|
||
|
% on rajoute des zeros après Xb pour contrer le retard créé par le filtrage
|
||
|
Xb = [Xb zeros(1, ordre/2)];
|
||
|
|
||
|
|
||
|
|
||
|
% Question 3.3.1 : Passe-bas
|
||
|
% on utilise la fonction filter de matlab
|
||
|
Xf_bas = filter(B, A, Xb);
|
||
|
% on supprime les premières valeurs pour ne plus avoir de retard.
|
||
|
Xf_bas = Xf_bas(ordre/2+1:length(Xb));
|
||
|
|
||
|
%plot(Xf);
|
||
|
|
||
|
%plot([0:N-1]/N*Fe, abs(fft(B, N)));
|
||
|
%legend("fft(B)");
|
||
|
%title("Filtre passe bas d'ordre 100");
|
||
|
%xlabel("Fréquence (Hz)");
|
||
|
%ylabel("Gain (dB)");
|
||
|
|
||
|
%plot([-ordre/2:1:ordre/2], B);
|
||
|
%plot(B)
|
||
|
%title("Coefficients de B pour un passe bas d'ordre 100");
|
||
|
%ylabel("B");
|
||
|
|
||
|
%semilogy([0:N-1]/N*Fe, abs(fft(Xb, N)));
|
||
|
%hold;
|
||
|
%semilogy([0:N-1]/N*Fe, abs(fft(Xf, N)));
|
||
|
%legend("Xb", "Xf\_bas");
|
||
|
%title("fft du signal avant et après filtrage");
|
||
|
%xlabel("Fréquence (Hz)");
|
||
|
%ylabel("Amplitude (dB)");
|
||
|
|
||
|
%periodogram(Xb);
|
||
|
%hold;
|
||
|
%periodogram(Xf);
|
||
|
%legend("Xb", "Xf\_bas");
|
||
|
%h = get(gca, 'Children');
|
||
|
%set(h(1), 'Color', [0.8500, 0.3250, 0.0980]);
|
||
|
%title("périodogramme avant et après filtrage");
|
||
|
|
||
|
|
||
|
|
||
|
% Question 3.3.2 : Passe-haut
|
||
|
% on modifie B pour passer d'un passe-bas à un passe-haut
|
||
|
B(ordre/2+1) = 1 - 2*fc_tild;
|
||
|
% on utilise la fonction filter de matlab
|
||
|
Xf_haut = filter(B, A, Xb);
|
||
|
% on supprime les premières valeurs pour ne plus avoir de retard.
|
||
|
Xf_haut = Xf_haut(ordre/2+1:length(Xb));
|
||
|
|
||
|
%plot(Xf);
|
||
|
|
||
|
%plot([0:N-1]/N*Fe, abs(fft(B, N)));
|
||
|
%legend("fft(B)");
|
||
|
%title("Filtre passe haut d'ordre 100");
|
||
|
%xlabel("Fréquence (Hz)");
|
||
|
%ylabel("Gain (dB)");
|
||
|
|
||
|
%plot([-ordre/2:1:ordre/2], B);
|
||
|
%plot(B)
|
||
|
%title("Coefficients de B pour un passe haut d'ordre 100");
|
||
|
%ylabel("B");
|
||
|
|
||
|
%semilogy([0:N-1]/N*Fe, abs(fft(Xb, N)));
|
||
|
%hold;
|
||
|
%semilogy([0:N-1]/N*Fe, abs(fft(Xf, N)));
|
||
|
%legend("Xb", "Xf\_haut");
|
||
|
%title("fft du signal avant et après filtrage");
|
||
|
%xlabel("Fréquence (Hz)");
|
||
|
%ylabel("Amplitude (dB)");
|
||
|
|
||
|
%periodogram(Xb);
|
||
|
%hold;
|
||
|
%periodogram(Xf);
|
||
|
%legend("Xb", "Xf\_haut");
|
||
|
%h = get(gca, 'Children');
|
||
|
%set(h(1), 'Color', [0.8500, 0.3250, 0.0980]);
|
||
|
%title("périodogramme avant et après filtrage");
|
||
|
|
||
|
|
||
|
|
||
|
% Question 3.3.5
|
||
|
K = 30; % déterminé expérimentalement
|
||
|
% on calcule l'énergie par groupes de taille Ns
|
||
|
somme = sum((reshape(Xf_bas, [Ns, length(bits)])).^2);
|
||
|
% on filtre les valeurs supérieures à K
|
||
|
result = (somme > K);
|
||
|
% on calcule le taux d'erreur avec les bits originaux
|
||
|
erreur = sum((bits - result).^2)/length(bits)
|
||
|
|
||
|
|
||
|
|
||
|
% Question 4.1
|
||
|
% On génère les deux branches différentes
|
||
|
branche_haut = sum(reshape(X.*cos(2*pi*F0*T + phi(1)), [Ns, length(bits)]));
|
||
|
branche_bas = sum(reshape(X.*cos(2*pi*F1*T + phi(2)), [Ns, length(bits)]));
|
||
|
% on somme les branches
|
||
|
somme = branche_bas - branche_haut;
|
||
|
% on filtre les valeurs positives et négatives
|
||
|
result = (somme > 0);
|
||
|
% on calcule le taux d'erreur avec les bits originaux
|
||
|
erreur = sum((bits - result).^2)/length(bits)
|
||
|
|
||
|
|
||
|
|
||
|
% Question 4.2
|
||
|
% On génère les quatre branches différentes
|
||
|
branche_1 = sum(reshape(X.*cos(2*pi*F0*T), [Ns, length(bits)])).^2;
|
||
|
branche_2 = sum(reshape(X.*sin(2*pi*F0*T), [Ns, length(bits)])).^2;
|
||
|
branche_3 = sum(reshape(X.*cos(2*pi*F1*T), [Ns, length(bits)])).^2;
|
||
|
branche_4 = sum(reshape(X.*sin(2*pi*F1*T), [Ns, length(bits)])).^2;
|
||
|
% on somme les branches
|
||
|
somme = branche_4 + branche_3 - branche_2 - branche_1;
|
||
|
% on filtre les valeurs positives et négatives
|
||
|
result = (somme > 0);
|
||
|
% on calcule le taux d'erreur avec les bits originaux
|
||
|
erreur = sum((bits - result).^2)/length(bits)
|
||
|
|
||
|
|
||
|
|
||
|
% on affiche l'image à partir des bits récupérés
|
||
|
%pcode reconstitution_image;
|
||
|
%reconstitution_image(result);
|
||
|
%which reconstitution_image;
|