%% Modulation et démodulation AM en MATLAB
% Ce script illustre la modulation d'amplitude avec
porteuse (DSB-LC)
% et deux méthodes de démodulation : cohérente
(synchrone) et par détection d'enveloppe.
% Paramètres modifiables pour explorer différents cas
(indice de modulation, fréquences).
clear; close all; clc;
%% Paramètres du système
fs = 50000; % Fréquence d'échantillonnage
(Hz)
T = 0.1; % Durée du signal (s)
t = 0:1/fs:T-1/fs; % Vecteur temps
N = length(t); % Nombre d'échantillons
% Signal modulant (message)
fm = 100; % Fréquence du message (Hz)
Am = 1; % Amplitude du message
m = Am * sin(2*pi*fm*t); % Signal modulant (sinusoïdal
pur)
% Porteuse
fc = 2000; % Fréquence porteuse (Hz)
Ac = 2; % Amplitude de la porteuse
% Indice de modulation (µ = Am / Ac pour éviter la
surmodulation)
mu = Am / Ac; % µ < 1 pour éviter la
surmodulation
fprintf('Indice de modulation : %.2f\n', mu);
%% Modulation AM (DSB-LC)
% Signal AM : s(t) = (Ac + m(t)) .* cos(2π fc t)
s_am = (Ac + m) .* cos(2*pi*fc*t);
%% Démodulation cohérente (synchrone)
% On multiplie par la porteuse locale (supposée
synchrone en phase et fréquence)
s_demod_coherent = s_am .* cos(2*pi*fc*t);
% Filtrage passe-bas pour récupérer le message
% Conception d'un filtre passe-bas de type Butterworth
f_cut = 500; % Fréquence de coupure (Hz) >
fm mais << fc
[b, a] = butter(5, f_cut/(fs/2), 'low'); % Filtre
d'ordre 5
m_rec_coherent = filter(b, a, s_demod_coherent);
% Compensation du gain (facteur 2 dû à la
multiplication, et suppression de la composante DC)
m_rec_coherent = 2 * m_rec_coherent -
mean(m_rec_coherent); % Ajustement
%% Démodulation par détection d'enveloppe (redressement
+ filtre passe-bas)
% Redressement (valeur absolue)
s_rect = abs(s_am);
% Filtrage passe-bas (même filtre que précédemment)
m_rec_envelope = filter(b, a, s_rect);
% Suppression de la composante continue et
normalisation
m_rec_envelope = m_rec_envelope - mean(m_rec_envelope);
m_rec_envelope = m_rec_envelope * (Am /
max(m_rec_envelope)); % Ajustement d'amplitude
%% Affichage des résultats
figure('Name', 'Modulation et démodulation AM');
% Signal modulant original
subplot(3,2,1);
plot(t, m);
xlabel('Temps (s)'); ylabel('Amplitude');
title('Signal modulant original m(t)');
xlim([0 0.02]); % Zoom pour voir les détails
% Porteuse
subplot(3,2,2);
plot(t, cos(2*pi*fc*t));
xlabel('Temps (s)'); ylabel('Amplitude');
title('Porteuse cos(2πfc t)');
xlim([0 0.002]);
% Signal AM modulé
subplot(3,2,3);
plot(t, s_am);
xlabel('Temps (s)'); ylabel('Amplitude');
title('Signal modulé AM');
xlim([0 0.02]);
% Signal démodulé cohérent
subplot(3,2,4);
plot(t, m_rec_coherent, 'r', t, m, 'b--');
xlabel('Temps (s)'); ylabel('Amplitude');
title('Démodulation cohérente');
legend('Reconstruit', 'Original');
xlim([0 0.02]);
% Signal démodulé par détection d'enveloppe
subplot(3,2,5);
plot(t, m_rec_envelope, 'g', t, m, 'b--');
xlabel('Temps (s)'); ylabel('Amplitude');
title('Détection d''enveloppe');
legend('Reconstruit', 'Original');
xlim([0 0.02]);
% Spectre du signal AM (pour visualisation)
subplot(3,2,6);
f = linspace(-fs/2, fs/2, N);
S_AM = fftshift(fft(s_am));
plot(f, abs(S_AM)/N);
xlabel('Fréquence (Hz)'); ylabel('Amplitude');
title('Spectre du signal AM');
xlim([-3000 3000]);
grid on;
%% Vérification de la qualité
% Calcul de l'erreur quadratique moyenne (EQM)
eqm_coherent = mean((m - m_rec_coherent).^2);
eqm_envelope = mean((m - m_rec_envelope).^2);
fprintf('EQM (démodulation cohérente) : %.4f\n',
eqm_coherent);
fprintf('EQM (détection d''enveloppe) : %.4f\n',
eqm_envelope);