commit ac17c3847970fbebf437bbd9fa7f3ed4f64e4bcc Author: Laureηt Date: Sun Sep 18 16:39:14 2022 +0200 feat: add files diff --git a/TEB_test.m b/TEB_test.m new file mode 100644 index 0000000..7450967 --- /dev/null +++ b/TEB_test.m @@ -0,0 +1,165 @@ +clear; +close all; + +Fe = 24000; % fréquence d'échantillonage (Hz) +Te = 1/Fe; % période d'échantillonage (s) +N = 100000; % nombre de bits envoyés +Rb = 3000; % débit binaire +Fp = 2000; % fréquence porteuse + +bits = [ 1 1 1 0 0 1 0 ]; +% bits = randi([0, 1], 1, N); % bits envoyés + +M = 2^1; % signal BPSK +Ts = log2(M)/Rb; % période symbole +Ns = floor(Ts/Te); +T = (0:N*Ns/log2(M)-1) * Te; % échelle temporelle + +alpha0 = 1; +alpha1 = 0.5; + +h = ones(1, Ns); % mise en forme: réponse impulsionnelle rectangulaire +h_c = [ alpha0 zeros(1, Ns-1) alpha1 ]; % propagation: sélectif +% h_c = [ 1 zeros(1, Ns-1) ]; % propagation: dirac +h_r = h; % réception: réponse impulsionnelle rectangulaire + +n0 = Ns; % déterminé en traçant le diagramme de l'oeil ou 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"); +axis square; + +%% 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é de x_e +figure; +stairs(X_c); +axis(axis*1.1); +title("Signal transmis"); +ylabel("Amplitude"); +for i=1:length(bits) + index = n0/2 + (i-1)*Ns; + text(index + 0.8, X_c(index), num2str(bits(i)), 'Color', '#7E2F8E'); +end + +%% diagramme de l'oeil +figure; +X_r = filter(h_r, 1, X_c); % signal reçu, sans bruit +oeil = reshape(X_r(Ns+1:end), Ns, length(X_r(Ns+1:end))/Ns); % permet de tracer le diagramme de l'oeil, on retrouve n0 = 8 +plot(oeil); +title("Diagramme de l'oeil"); +ylabel("Amplitude"); +axis square; + +%% tracé de x_r +figure; +plot(X_r); +axis(axis*1.1); +title("Signal reçu"); +ylabel("Amplitude"); + +%% réception +X_e = X_r( n0:Ns:length(bits)*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 + +%% tracé des constellations +figure; +plot(complex(X_e(2:end)), "*"); +hold; +plot(complex(X_m), ".", 'MarkerSize', 20); +axis(axis*1.1); +axis square; +title("Constellations"); +legend("canal sélectif", "canal dirac"); +xlabel("Re"); +ylabel("Im"); + +%% tracé de TEB = f(E_b/N_0) +bits = randi([0, 1], 1, N); % bits envoyés +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 + +P_x = mean(abs(X_c).^2); % puissance du signal en entrée de la reception +EbN0_db = linspace(0, 10, 200); +EbN0 = 10.^(EbN0_db./10); +TEBs = []; +for e=EbN0 + sigma2_x = P_x * Ns / (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:length(bits)*Ns/log2(M) ); % échantillonage du signal reçu + + recu = double( X_e > 0 ); % on récupère les bits, décision + "démapping" + TEB = mean((recu - bits).^2); % on calcule l'erreur binaire + + TEBs = [ TEBs TEB ]; +end + +TEB_theorique = 1/2*qfunc(3/2*sqrt(4/5*EbN0)) + 1/2*qfunc(1/2*sqrt(4/5*EbN0)); +% TEB_theorique = qfunc(sqrt(EbN0)); + + close all; + +figure; +semilogy(EbN0_db, TEBs, '+'); +hold; +plot(EbN0_db, TEB_theorique); +title("TEB $$= f(E_b/N_0)$$", 'interpreter','latex'); +xlabel("$$E_b/N_0$$ (dB)", 'interpreter','latex'); +ylabel("TEB", 'interpreter','latex'); +legend("TEB numérique", "TEB théorique (canal selectif)"); + +%% tracé de constellations bruitées + +EbN0_db = linspace(0, 12, 4); +EbN0 = 10.^(EbN0_db./10); +for e=EbN0 + sigma2_x = P_x * Ns / (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:length(bits)*Ns/log2(M) ); % échantillonage du signal reçu + + recu = double( X_e > 0 ); % on récupère les bits, décision + "démapping" + TEB = mean((recu - bits).^2); % on calcule l'erreur binaire + + close all; + figure; + + sp1 = subplot(2, 1, 1); + histogram(X_e, 100); + xlim([-40 40]); + xlabel("Re"); + title("Histogramme, $$E_b/N_0 =$$ " + num2str(10*log10(e)) +"dB", 'interpreter','latex'); + + sp2 = subplot(2, 1, 2); + plot(complex(X_e(2:10:end)), "*"); + hold; + plot(complex(X_m), ".", 'MarkerSize', 20); + xlim([-40 40]); + title("Constellations, $$E_b/N_0 =$$ " + num2str(10*log10(e)) +"dB", 'interpreter','latex'); + legend("symboles bruités", "symboles théoriques"); + xlabel("Re"); + ylabel("Im"); + + sp2.Position(4) = 0.1; + sp1.Position(2) = 0.28; + sp1.Position(4) = 0.68; + + pause(1); + print(gcf,"histcons_selectif_" + num2str(10*log10(e)) + "db.png", '-dpng', '-r300'); + +end diff --git a/dessins.m b/dessins.m new file mode 100644 index 0000000..3666951 --- /dev/null +++ b/dessins.m @@ -0,0 +1,97 @@ +clear; +close all; + +Fe = 24000; % fréquence d'échantillonage (Hz) +Te = 1/Fe; % période d'échantillonage (s) +N = 10000; % nombre de bits envoyés +Rb = 3000; % débit binaire + +M = 2^1; % signal BPSK +Ts = log2(M)/Rb; % période symbole +Ns = floor(Ts/Te); +T = (0:N*Ns/log2(M)-1) * Te; % échelle temporelle + +alpha0 = 1; +alpha1 = 0.5; + +n0 = Ns; + +%% deux rectangles +figure; +LOS = ones(1, Ns); +multipath = ones(1, Ns)/2; +stairs(0:2*Ns-1, [LOS, multipath]); +ylim([0 1.1]); +xlim([0 2*Ns]); +title("h_e"); + +%% construction du signal avec les g +alpha0 = 1; +alpha1 = 0.5; +h = ones(1, Ns); % mise en forme: réponse impulsionnelle rectangulaire +h_c = [ alpha0 zeros(1, Ns-1) alpha1 ]; % propagation: sélectif +%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 + +bits = [ 1 1 1 0 0 1 0 ]; % bits envoyés +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çu, sans bruit + +figure; +hold; +somme = zeros(1, length(g)+Ns*(length(bits)-1)); +for i=0:length(bits)-1 + somme = somme + [zeros(1, i*Ns) g*sign(X_m(i+1)) zeros(1, (length(bits)-i-1)*Ns) ]; + plot( [zeros(1, i*Ns) g*sign(X_m(i+1)) zeros(1, (length(bits)-i-1)*Ns) ], '--'); + text(Ns*(i+1) + 0, X_m(i+1), num2str(bits(i+1)), 'Color', '#7E2F8E'); +end +plot(somme, 'LineWidth', 2); +legend('g(t - 0*Ns)', 'g(t - 1*Ns)', 'g(t - 2*Ns)', 'g(t - 3*Ns)', 'g(t - 4*Ns)', 'g(t - 5*Ns)', 'g(t - 6*Ns)', 'somme'); + +%% construction de z + +alpha0 = 1; +alpha1 = 0.5; +h = ones(1, Ns); % mise en forme: réponse impulsionnelle rectangulaire +h_c = [ alpha0 zeros(1, Ns-1) alpha1 ]; % propagation: sélectif +%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 + +bits = [ 1 0 0 0 0 0 0 ]; % bits envoyés +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çu, sans bruit + +figure; +hold; +somme = zeros(1, length(g)+Ns*(length(bits)-1)); +for i=0:length(bits)-1 + somme = somme + [zeros(1, i*Ns) g*sign(X_m(i+1)) zeros(1, (length(bits)-i-1)*Ns) ]; + plot( [zeros(1, i*Ns) g*sign(X_m(i+1)) zeros(1, (length(bits)-i-1)*Ns) ], '--'); + text(Ns*(i+1) + 0, X_m(i+1), num2str(bits(i+1)), 'Color', '#7E2F8E'); +end +plot(somme); + +%% quatres gaussiennes +T = -20:0.1:20; +sigma_w = sqrt(Ns); +g1 = gaussmf(T, [sigma_w -3*Ns/2]); +g2 = gaussmf(T, [sigma_w -Ns/2]); +g3 = gaussmf(T, [sigma_w Ns/2]); +g4 = gaussmf(T, [sigma_w 3*Ns/2]); + +hold on; +plot(T, g1); +plot(T, g2); +plot(T, g3); +plot(T, g4); + +legend("$$-\alpha_0-\alpha_1$$", "$$-\alpha_0+\alpha_1$$", "$$+\alpha_0-\alpha_1$$", "$$+\alpha_0+\alpha_1$$", 'interpreter','latex'); + diff --git a/egalisation.m b/egalisation.m new file mode 100644 index 0000000..4b52c9e --- /dev/null +++ b/egalisation.m @@ -0,0 +1,222 @@ +clear; +close all; + +Fe = 24000; % fréquence d'échantillonage (Hz) +Te = 1/Fe; % période d'échantillonage (s) +N = 10000; % nombre de bits envoyés +Rb = 3000; % débit binaire + +zero_pad = 2^12; + +M = 2^1; % signal BPSK +Ts = log2(M)/Rb; % période symbole +Ns = floor(Ts/Te); +T = (0:N*Ns/log2(M)-1) * Te; % échelle temporelle + +alpha0 = 1; +alpha1 = 0.5; + +h = ones(1, Ns); % mise en forme: réponse impulsionnelle rectangulaire +h_c = [ alpha0 zeros(1, Ns-1) alpha1 ]; % propagation: sélectif +h_r = h; % réception: réponse impulsionnelle rectangulaire + +n0 = Ns; % déterminé en traçant le diagramme de l'oeil ou g + +%% création de Z et C +ordre = 10; +K = ordre; + +bits = [ 1 zeros(1, ordre-1) ]; % dirac +X_k = kron(bits, [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çu, sans bruit +X_e = X_r( n0 : Ns : length(bits)*Ns ); % échantillonage du signal reçu + +Z = zeros(K, ordre); +for i=1:ordre + Z(i:end, i) = X_e(1:K-i+1); +end + +Y_0 = [ 1 zeros(1, ordre-1) ]'; +C = Z \ Y_0; + +%% tracés réponses en fréquence + +X_eg = filter(C, 1, X_e); + +g = conv(conv(h, h_c), h_r); % chaine globale + +figure; +plot(abs(fft(C, zero_pad))); +title("C"); + +figure; +plot(abs(fft(g, zero_pad))); +title("G"); + +figure; +plot(abs(fft(g, zero_pad).*fft(C', zero_pad))); +title("G \times C"); + +figure; +plot( ifft( abs(fft(g, zero_pad).*fft(C', zero_pad)) )); +title("g * c"); + +%% tracés réponses impulsionnelles +bits = [ 1 zeros(1, N-1) ]; +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çu, sans bruit +X_e = X_r( n0 : Ns : length(bits)*Ns ); % échantillonage du signal reçu +X_eg = filter(C, 1, X_e); % égaliseur ZFE + +figure; +tiledlayout(3,1); + +ax1 = nexttile; +stairs(bits); +legend("Dirac"); + +ax2 = nexttile; +plot(X_e); +legend("Réponse impulsionnel non égalisée"); + +ax3 = nexttile; +plot(X_eg); +legend("Réponse impulsionnel égalisée"); + +linkaxes([ax1 ax2 ax3], 'xy'); +axis( axis + [-1 1 -1 1]/5 ); +axis + +%% constellations +bits = randi([0, 1], 1, N); % bits envoyés +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çu, sans bruit +X_e = X_r( n0 : Ns : length(bits)*Ns ); % échantillonage du signal reçu +X_eg = filter(C, 1, X_e); % égaliseur ZFE + +figure; +tiledlayout(3,1); + +ax1 = nexttile; +plot(complex(X_m), ".", 'MarkerSize', 20); +symbols = unique(X_m(2:end)); +for i=1:length(symbols) + text(symbols(i), 0.1, num2str(bits(find(X_m == symbols(i), 1))), 'Color', '#7E2F8E'); +end +xlabel("Re"); +ylabel("Im"); +legend("Symboles théoriques"); +grid; + +ax2 = nexttile; +plot(complex(X_e(2:end)), ".", 'MarkerSize', 20); +symbols = unique(X_e(2:end)); +for i=1:length(symbols) + text(symbols(i), 0.1, num2str(bits(find(X_e == symbols(i), 1))), 'Color', '#7E2F8E'); +end +xlabel("Re"); +ylabel("Im"); +legend("Symboles reçus"); +grid; + +ax3 = nexttile; +plot(complex(X_eg(2:end)), ".", 'MarkerSize', 20); +symbols = unique(X_eg(2:end)); +for i=1:length(symbols) + text(symbols(i), 0.1, num2str(bits(find(X_eg == symbols(i), 1))), 'Color', '#7E2F8E'); +end +xlabel("Re"); +ylabel("Im"); +legend("Symboles égalisés"); +grid; + +linkaxes([ax1 ax2 ax3], 'xy'); + +%% tracé de constellations bruitées + +P_x = mean(abs(X_c).^2); % puissance du signal en entrée de la reception +EbN0_db = linspace(0, 12, 4); +EbN0 = 10.^(EbN0_db./10); +for e=EbN0 + sigma2_x = P_x * Ns / (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:length(bits)*Ns/log2(M) ); % échantillonage du signal reçu + + X_eg = filter(C, 1, X_e); % égaliseur ZFE + recu = double( X_eg > 0 ); % on récupère les bits, décision + "démapping" + + close all; + figure; + + sp1 = subplot(2, 1, 1); + histogram(X_eg, 100); + xlim([-4 4]); + xlabel("Re"); + title("Histogramme, $$E_b/N_0 =$$ " + num2str(10*log10(e)) +"dB", 'interpreter','latex'); + + sp2 = subplot(2, 1, 2); + plot(complex(X_eg(2:10:end)), "*"); + hold; + plot(complex(X_m), ".", 'MarkerSize', 20); + xlim([-4 4]); + title("Constellations, $$E_b/N_0 =$$ " + num2str(10*log10(e)) +"dB", 'interpreter','latex'); + legend("symboles bruités", "symboles théoriques"); + xlabel("Re"); + ylabel("Im"); + + sp2.Position(4) = 0.1; + sp1.Position(2) = 0.28; + sp1.Position(4) = 0.68; + + pause(1); + print(gcf,"histcons_egalise_" + num2str(10*log10(e)) + "db.png", '-dpng', '-r300'); + +end + +%% tracé de TEB = f(E_b/N_0) +N = 100000; % nombre de bits envoyés +bits = randi([0, 1], 1, N); % bits envoyés +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 + +P_x = mean(abs(X_c).^2); % puissance du signal en entrée de la reception +EbN0_db = linspace(0, 10, 200); +EbN0 = 10.^(EbN0_db./10); +TEBs = []; +for e=EbN0 + sigma2_x = P_x * Ns / (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:length(bits)*Ns/log2(M) ); % échantillonage du signal reçu + X_eg = filter(C, 1, X_e); % égaliseur ZFE + + recu = double( X_eg > 0 ); % on récupère les bits, décision + "démapping" + TEB = mean((recu - bits).^2); % on calcule l'erreur binaire + + TEBs = [ TEBs TEB ]; +end + +TEB_theorique = qfunc(sqrt(EbN0)); + +close all; + +figure; +semilogy(EbN0_db, TEBs, '+'); +hold; +plot(EbN0_db, TEB_theorique); +title("TEB $$= f(E_b/N_0)$$", 'interpreter','latex'); +xlabel("$$E_b/N_0$$ (dB)", 'interpreter','latex'); +ylabel("TEB", 'interpreter','latex'); +legend("TEB numérique", "TEB théorique (canal dirac)"); \ No newline at end of file diff --git a/oeil_g_trace_constellation.m b/oeil_g_trace_constellation.m new file mode 100644 index 0000000..c1f513f --- /dev/null +++ b/oeil_g_trace_constellation.m @@ -0,0 +1,84 @@ +clear; +close all; + +Fe = 24000; % fréquence d'échantillonage (Hz) +Te = 1/Fe; % période d'échantillonage (s) +N = 10000; % nombre de bits envoyés +Rb = 3000; % débit binaire +Fp = 2000; % fréquence porteuse + +bits = [ 1 1 1 0 0 1 0 ]; +% bits = randi([0, 1], 1, N); % bits envoyés + +M = 2^1; % signal BPSK +Ts = log2(M)/Rb; % période symbole +Ns = floor(Ts/Te); +T = (0:N*Ns/log2(M)-1) * Te; % échelle temporelle + +alpha0 = 1; +alpha1 = 0.5; + +h = ones(1, Ns); % mise en forme: réponse impulsionnelle rectangulaire +h_c = [ alpha0 zeros(1, Ns-1) alpha1 ]; % propagation: sélectif +% h_c = [ 1 zeros(1, Ns-1) ]; % propagation: dirac +h_r = h; % réception: réponse impulsionnelle rectangulaire + +n0 = Ns; % déterminé en traçant le diagramme de l'oeil ou 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"); +axis square; + +%% 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é de x_e +figure; +stairs(X_c); +axis(axis*1.1); +title("Signal transmis"); +ylabel("Amplitude"); +for i=1:length(bits) + index = n0/2 + (i-1)*Ns; + text(index + 0.8, X_c(index), num2str(bits(i)), 'Color', '#7E2F8E'); +end + +%% diagramme de l'oeil +figure; +X_r = filter(h_r, 1, X_c); % signal reçu, sans bruit +oeil = reshape(X_r(Ns+1:end), Ns, length(X_r(Ns+1:end))/Ns); % permet de tracer le diagramme de l'oeil, on retrouve n0 = 8 +plot(oeil); +title("Diagramme de l'oeil"); +ylabel("Amplitude"); +axis square; + +%% tracé de x_r +figure; +plot(X_r); +axis(axis*1.1); +title("Signal reçu"); +ylabel("Amplitude"); + +%% réception +X_e = X_r( n0:Ns:length(bits)*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 + +%% tracé des constellations +figure; +plot(complex(X_m), ".", 'MarkerSize', 20); +hold; +plot(complex(X_e(2:end)), "*"); +axis(axis*1.1); +title("Constellations"); +legend("canal dirac", "canal sélectif"); +xlabel("Re"); +ylabel("Im"); diff --git a/q2_2_4.m b/q2_2_4.m new file mode 100644 index 0000000..fce43ea --- /dev/null +++ b/q2_2_4.m @@ -0,0 +1,85 @@ +clear; +close all; + +Fe = 24000; % fréquence d'échantillonage (Hz) +Te = 1/Fe; % période d'échantillonage (s) +N = 50000; % nombre de bits envoyés +Rb = 3000; % débit binaire +Fp = 2000; % fréquence porteuse + +% bits = [ 1 1 1 0 0 1 0 ]; +bits = randi([0, 1], 1, N); % bits envoyés + +M = 2^1; % signal BPSK +Ts = log2(M)/Rb; % période symbole +Ns = floor(Ts/Te); +T = (0:N*Ns/log2(M)-1) * Te; % échelle temporelle + +alpha0 = 1; +alpha1 = 0.5; + +h = ones(1, Ns); % mise en forme: réponse impulsionnelle rectangulaire +h_c = [ alpha0 zeros(1, Ns-1) alpha1 ]; % propagation: sélectif +% h_c = [ 1 zeros(1, Ns-1) ]; % propagation: dirac +h_r = h; % réception: réponse impulsionnelle rectangulaire + +n0 = Ns; % déterminé en traçant le diagramme de l'oeil ou 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é de X_c +% figure; +% stairs(X_c); +% axis(axis*1.1); + +%% diagramme de l'oeil +figure; +X_r = filter(h_r, 1, X_c); % signal reçu, sans bruit +oeil = reshape(X_r(Ns+1:end), Ns, length(X_r(Ns+1:end))/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"); + +%% tracé de TEB = f(E_b/N_0) +P_x = mean(abs(X_c).^2); +EbN0_db = linspace(0, 10, 200); +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:length(bits)*Ns/log2(M) ); % échantillonage du signal reçu + + recu = double( X_e > 0 ); % on récupère les bits, décision + "démapping" + TEB = mean((recu - bits).^2); % on calcule l'erreur binaire + + TEBs = [ TEBs TEB ]; + +end + +bidule = sqrt ( EbN0 / 2 ); +TEB_theorique = 1/2*qfunc(3 * bidule) + 1/2*qfunc(bidule); + +figure; +semilogy(EbN0_db, TEBs, '+'); +hold; +plot(EbN0_db, TEB_theorique); +title("TEB $$= f(E_b/N_0)$$", 'interpreter','latex'); +xlabel("$$E_b/N_0$$ (dB)", 'interpreter','latex'); +ylabel("TEB", 'interpreter','latex'); diff --git a/q3_2_2_a.m b/q3_2_2_a.m new file mode 100644 index 0000000..5eff3a7 --- /dev/null +++ b/q3_2_2_a.m @@ -0,0 +1,123 @@ +clear; +close all; + +Fe = 24000; % fréquence d'échantillonage (Hz) +Te = 1/Fe; % période d'échantillonage (s) +N = 50000; % nombre de bits envoyés (bit) +Rb = 3000; % débit binaire (bit/s) + +% bits = [ 1 1 1 0 0 1 0 ]; + +M = 2^1; % signal BPSK +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) 0.5 ]; % propagation: sélectif +h_r = h; % réception: réponse impulsionnelle rectangulaire + +n0 = Ns; % déterminé en traçant le diagramme de l'oeil ou g + +%% création de Z et C + +ordre = 10; +K = ordre; + +bits = [ 1 zeros(1, ordre-1) ]; % dirac +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çu, sans bruit +X_e = X_r( n0:Ns:length(bits)*Ns ); % échantillonage du signal reçu + +Z = zeros(K, ordre); +for i=1:ordre + Z(i:end, i) = X_e(1:K-i+1); +end + +Y_0 = [ 1 zeros(1, ordre-1) ]'; +C = Z \ Y_0; + +%% tracé de X_c +% figure; +% plot(X_e); +% axis(axis*1.1); +% title("non égalisé"); + +%% tracé de X_egal + +% X_egal = filter(C, 1, X_e); + +% figure; +% plot(X_egal); +% axis(axis*1.1); +% title("égalisé"); + +%% tracé de g et g_eg + +g = conv(conv(h, h_c), h_r); +g_eg = conv(g, C); + +figure; +plot(abs(fft(g, 4096))); +figure; +plot(abs(fft(g_eg, 4096))); + +%% tracé de g et g_eg + +% figure; +% plot(g); +% figure; +% plot(g_eg); + +%% tracé de TEB = f(E_b/N_0) + +bits = randi([0, 1], 1, N); % bits envoyés +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 + +P_x = mean(abs(X_c).^2); +EbN0_db = linspace(0, 10, 200); +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_eg = filter(C, 1, X_b); % égalisation ZFE + X_r = filter(h_r, 1, X_eg); % signal reçu + + X_e = X_r( n0:Ns:length(bits)*Ns/log2(M) ); % échantillonage du signal reçu + + recu = double( X_e > 0 ); % on récupère les bits, décision + "démapping" + TEB = mean((recu - bits).^2); % on calcule l'erreur binaire + + TEBs = [ TEBs TEB ]; + +end + +bidule = sqrt ( EbN0 / 2 ); +TEB_theorique = 1/2*qfunc(3 * bidule) + 1/2*qfunc(bidule); + +figure; +semilogy(EbN0_db, TEBs, '+'); +hold; +plot(EbN0_db, TEB_theorique); +title("TEB $$= f(E_b/N_0)$$", 'interpreter','latex'); +xlabel("$$E_b/N_0$$ (dB)", 'interpreter','latex'); +ylabel("TEB", 'interpreter','latex'); + +%% tracé des constellations + +figure; +plot(complex(X_m), '.', 'MarkerSize', 25); +hold; +plot(complex(X_e), '+'); +plot(complex(X_eg), '*'); +axis([-2 2 -1 1]); +legend("symboles", "non égalisé", "égalisé"); \ No newline at end of file diff --git a/rapport.pdf b/rapport.pdf new file mode 100644 index 0000000..5ed4453 Binary files /dev/null and b/rapport.pdf differ diff --git a/reponse_impsulsionnelle.m b/reponse_impsulsionnelle.m new file mode 100644 index 0000000..bb3b206 --- /dev/null +++ b/reponse_impsulsionnelle.m @@ -0,0 +1,87 @@ +clear; +close all; + +Fe = 24000; % fréquence d'échantillonage (Hz) +Te = 1/Fe; % période d'échantillonage (s) +N = 10; % nombre de bits envoyés +Rb = 3000; % débit binaire + +M = 2^1; % signal BPSK +Ts = log2(M)/Rb; % période symbole +Ns = floor(Ts/Te); +T = (0:N*Ns/log2(M)-1) * Te; % échelle temporelle + +alpha0 = 1; +alpha1 = 0.5; + +h = ones(1, Ns); % mise en forme: réponse impulsionnelle rectangulaire +h_c = [ alpha0 zeros(1, Ns-1) alpha1 ]; % propagation: sélectif +h_r = h; % réception: réponse impulsionnelle rectangulaire + +n0 = Ns; % déterminé en traçant le diagramme de l'oeil ou g + +%% création de Z et C + +ordre = 10; +K = ordre; + +bits = [ 1 zeros(1, ordre-1) ]; % dirac +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çu, sans bruit +X_e = X_r( n0 : Ns : length(bits)*Ns ); % échantillonage du signal reçu + +Z = zeros(K, ordre); +for i=1:ordre + Z(i:end, i) = X_e(1:K-i+1); +end + +Y_0 = [ 1 zeros(1, ordre-1) ]'; +C = Z \ Y_0; + +X_eg = filter(C, 1, X_e); + +g = conv(conv(h, h_c), h_r); % chaine globale + +% figure; +% plot(g); +% hold; +% plot(g_eg); + +% figure; +% plot(abs(fft(C, 2^10))); +% title("C"); +% figure; +% plot(abs(fft(g, 2^10))); +% title("g"); +% figure; +% plot(abs(fft(g, 2^10).*fft(C', 2^10))); +% title("g \times C"); + +%% tracé d'une réponse impulsionnelle + +bits = [ 1 zeros(1, N-1) ]; +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çu, sans bruit +X_e = X_r( n0 : Ns : length(bits)*Ns ); % échantillonage du signal reçu +X_eg = filter(C, 1, X_e); % égaliseur ZFE + +figure; +stairs(X_m); +title("X_m"); +axis([1 10 -1.1 1.1]); + +figure; +plot(X_e); +title("X_e"); +saveaxis = axis; +figure; + +plot(X_eg); +title("X_{eg}"); +axis(saveaxis); \ No newline at end of file